package cn.ey.biz.module.system.enums.category;

import lombok.AllArgsConstructor;
import lombok.Getter;

import java.util.Arrays;
import java.util.Collections;
import java.util.HashSet;
import java.util.Set;


/**
 * 独立字典分类枚举值
 * 与表system_category  category_code mapping
 */
@Getter
@AllArgsConstructor
public enum CategoryCodeEnum {

    /**
     * 个人组织架构（行政组织表）
     **/
    ORGANIZATION("Organization"),
    /**
     * 法律实体
     **/
    LEGAL_ENTITY("LegalEntity"),
    /**
     * 假期类型
     **/
    HOLIDAY_TYPE("HolidayType"),
    /**
     * 公共假期
     **/
    PUBLIC_HOLIDAY("PublicHoliday"),
    /**
     * 区域公共假期关系
     **/
    REGION_PUBLIC("RegionPublic"),
    /**
     * 工作地址
     **/
    WORK_LOCATION("WorkLocation"),
    /**
     * 地区
     **/
    AREA("Area"),
    /**
     * 城市
     **/
    CITY("City"),
    /**
     * 国家
     **/
    COUNTRY("Country"),
    /**
     * 办公地点
     **/
    OFFICE("Office"),
    /**
     * Geo地址-GeoNetwork
     **/
    GEO_NETWORK("GeoNetwork"),
    /**
     * 区域-Region
     **/
    REGION("Region"),
    /**
     * 报销-WorkLocation
     **/
    CLAIM_WORK_LOCATION("ClaimWorkLocation"),
    /**
     * 业务单元编码表 BUSINESS_UNIT
     **/
    BUSINESS_UNIT("BusinessUnit"),
    /**
     * 运营单位编码表 OPERATING_UNIT
     **/
    OPERATING_UNIT("OperatingUnit"),
    /**
     * 管理单位编码表 MANAGEMENT_UNIT
     **/
    MANAGEMENT_UNIT("ManagementUnit"),
    /**
     * 子管理单位编码表 SUB_MANAGEMENT_UNIT
     **/
    SUB_MANAGEMENT_UNIT("SubManagementUnit"),
    /**
     * 管理地区编码表 MANAGEMENT_REGION
     **/
    MANAGEMENT_REGION("ManagementRegion"),
    /**
     * Branch
     **/
    BRANCH("Branch"),
    /**
     * 市场划分
     **/
    MARKET_SEGMENT("MarketSegment"),
    /**
     * OU配置表
     **/
    OPERATING_UNIT_CONFIG("OperatingUnitConfig"),
    /**
     * 业务线组织
     **/
    COMPETENCY("Competency"),
    /**
     * 子业务线组织
     **/
    SUB_COMPETENCY("SubCompetency"),
    /**
     * CodeBlock
     **/
    CODE_BLOCK("CodeBlock"),
    /**
     * Rank
     **/
    Rank("Rank"),
    /**
     * 财年/财周关系
     **/
    FISCAL_WEEK("FiscalWeek") {
        @Override
        public Set<String> categoryFunctionEnums() {
            Set<String> functions = super.categoryFunctionEnums();
            functions.addAll(
                    new HashSet<>(Arrays.asList(
                            FunctionTypeConstants.DICT_WEEK_AFTER_18_MONTHS,
                            FunctionTypeConstants.DICT_WEEK_FISCAL_WEEK_BY_DATE,
                            FunctionTypeConstants.DICT_WEEK_ALL_FISCAL_YEAR

                    )));
            return functions;
        }
    },
    /**
     * 财天
     **/
    FISCAL_DAY("FiscalDay") {
        @Override
        public Set<String> categoryFunctionEnums() {
            Set<String> functions = super.categoryFunctionEnums();
            functions.addAll(
                    new HashSet<>(Arrays.asList(
                            FunctionTypeConstants.DICT_DAY_INIT_DATA
                    )));
            return functions;
        }
    },

    /**
     * 日历
     **/
    CALENDAR("Calendar") {
        @Override
        public Set<String> categoryFunctionEnums() {
            Set<String> functions = super.categoryFunctionEnums();
            functions.addAll(
                    new HashSet<>(Arrays.asList(
                            FunctionTypeConstants.DICT_CALENDAR_WORK_DAY_BY_PERIOD,
                            FunctionTypeConstants.DICT_DAY_INIT_CALENDAR_DATA
                    )));
            return functions;
        }
    },

    /**
     * 假勤编码表non_chargeable
     **/
    NON_CHARGEABLE("NonChargeable"),

    /**
     * Non-Chragable与activity code关系表
     **/
    NON_CHARGEABLE_REF("NonChargeableRef"),

    /**
     * 地理区域编码表GEORegion
     **/
    GEO_REGION("GeoRegion"),

    /**
     * 子业务线-SubServiceLine
     **/
    SUB_SERVICE_LINE("SubServiceLine"),

    /**
     * 业务线-ServiceLine
     **/
    SERVICE_LINE("ServiceLine"),

    // public
    /**
     * AC Level（分为一级、）
     */
    ACCOUNT_SEGMENT("AccountSegment"),
    /**
     * 币种
     */
    CURRENCY("Currency"),
    /**
     * 等级
     */
    HR_RANK("HrRank"),
    /**
     * 地址类型
     */
    ADDRESS_TYPE("AddressType"),
    /**
     * 业务能力
     */
    BUSINESS_CAPABILITY("BusinessCapability"),
    /**
     * 残障分类
     */
    CHALLENGE_GROUP("ChallengeGroup"),
    /**
     * 学历
     */
    DEGREES("Degrees"),
    /**
     * Discipline
     */
    DISCIPLINE("Discipline"),
    /**
     * 邮箱类型
     */
    EC_EMAIL_TYPE("EcEmailType"),
    /**
     * ecMaritalStatus
     */
    EC_MARITAL_STATUS("EcMaritalStatus"),
    /**
     * 电话类型
     */
    EC_PHONE_TYPE("EcPhoneType"),
    /**
     * 教育状态
     */
    EDUCATION_STATUS("EducationStatus"),
    /**
     * 员工状态
     */
    EMPLOYEE_STATUS("EmployeeStatus"),
    /**
     * 员工类型
     */
    EMPLOYEE_CLASS("EmployeeClass"),
    /**
     * 用工关系状态
     */
    EMPLOYEE_TYPE("EmployeeType"),
    /**
     * 事件原因
     */
    EVENT_REASON("EventReason"),
    /**
     * 性别
     */
    GENDER("Gender"),
    /**
     * 职位代码
     */
    JOB_CLASSIFICATION("JobClassification"),
    /**
     * Job Grouping
     */
    JOB_GROUPING("JobGrouping"),
    /**
     * 称谓
     */
    SALUTATION("Salutation"),
    /**
     * 服务类型
     */
    SERVICE_TYPE("ServiceType"),
    /**
     * 省
     */
    STATE_CHN("StateChn"),
    /**
     * 级别资历
     */
    ACTIVITY_TYPE("ActivityType"),
    /**
     * 外派政策
     */
    GLOBAL_ASSIGNMENT_TYPE("GlobalAssignmentType"),
    /**
     * 外派计划
     */
    GLOBAL_ASSIGNMENT_PROGRAMME("GlobalassignmentProgramme"),
    /**
     * 教育等级
     */
    HIGHEST_EDUCATION_LEVEL("HighestEducationLevel"),
    /**
     * 薪资类型
     */
    PAY_TYPE("PayType"),
    /**
     * 试用期状态
     */
    PROBATION_STATUS("ProbationStatus"),
    /**
     * 商机状态
     */
    OPPR_STATUS("OpprStatus"),
    /**
     * Pace状态
     */
    PACE_STATUS("PaceStatus"),
    /**
     * Solution Sector
     */
    SOLUTION_SECTOR("SolutionSector"),
    /**
     * MMT/CCT Lock Tag
     */
    MMT_LOCK_TAG("MmtLockTag"),
    /**
     * MMT/CCT LockStatus
     */
    MMT_LOCK_STATUS("MmtLockStatus"),
    /**
     * MMT/CCT Plan Source
     */
    MMT_PLAN_SOURCE("MmtPlanSource"),
    /**
     * 合同类型
     */
    CONTRACT_TYPE("ContractType"),
    /**
     * 数据验证阶段Stage
     */
    CLIENT_STAGE("ClientStage"),
    /**
     * Status
     */
    CLIENT_STATUS("ClientStatus"),
    /**
     * 客户属性
     */
    CLIENT_ENTITY_TYPE("ClientEntityType"),
    /**
     * 客户类型
     */
    CUSTOMER_CLASSIFICATION("CustomerClassification"),
    /**
     * 行业分类一级
     */
    CLIENT_INDUSTRY_SECTOR("ClientIndustrySector"),
    /**
     * 公司类型
     */
    CLIENT_COMPANY_TYPE("ClientCompanyType"),
    /**
     * Blocking Level
     */
    BLOCKING_LEVEL("BlockingLevel"),
    /**
     * Expense Type（报销类型）
     */
    EXPENSE_TYPE("ExpenseType"),
    /**
     * 收款状态
     */
    COLLECTION_STATUS("CollectionStatus"),
    /**
     * Code定义层级（项目层级）
     */
    CODE_LEVEL("CodeLevel"),
    /**
     * 项目类型
     */
    ENGAGEMENT_TYPE("EngagementType"),
    /**
     * 项目子类型
     */
    ENGAGEMENT_SUB_TYPE("EngagementSubType"),
    /**
     * 项目状态
     */
    ENGAGEMENT_STATUS("EngagementStatus"),
    /**
     * client国家地区
     */
    CLIENT_AREA_REGION("ClientAreaRegion"),
    /**
     * 加班资格
     */
    OVERTIMEELIGIBILITY("Overtimeeligibility"),
    /**
     * 经验等级
     */
    EXPERIENCE_LEVEL("ExperienceLevel"),
    /**
     * EY工作地址
     **/
    EY_WORK_LOCATION("EyWorkLocation"),

    /**
     * Mercury业务线组织
     **/
    COMPETENCY_MERCURY("CompetencyMercury"),

    /**
     * gds子管理单位编码表 SUB_MANAGEMENT_UNIT
     **/
    SUB_MANAGEMENT_UNIT_GDS("SubManagementUnitGds");




    private final String code;

    public Set<String> categoryFunctionEnums() {
        return new HashSet<String>(Arrays.asList(CategoryFunctionEnum.DEFAULT.getCode(), CategoryFunctionEnum.DEFAULT_PAGEFUL.getCode(),CategoryFunctionEnum.DEFAULT_NON_CACHE.getCode()));
    }

    public static CategoryCodeEnum getByCode(String code) {
        return Arrays.stream(values()).filter(categoryCodeEnum -> categoryCodeEnum.getCode().equals(code)).findFirst().orElse(null);
    }

    public static class FunctionTypeConstants {
        public static final String DICT_WEEK_AFTER_18_MONTHS = "18Month";
        public static final String DICT_WEEK_FISCAL_WEEK_BY_DATE = "FiscalWeekByDate";
        public static final String DICT_WEEK_ALL_FISCAL_YEAR = "AllFiscalYear";
        public static final String DICT_CALENDAR_WORK_DAY_BY_PERIOD = "WorkDayByPeriod";
        public static final String DICT_DAY_INIT_DATA = "InitData";
        public static final String DICT_DAY_INIT_CALENDAR_DATA = "InitCalendar";

        private FunctionTypeConstants() {
        }
    }

}
