package com.sunxung.factoring.dict.impl;

import com.sunxung.factoring.component.exception.ValidatorException;
import com.sunxung.factoring.component.util.CodeUtil;
import com.sunxung.factoring.dict.Dict;
import com.sunxung.factoring.entity.sys.Dictionary;
import com.sunxung.factoring.service.sys.DictionaryService;
import org.springframework.stereotype.Component;

/**
 * @description:系统业务模块字典项 <p>
 * 目前：定义涉及到流程相关的业务（主）模块<br>
 * 要求：子枚举Code与菜单ename值保持一致，便于菜单权限的判断
 * </p>
 * @author:吴端丽
 * @e-mail:1912942707@qq.com
 * @date:2018年7月3日 下午2:35:51
 */
@Component
public class SystemBusinessModuleDict extends Dict {

    /**
     * 编码
     **/
    public static String CODE = "systemBusinessModel";
    /**
     * 中文名称
     */
    public static String CNAME = "系统业务模块";

    /**
     * 子枚举
     **/
    public static enum ChildEnum {
        /**
         * 销售合同管理模块
         **/
        BIDDING_MANAGEMENT("biddingBasicInfo", "招投标管理"),
        /**
         * 销售合同管理模块
         **/
        SALES_CONTRACT("salesContractManagement", "销售合同管理"),
//        /** 销售合同变更管理模块 **/
//        SALES_CONTRACT_CHANGE("salesContractChangeManagement", "销售合同变更管理"),
        /**
         * 采购合同管理模块
         **/
        PURCH_CONTRACT("purchContractManagement", "采购合同管理"),
//        /** 采购合同变更管理模块 **/
//        PURCH_CONTRACT_CHANGE("purchContractChangeManagement", "采购合同变更管理"),
        /**
         * 验收单管理模块
         **/
        ACCEPTANCE_SHEET("acceptanceManagement", "验收单管理"),
        /**
         * 分账管理模块
         **/
        LEDGER_MANAGEMENT("ledgerManagement", "分账管理"),
        /**
         * 底层管理
         **/
        UNDERLYING_MANAGEMENT("underlyingManagement", "底层管理"),
        /**
         * 结算单管理
         **/
        BILL_BASIC("billManagement", "结算单管理"),
        /**
         * 结算单变更管理
         **/
        BILL_BASIC_CHANGE("billChangeManagement", "结算单变更管理"),
        /**
         * 客户信息管理
         **/
        FINANCIAL_CUSTOMER_MANAGEMENT("financialCustomerManagement", "客户信息管理"),
        /**
         * 客户支用信息管理
         **/
        FINANCIAL_CUSTOMER_EXPENDITURE_MANAGEMENT("financialCustomerExpenditureManagement", "客户支用信息管理"),
        /**
         * 签署确认管理
         **/
        SIGN_CONFIRMATION("signConfirmationManagement", "签署确认管理"),
        /**
         * 供应商管理
         **/
        SUPPLIER_INFO("supplierInfo", "供应商授信管理"),
        /**
         * 项目管理
         **/
        PROJECT_INFORMATION("supplierInfo", "项目管理"),
        /**
         * 项目核心企业管理
         **/
        PROJECT_CORE_ENTERPRISE("supplierInfo", "项目核心企业管理"),
        /**
         * 授信决议管理
         **/
        CREDIT_RESOLUTION("supplierInfo", "授信决议管理"),
        /**
         * 发票管理
         **/
        INVOICE("invoiceManagement", "发票管理"),
        /**
         * 融资管理
         **/
        FINANCING_MANAGEMENT("financingManagement", "发票管理"),
        /**
         * 豁免跟进
         */
        EXEMPTION_MATTERS("ExemptionMatters","豁免跟进"),
        /**
         * 退款管理
         */
        REFUND_MANAGEMENT("RefundManagement","退款管理");

        /**
         * 编码
         */
        private String code;
        /**
         * 名称
         */
        private String cname;

        ChildEnum(String code, String cname) {
            this.code = code;
            this.cname = cname;
        }

        public String getCode() {
            return code;
        }

        public void setCode(String code) {
            this.code = code;
        }

        public String getCname() {
            return cname;
        }

        public void setCname(String cname) {
            this.cname = cname;
        }
    }

    @Override
    public void add(int gradation) {
        Dictionary domain = addDomainDictionary(null, gradation, dictionaryService);
        if (domain == null) {
            throw new ValidatorException(CodeUtil.FAIL, "系统业务模块新增数据字典出错啦！");
        }
        for (ChildEnum child : ChildEnum.values()) {
            addChildEnumDictionary(domain.getId(), child);
        }
    }

    private Dictionary addChildEnumDictionary(Long parentId, ChildEnum child) {
        Dictionary dictionary = new Dictionary();
        dictionary.setParentId(parentId);
        dictionary.setName(child.getCname());
        dictionary.setCode(child.getCode());
        dictionary.setGradation(child.ordinal());
        return dictionaryService.add(dictionary);
    }

    private Dictionary addDomainDictionary(Long parentId, int gradation, DictionaryService dictionaryService) {
        Dictionary dictionary = new Dictionary();
        dictionary.setParentId(parentId);
        dictionary.setName(CNAME);
        dictionary.setCode(CODE);
        dictionary.setGradation(gradation);
        return dictionaryService.add(dictionary);
    }
}
