package com.zcloud.fire.check.domain.enums;

import lombok.Getter;

import java.util.*;
import java.util.stream.Collectors;

/**
 * corp_info 中的type字段枚举(0-普通企业，1-集团单位，2-股份单位，3-相关方企业，4-货主单位，5-驻港单位)
 * 与传入enterpriseType中的关联关系
 * .企业类型1：监管 2：企业 3：相关方
 */
@Getter
public enum CorpTypeEnum {
    OrdinaryEnterprises(0,"普通企业",UserTypeEnum.QY.getCode()),
    groupUnits(1, "集团单位",UserTypeEnum.QY.getCode()),
    share(2,"股份单位",UserTypeEnum.JG.getCode()),
    serviceProvider(3, "相关方企业",UserTypeEnum.XGF.getCode()),
    cargoOwner(4, "货主单位",UserTypeEnum.XGF.getCode()),
    portUnit(5, "驻港单位",UserTypeEnum.XGF.getCode()),
    materialCenter(6, "物资中心",UserTypeEnum.QY.getCode());

    private static final Map<Integer, List<Integer>> ENTERPRISE_TYPE_CODE_MAP = new HashMap<>();

    private final Integer code;
    private final String name;
    //传入的企业类型企业类型 1：监管 2：企业 3：相关方
    private final Integer userType;

    CorpTypeEnum(Integer code, String name, Integer userType) {
        this.code = code;
        this.name = name;
        this.userType = userType;
    }
    static {
        Arrays.stream(CorpTypeEnum.values())
                .collect(Collectors.groupingBy(CorpTypeEnum::getUserType))
                .forEach((userType, corpTypes) ->
                        ENTERPRISE_TYPE_CODE_MAP.put(
                                userType,
                                corpTypes.stream().map(CorpTypeEnum::getCode).collect(Collectors.toList())
                        )
                );
    }

    public static List<Integer> getCodesByEnterpriseType(Integer enterpriseType) {
        return ENTERPRISE_TYPE_CODE_MAP.getOrDefault(enterpriseType, Collections.emptyList());
    }
    public static Integer getUserTypeByCode(Integer code) {
        for (CorpTypeEnum corpType : values()) {
            if (corpType.code.equals(code)) {
                return corpType.userType;
            }
        }
        return null;
    }

    public static String getNameByCode(Integer code) {
        for (CorpTypeEnum corpType : values()) {
            if (corpType.code.equals(code)) {
                return corpType.name;
            }
        }
        return null;
    }
}
