package cn.iocoder.yudao.module.order.enums;

import cn.hutool.core.util.ArrayUtil;
import lombok.AllArgsConstructor;
import lombok.Getter;

import java.util.Arrays;
import java.util.Collections;
import java.util.List;

@AllArgsConstructor
@Getter
public enum OrderApprovalTypeEnum {
    DISCOUNT_APPLY(1, "优惠申请", Arrays.asList(2, 6, 11, 14, 23, 28, 31, 32)),// 管理优惠（当前商品有在途申请）/拆单申请/合单申请/订单修改/退仓/撤销拆单审批/批量优惠申请（当前商品有在途申请）/批量管理折扣申请（当前商品有在途申请）
    ADMIN_DISCOUNT(2, "管理优惠", Arrays.asList(1, 6, 11, 14, 23, 28, 31, 32)), // 拆单申请/合单申请/订单修改/退仓/撤销拆单审批/批量优惠申请（当前商品有在途申请）/批量管理折扣申请（当前商品有在途申请）/优惠申请（当前商品有在途申请）
    COMMISSION_SET(3, "佣金设置", Arrays.asList(6, 11, 14, 23, 28)), // 拆单申请/合单申请/订单修改/退仓/撤销拆单审批
    WEIGHT_DISCOUNT(4, "重货优惠", Arrays.asList(6, 11, 14, 22, 23, 28)), // 拆单申请/合单申请/订单修改/入仓修改/退仓/撤销拆单审批
    BUBBLE_DISCOUNT(5, "泡货优惠", Arrays.asList(6, 11, 14, 22, 23, 28, 29)), // 拆单申请/合单申请/订单修改/入仓修改/退仓/撤销拆单审批/泡重特价优惠
    ORDER_SPLIT(6, "拆单", Collections.singletonList(-1)), // 全部互斥，订单无任何在途审批才可以申请
    ORDER_CARGO_CONTROL_PICK_UPDATE(7, "控货订单放货修改", null), // 无限制
    ORDER_CARGO_CONTROL_PICK_ANTI_CHECKING(8, "控货订单反复核", null), // 无限制
    seasoning_condiments(9, "调货", null), // 无限制
    order_cargo_control_cancel_pick(10, "取消放货", null), // 无限制
    merge_order(11, "合单", Collections.singletonList(-1)), // 全部互斥，订单无任何在途审批才可以申请
    expense_apply(12, "费用申请", Arrays.asList(6, 11, 28)), // 拆单申请/合单申请/撤销拆单审批
    WAREHOUSE_ADJUST(13, "调仓", Arrays.asList(6, 11, 14, 22, 23, 28)), // 拆单申请/合单申请/订单修改/入仓修改/退仓/撤销拆单审批
    ORDER_UPDATE(14, "订单修改", Arrays.asList(1, 2, 3, 4, 5, 6, 11, 23, 28, 31, 32)), // 拆单申请/合单申请/优惠申请/管理优惠/重货优惠/泡货优惠/退仓/佣金设置
    pre_install(18, "预装审核", Arrays.asList(6, 11, 13, 14, 22, 23, 28)), // 自编号全部申请互斥，跟原本一致，不修改，自编号下订单除拆单申请/合单申请/调仓申请/订单修改/入仓申请/退仓申请外，其他申请不受限制，允许订单预装
    closure(19, "封柜审核", null), // 自编号全部申请互斥，跟原本一致，不修改
    unloading_cabinet(20, "卸柜审核", null), // 自编号全部申请互斥，跟原本一致，不修改
    WAREHOUSE_UPDATE(22, "入仓修改", Arrays.asList(6, 11, 23, 28)), // 拆单申请/合单申请/退仓
    WAREHOUSE_ROLLBACK(23, "退仓", Collections.singletonList(-1)), // 全部互斥，订单无任何在途审批才可以申请

    pre_install_back(24, "预装反审", null), // 自编号全部申请互斥，跟原本一致，不修改, 自编号下订单任何申请不受限制
    closure_back(25, "封柜反审", null), // 自编号全部申请互斥，跟原本一致，不修改, 自编号下订单任何申请不受限制
    unloading_cabinet_back(26, "卸柜反审", null), // 自编号全部申请互斥，跟原本一致，不修改, 自编号下订单任何申请不受限制
    customs_exit(27, "报关审批", null), // 自编号全部申请互斥，跟原本一致，不修改, 自编号下订单任何申请不受限制
    ORDER_SPLIT_REVOKE(28, "撤销订单拆单", Collections.singletonList(-1)), // 全部互斥，订单无任何在途审批才可以申请
    BUBBLE_WEIGHT_SPECIAL_DISCOUNT(29, "泡重特价优惠", Arrays.asList(5, 6, 11, 14, 22, 23, 28)), // 拆单申请/合单申请/订单修改/入仓修改/退仓/撤销拆单审批/泡货优惠

    DISCOUNT_APPLY_BATCH(31, "批量优惠申请", Arrays.asList(1, 2, 6, 11, 14, 23, 28, 32)), // 拆单申请/合单申请/订单修改/退仓/撤销拆单审批/优惠申请（当前商品有在途申请）/批量管理折扣申请（当前商品有在途申请）/管理优惠（当前商品有在途申请）
    ADMIN_DISCOUNT_BATCH(32, "批量管理折扣申请", Arrays.asList(1, 2, 6, 11, 14, 23, 28, 31)), // 拆单申请/合单申请/订单修改/退仓/撤销拆单审批/优惠申请（当前商品有在途申请）/批量优惠申请（当前商品有在途申请）/管理优惠（当前商品有在途申请）
    expense_apply_BATCH(41, "批量费用申请", Arrays.asList(6, 11, 28)), // 拆单申请/合单申请/撤销拆单审批
    //分拣
    sorting(50, "分拣审批", Arrays.asList(6, 11, 13, 14, 22, 23, 28)), // 自编号全部申请互斥，跟原本一致，不修改, 自编号下订单除拆单申请/合单申请/调仓申请/订单修改/入仓申请/退仓申请外，其他申请不受限制，允许封柜反审批

    //分拣反审
    sorting_back(51, "分拣反审", null), // 自编号全部申请互斥，跟原本一致，不修改,自编号下订单任何申请不受限制

    //到仓
    warehoused(52, "到仓审批", null), // 自编号全部申请互斥，跟原本一致，不修改,自编号下订单任何申请不受限制

    //到仓反审
    warehoused_back(53, "到仓反审", null), // 自编号全部申请互斥，跟原本一致，不修改,自编号下订单任何申请不受限制
    // 出货
    shipment(54, "出货审批", null), // 自编号全部申请互斥，跟原本一致，不修改,自编号下订单任何申请不受限制
    // 出货反审
    shipment_back(55, "出货反审", null), // 自编号全部申请互斥，跟原本一致，不修改,自编号下订单任何申请不受限制
    // 撤销清关
    clearance_back(56, "撤销清关", null), // 自编号全部申请互斥，跟原本一致，不修改,自编号下订单任何申请不受限制

    //收货人限制修改
    CONSIGNEE_LIMIT_UPDATE(61, "收货人限制修改", Arrays.asList(6, 11, 14, 23, 28)), // 拆单申请/合单申请/订单修改/退仓/撤销拆单审批

    //海外仓修改
    OVERSEAS_WAREHOUSE_UPDATE(62, "海外仓修改", Arrays.asList(6, 11, 14, 23, 28)), // 拆单申请/合单申请/订单修改/退仓/撤销拆单审批

    ;

    public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(OrderApprovalTypeEnum::getValue).toArray();
    /**
     * 类型
     */
    private final Integer value;
    /**
     * 类型名
     */
    private final String name;
    /**
     * 互斥审批类型
     */
    private final List<Integer> mutualExclusionValues;

    public static OrderApprovalTypeEnum valueOf(Integer value) {
        return ArrayUtil.firstMatch(orderApprovalType -> orderApprovalType.getValue().equals(value), OrderApprovalTypeEnum.values());
    }

}
