package com.inkasso.factoring.common.dict.impl;

import com.inkasso.adapter.util.CodeUtil;
import com.inkasso.auth.exception.ValidatorException;
import com.inkasso.factoring.common.dict.Dict;
import com.inkasso.factoring.dict.entity.Dictionary;
import com.inkasso.factoring.dict.service.DictionaryService;
import org.springframework.stereotype.Component;

/**
 * @Description:文件存放实际目录路径（根据模块进行归类）
 * @Author:wanxiangZhou
 * @E_mail:303526821@qq.com
 * @Date:2017年5月23日 下午3:07:19
 */
@Component
public class FileModuleDict extends Dict {

    /**
     * 编码
     */
    public static String CODE = "fileModule";
    /**
     * 中文名称
     */
    public static String CNAME = "文件所属模块";

    /**
     * 子项枚举
     */
    public static enum ChildEnum {

        /**
         * 其他文件
         */
        OTHER("other", "其他文件"),
        /**
         * 业务管理-招投标历史文件
         **/
        BIDDING_HIS_FILE("biddingHistoryFile", "业务管理-招投标历史文件"),

        /**
         * 业务管理-保函文件
         **/
        GUARANTEE_FILE("guaranteeFiles", "业务管理-保函文件"),

        /**
         * 业务管理-中标通知书文件
         **/
        BID_WINNING_NOTICE("bidWinningNotice", "业务管理-中标通知书文件"),

        /**
         * 业务管理-中标通知书文件
         **/
        BIDDING_BID_WINNING_NOTICE("biddingBidWinningNotice", "业务管理-中标确认-中标通知书文件"),

        /**
         * 业务管理-支付凭证
         **/
        PAYMENT_VOUCHER("paymentVoucher", "业务管理-中标确认-中标通知书文件"),

        /**
         * 业务管理-投标凭证
         **/
        TENDER_DOCUMENTS("tenderDocuments", "业务管理-中标确认-投标凭证"),

        /**
         * 业务管理-退还凭证
         **/
        RETURN_VOUCHER("returnVoucher", "业务管理-中标确认-退还凭证"),

        /**
         * 业务管理-有效文件打包下载
         **/
        BUSINESS_ZIP_FILE("businessZipFile", "业务管理所有文件"),

        /**
         * 招投标管理-招标文件
         */
        TENDERS_FILE("tendersFile","招标文件"),

        /**
         * 招投标管理-投标文件
         */
        BIDDING_FILE("biddingFile","投标文件"),

        /**
         * 销售合同管理-销售合同文件
         **/
        SALES_CONTRACT_FILE("salesContractFile", "销售合同管理-销售合同文件"),
        /**
         * 销售合同管理-销售合同审批，签署确认文件
         **/
        SALES_CONTRACT_APPROVAL_FILE("salesContractApprovalFile", "销售合同管理-销售合同审批，签署确认文件"),
        /**
         * 销售合同管理-销售合同文件历史文件
         **/
        SALES_CONTRACT_HIS_FILE("salesContractHistoryFile", "销售合同管理-销售合同文件历史文件"),

        /**
         * 销售合同管理-补充文件
         **/
        SALES_CONTRACT_SUPPLEMENT_FILE("salesContractSupplementFile", "销售合同管理-补充文件"),
        /**
         * 销售合同管理-销售合同审批，签署确认文件
         **/
        SALES_CONTRACT_SUPPLEMENT_APPROVAL_FILE("salesContractSupplementApprovalFile", "销售合同管理-销售补充合同审批，签署确认文件"),
        /**
         * 销售合同管理-补充文件
         **/
        SALES_CONTRACT_SUPPLEMENT_HIS_FILE("salesContractSupplementHistoryFile", "销售合同管理-补充文件历史文件"),
        /**
         * 销售合同管理-保证金退还文件
         */
        SALES_CONTRACT_RETURN_BOND_FILE("salesContractReturnBondFile", "销售合同管理-保证金退还文件"),

        /**
         * 销售合同管理-有效文件打包下载
         */
        SALES_CONTRACT_ZIP_FILE("salesContractZipFile", "销售合同所有文件"),

        /**
         * 采购合同管理-采购合同文件制作的合同
         **/
        PURCHASE_CONTRACT_FILE_view("purchaseContractFileView", "采购合同管理-采购合同未签署的文件"),

        /**
         * 采购合同管理-采购合同文件
         **/
        PURCHASE_CONTRACT_FILE("purchaseContractFile", "采购合同管理-采购合同文件"),

        /**
         * 采购合同管理-采购合同文件
         **/
        PURCHASE_CONTRACT_UPLOAD_CONTRACT_FILE("purchaseContractUploadContractFile", "采购合同管理-采购合同上传的文件"),

        /**
         * 采购合同管理-采购合同文件
         **/
        PURCHASE_SUPPLEMENT_CONTRACT_UPLOAD_CONTRACT_FILE("purchaseSupplementContractUploadContractFile", "采购合同管理-采购补充合同上传的文件"),

        /**
         * 采购合同管理-采购签署合同文件
         **/
        PURCHASE_CONTRACT_SIGN_FILE("purchaseContractSignFile", "采购合同管理-采购签署合同文件"),

        /**
         * 采购合同管理-采购签署合同文件
         **/
        PURCHASE_CONTRACT_SIGN_UNDERLINE("purchaseContractUnderlineSignFile", "采购合同管理-采购线下签署合同文件"),

        /**
         * 采购合同管理-采购签署合同文件
         **/
        PURCHASE_SUPPLEMENT_CONTRACT_SIGN_UNDERLINE("purchaseSupplementContractUnderlineSignFile", "采购合同管理-采购补充合同线下签署合同文件"),

        /**
         * 采购合同管理-采购签署合同出证文件
         **/
        PURCHASE_CONTRACT_SIGN_FILE_REPORT("purchaseContractFileReport", "采购合同管理-采购签署合同出证文件"),

        /**
         * 采购合同管理-采购签署合同文件
         **/
        PURCHASE_CONTRACT_SUPPLEMENT_FILE("purchaseContractSupplementFile", "采购合同管理-采购补充合同文件"),

        /**
         * 采购合同管理-采购签署合同文件
         **/
        PURCHASE_CONTRACT_SUPPLEMENT_MAKE_FILE("purchaseContractSupplementMakeFile", "采购合同管理-制作的采购补充合同文件"),

        /**
         * 采购合同管理-采购签署合同文件
         **/
        PURCHASE_CONTRACT_SUPPLEMENT_HISTORY_FILE("purchaseContractSupplementHistoryFile", "采购合同管理-采购补充合同历史文件"),

        /**
         * 采购合同管理-采购签署补充合同文件
         **/
        PURCHASE_CONTRACT_SUPPLEMENT_SIGN_FILE("purchaseContractSupplementSignFile", "采购合同管理-采购签署补充合同文件"),

        /**
         * 采购合同管理-采购签署补充合同出证文件
         **/
        PURCHASE_CONTRACT_SUPPLEMENT_FILE_REPORT("purchaseContractSupplementFileReport", "采购合同管理-采购签署补充合同出证文件"),

        /**
         * 采购合同管理-有效文件打包下载
         **/
        PURCHASE_CONTRACT_ZIP_FILE("purchaseContractZipFile", "采购合同所有文件"),

        /**
         * 验收单管理-验收单文件
         **/
        ACCEPTANCE_FILE("acceptanceFile", "验收单管理-验收单文件"),

        /**
         * 验收单管理-验收单文件-钢小二
         **/
        ACCEPTANCE_FILE_STEEL_WAITER("acceptanceFileSteelWaiter", "验收单管理-验收单文件-钢小二"),

        /**
         * 验收单管理-补充说明文件
         **/
        ACCEPTANCE_SUPPLEMENT_FILE("acceptanceSupplementFile", "验收单管理-补充说明文件"),

        /**
         * 验收单管理-生成的上游验收单文件
         **/
        ACCEPTANCE_UPSTREAM_FILE("acceptanceUpstreamFile", "验收单管理-生成的上游验收单文件"),

        /**
         * 验收单管理-生成的上游验收单文件
         **/
        ACCEPTANCE_UPSTREAM_FILE_SIGN("acceptanceUpstreamFileSign", "验收单管理-生成的上游验收单文件已签署"),

        /**
         * 验收单管理-验收单历史文件
         **/
        ACCEPTANCE_HIS_FILE("acceptanceHisFile", "验收单管理-验收单历史文件"),

        /**
         * 验收单管理-补充说明历史文件
         **/
        ACCEPTANCE_HIS_SUPPLEMENT_FILE("acceptanceHisSupplementFile", "验收单管理-补充说明历史文件"),

        /**
         * 验收单管理-生成的上游验收单历史文件
         **/
        ACCEPTANCE_HIS_UPSTREAM_FILE("acceptanceHisUpstreamFile", "验收单管理-生成的上游验收单历史文件"),

        /**
         * 验收单管理-有效文件打包下载
         **/
        ACCEPTANCE_ZIP_FILE("acceptanceZipFile", "验收单所有文件"),

        /**
         * 销售合同管理-销售合同审批，签署确认文件
         **/
        ACCEPTANCE_APPROVAL_FILE("acceptanceApprovalFile", "验收单审核，签署确认文件"),

        /**
         * 结算单管理-下游结算单文件
         **/
        SETTLEMENT_FILE("settlementFile", "结算单管理-下游结算单文件"),

        /**
         * 结算单管理-网价文件
         **/
        SETTLEMENT_NET_PRICE_FILE("settlementNetPriceFile", "结算单管理-网价文件"),

        /**
         * 结算单管理-补充说明文件
         **/
        SETTLEMENT_SUPPLEMENT_FILE("settlementSupplementFile", "结算单管理-补充说明文件"),

        /**
         * 结算单管理-生成的上游未签署文件
         **/
        SETTLEMENT_UPSTREAM_UNSIGNED_FILE("settlementUpstreamUnsignedFile", "结算单管理-生成的上游未签署文件"),

        /**
         * 结算单管理-生成的上游已签署文件
         **/
        SETTLEMENT_UPSTREAM_SIGNED_FILE("settlementUpstreamSignedFile", "结算单管理-生成的上游已签署文件"),

        /**
         * 结算单管理-出证文件
         **/
        SETTLEMENT_CONTRACT_REPORT("settlementContractReport", "结算单管理-出证文件"),

        /**
         * 结算单管理-下游结算单历史文件
         **/
        SETTLEMENT_HIS_FILE("settlementHisFile", "结算单管理-下游结算单历史文件"),

        /**
         * 结算单管理-网价历史文件
         **/
        SETTLEMENT_HIS_NET_PRICE_FILE("settlementHisNetPriceFile", "结算单管理-网价历史文件"),

        /**
         * 结算单管理-补充说明历史文件
         **/
        SETTLEMENT_HIS_SUPPLEMENT_FILE("settlementHisSupplementFile", "结算单管理-补充说明历史文件"),

        /**
         * 结算单管理-生成的上游未签署历史文件
         **/
        SETTLEMENT_HIS_UPSTREAM_UNSIGNED_FILE("settlementHisUpstreamUnsignedFile", "结算单管理-生成的上游未签署历史文件"),

        /**
         * 结算单管理-生成的上游已签署历史文件
         **/
        SETTLEMENT_HIS_UPSTREAM_SIGNED_FILE("settlementHisUpstreamSignedFile", "结算单管理-生成的上游已签署历史文件"),

        /**
         * 结算单管理-有效文件打包下载
         **/
        SETTLEMENT_ZIP_FILE("settlementZipFile", "结算单管理所有文件"),

        /**
         * 底层管理-底层文件
         **/
        UNDERLYING_FILE("underlyingFile", "底层管理-底层文件"),

        /**
         * 底层管理-底层历史文件
         **/
        UNDERLYING_HIS_FILE("underlyingHisFile", "底层管理-底层历史文件"),

        /**
         * 底层管理-压缩文件
         **/
        UNDERLYING_ZIP_FILE("underlyingZipFile", "底层管理压缩文件"),

        /**
         * 发票管理-采购发票文件
         **/
        INVOICE_PURCHASE_FILE("invoicePurchaseFile", "发票管理-采购发票文件"),
        /**
         * 发票管理-销售发票文件
         **/
        INVOICE_SALES_FILE("invoiceSalesFile", "销售发票文件"),
        /**
         * 发票管理-采购发票历史文件
         **/
        INVOICE_PURCHASE_HIS_FILE("invoicePurchaseHisFile", "发票管理-采购发票历史文件"),
        /**
         * 发票管理-开票明细表（含税收分类编码）附件
         */
        INVOICE_DETAIL_FILE("invoiceDetailFile", "发票管理-开票明细表（含税收分类编码）"),
        /**
         * 发票管理-开票明细表（含税收分类编码）(历史)
         */
        INVOICE_DETAIL_HIS_FILE("invoiceDetailHisFile", "发票管理-开票明细表（含税收分类编码）历史文件"),

        /**
         * 发票管理-销售发票历史文件
         **/
        INVOICE_SALES_HIS_FILE("invoiceSalesHisFile", "发票管理-销售发票历史文件"),

        /**
         * 发票管理-有效文件打包下载
         **/
        INVOICE_ZIP_FILE("invoiceZipFile", "发票管理所有文件"),

        /**
         * 现金流管理-入账信息文件表
         **/
        CASH_FLOW_ENTRY_FILE("cashFlowEntryFile", "现金流管理-入账信息文件表"),

        /**
         * 资方管理-客户信息-基础资料清单附件
         */
        FINANCIAL_CUSTOMER_BASIC_FILE("financialCustomerBasicFile", "客户信息-基础资料清单附件"),

        /**
         * 资方管理-客户信息-基础资料清单历史附件
         */
        FINANCIAL_CUSTOMER_BASIC_HIS_FILE("financialCustomerBasicHisFile", "客户信息-基础资料清单历史附件"),

        /**
         * 资方管理-支用信息-上游采购合同附件
         */
        FINANCIAL_EXPENDITURE_UPSTREAM_PURCH_FILE("financialExpenditureUpstreamPurchFile", "支用信息-上游采购合同附件"),

        /**
         * 资方管理-支用信息-上游结算单附件
         */
        FINANCIAL_EXPENDITURE_UPSTREAM_SETTLEMENT_FILE("financialExpenditureUpstreamSettlementFile", "支用信息-上游采购合同附件"),

        /**
         * 资方管理-支用信息-上游发票附件
         */
        FINANCIAL_EXPENDITURE_UPSTREAM_INVOICE_FILE("financialExpenditureUpstreamInvoiceFile", "支用信息-上游发票附件"),

        /**
         * 资方管理-支用信息-下游销售合同文件
         */
        FINANCIAL_EXPENDITURE_DOWNSTREAM_SALES_FILE("financialExpenditureDownstreamSalesFile", "支用信息-下游销售合同文件"),

        /**
         * 资方管理-支用信息-下游结算单文件
         */
        FINANCIAL_EXPENDITURE_DOWNSTREAM_SETTLEMENT_FILE("financialExpenditureDownstreamSettlementFile", "支用信息-下游结算单文件"),

        /**
         * 资方管理-支用信息-下游发票
         */
        FINANCIAL_EXPENDITURE_DOWNSTREAM_INVOICE_FILE("financialExpenditureDownstreamInvoiceFile", "支用信息-下游发票"),

        /**
         * 资方管理-支用信息-合同附件
         */
        FINANCIAL_EXPENDITURE_ATTACHMENT_FILE("financialExpenditureAttachmentFile", "支用信息-合同附件"),

        /**
         * 资方管理-支用信息-其它附件
         */
        FINANCIAL_EXPENDITURE_OTHER_FILE("financialExpenditureOtherFile", "支用信息-其它附件"),

        /**
         * 资方管理-支用信息-上游采购合同历史附件
         */
        FINANCIAL_EXPENDITURE_UPSTREAM_PURCH_HIS_FILE("financialExpenditureUpstreamPurchHisFile", "支用信息-上游采购合同历史附件"),

        /**
         * 资方管理-支用信息-上游结算单历史附件
         */
        FINANCIAL_EXPENDITURE_UPSTREAM_SETTLEMENT_HIS_FILE("financialExpenditureUpstreamSettlementHisFile", "支用信息-上游采购合同历史附件"),

        /**
         * 资方管理-支用信息-上游发票历史附件
         */
        FINANCIAL_EXPENDITURE_UPSTREAM_INVOICE_HIS_FILE("financialExpenditureUpstreamInvoiceHisFile", "支用信息-上游发票历史附件"),

        /**
         * 资方管理-支用信息-下游销售合同历史文件
         */
        FINANCIAL_EXPENDITURE_DOWNSTREAM_SALES_HIS_FILE("financialExpenditureDownstreamSalesHisFile", "支用信息-下游销售合同历史文件"),

        /**
         * 资方管理-支用信息-下游结算单历史文件
         */
        FINANCIAL_EXPENDITURE_DOWNSTREAM_SETTLEMENT_HIS_FILE("financialExpenditureDownstreamSettlementHisFile", "支用信息-下游结算单历史文件"),

        /**
         * 资方管理-支用信息-下游历史发票
         */
        FINANCIAL_EXPENDITURE_DOWNSTREAM_INVOICE_HIS_FILE("financialExpenditureDownstreamInvoiceHisFile", "支用信息-下游历史发票"),

        /**
         * 资方管理-支用信息-合同历史附件
         */
        FINANCIAL_EXPENDITURE_ATTACHMENT_HIS_FILE("financialExpenditureAttachmentHisFile", "支用信息-合同历史附件"),

        /**
         * 资方管理-支用信息-其它历史附件
         */
        FINANCIAL_EXPENDITURE_OTHER_HIS_FILE("financialExpenditureOtherHisFile", "支用信息-其它历史附件"),

        /**
         * 资方管理-压缩包文件
         */
        FINANCIAL_ZIP_FILE("financialZipFile", "资方管理-压缩包文件"),

        /**
         * 资方管理-支用信息-合同清单附件
         */
        FINANCIAL_EXPENDITURE_CONTRACT_CHECKLIST_FILE("financialExpenditureContractChecklistFile", "支用信息-合同清单附件"),

        /**
         * 签署确认-文件
         */
        SIGN_CONFIRM_FILE("signConfirmationFile", "签署确认-文件"),

        /**
         * 签署确认-回调文件
         */
        SIGN_CONFIRM_BACK_FILE("signConfirmationBackFile", "签署确认-回调文件"),
        /**
         * 签署确认-回调文件
         */
        SIGN_CONFIRM_BACK_ZIP_FILE("signConfirmationBackZipFile", "签署确认-回调文件zip"),

        /**
         * 签署确认-出征文件
         */
        SIGN_CONFIRM_REPORT_FILE("signConfirmationReportFile", "签署确认-出证文件"),

        /**
         * 验收单签署确认-回调文件
         */
        ACCEPTANCE_SIGN_CONFIRM_BACK_FILE("acceptanceSignConfirmationBackFile", "验收单签署确认-已签署文件"),

        /**
         * 验收单签署确认-回调文件
         */
        ACCEPTANCE_SIGN_CONFIRM_BACK_ZIP_FILE("acceptanceSignConfirmationBackZipFile", "验收单签署确认-回调文件zip"),

        /**
         * 验收单签署确认-出征文件
         */
        ACCEPTANCE_SIGN_CONFIRM_REPORT_FILE("acceptanceSignConfirmationReportFile", "验收单签署确认-出证文件");

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

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

        public String getCode() {
            return code;
        }

        public String getCname() {
            return 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);
    }
}
