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 org.springframework.stereotype.Component;

/**
 * @Description:账后收放款计划(保理融资款、应收账款)状态数据字典项
 * @Author:wanxiangZhou
 * @E-mail:zhouyu@sunxung.cn
 * @Date:2018年9月29日 上午7:36:44
 */
@Component
public class PaymentCollectionPlanStatusDict extends Dict {

    /** 编码 **/
    public static String CODE = "paymentCollectionPlanStatus";
    /** 中文名称 **/
    public static String CNAME = "收放款计划(保理融资款、应收账款)状态";

    /**   子枚举 **/
    public static enum ChildEnum {
        /** 计划中 **/
        PLANNING("pay_coll_planning", "计划中"),
        /** 放款执行中 **/
        EXECUTING("pay_coll_plan_executing", "放款执行中"),
        /** 已逾期 **/
        OVERDUE("pay_coll_plan_overdue", "已逾期"), // 已逾期，注意：目前其必须包括部分分配类型，因为很多逾期状态（如征信上报保理业务的逾期）都是通过已逾期或逾期完成来判断的。
        /** 部分分配 **/
        PART_ALLOCATE("pay_coll_plan_part_allocate", "部分分配"), // 指收款
        /** 部分完成 **/
        PART_COMPLETED("pay_coll_plan_part_completed", "部分完成"), // 指放款，与收款中的“部分分配”对应
        /** 逾期完成 **/
        OVERDUE_COMPLETED("pay_coll_plan_overdue_completed", "逾期完成"),
        /** 已完成 **/
        COMPLETED("pay_coll_plan_completed", "已完成"),
        /** 已豁免 **/
        NOTNEED("pay_coll_plan_notneed", "已豁免"),
        /** 豁免完成 **/
        NOTNEED_COMPLETED("pay_coll_plan_notneed_completed", "豁免完成");// 未豁免的那部分，包括逾期与否

        /** 编码 ***/
        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);
        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) {
        Dictionary dictionary = new Dictionary();
        dictionary.setParentId(parentId);
        dictionary.setName(CNAME);
        dictionary.setCode(CODE);
        dictionary.setGradation(gradation);
        return dictionaryService.add(dictionary);
    }
}
