package com.brilliance.isc.common.transaction.newcheck.txfmod;

import com.brilliance.isc.bo.Pty;
import com.brilliance.isc.bo.Txpreg;
import com.brilliance.isc.common.transaction.newcheck.AbstractModuleValidator;
import com.brilliance.isc.common.transaction.newcheck.ValidResult;
import com.brilliance.isc.common.transaction.newcheck.Validate;
import com.brilliance.isc.common.txfmod.service.TxfmodService;
import com.brilliance.isc.common.txfmod.vo.TxfmodBizInfo;
import com.brilliance.isc.common.txfmod.vo.TxfmodVo;
import com.brilliance.isc.common.util.StringUtils;
import com.brilliance.isc.mda.dao.PtyMapper;
import com.brilliance.mda.runtime.mda.impl.Argument;
import com.brilliance.mda.runtime.mda.util.MdaUtils;
import com.brilliance.mda.runtime.mda.util.Strings;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;
import javax.annotation.Resource;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Component
public class TxfmodValidator extends AbstractModuleValidator<TxfmodVo> {

    @Resource
    private TxfmodService txfmodService;
    @Resource
    private TxpregValidator txpregValidator;
    @Resource
    private PtyMapper ptyMapper;

    @Override
    @PostConstruct
    public void register() {
        super.register();
        txpregValidator.register();
    }

    @Override
    public Map<String, String> validate(TxfmodVo vo) {
        Map<String, String> maps = new HashMap<>();
        maps.putAll(super.validate(vo));
        // 验证付汇登记列表
        if ("X".equalsIgnoreCase(vo.getTxfflg()) && "Y".equalsIgnoreCase(vo.getTxfrst()) && "Y".equalsIgnoreCase(vo.getAcpflg())) {
            txpregValidator.registerParent(vo);
            List<Txpreg> reglst = vo.getReglst();
            for (int i = 0; i < reglst.size(); i++) {
                maps.putAll(txpregValidator.validate(reglst.get(i),i));
            }
            txpregValidator.removeTl();
        }
        return maps;
    }

    @Validate(path = "txfmod.rcrdno")
    public ValidResult checkRcrdno(TxfmodVo vo) {
        if (StringUtils.isEmpty(vo.getRcrdno())) {
            return ValidResult.build(false, "备案表编号不能为空");
        }
        return null;
    }

    @Validate(path = "txfmod.dataverfcd")
    public ValidResult checkDataverfcd(TxfmodVo vo) {
        if (StringUtils.isEmpty(vo.getDataverfcd())) {
            return ValidResult.build(false, "备验证码不能为空");
        }
        return null;
    }

    // 核验金额
    @Validate(path = "txfmod.txpaym.beenchkverfamt")
    public ValidResult checkBeenChkVerfAmt(TxfmodVo vo) {
        if ("X".equalsIgnoreCase(vo.getTxfflg()) && "Y".equalsIgnoreCase(vo.getTxfrst()) && !txfmodService.isAmtAvailable(vo)) {
            return ValidResult.build(false, "该笔备案表剩余可用金额不足");
        }
        return null;
    }

    // 核验境外收款人国别
    @Validate(path = "txfmod.txform.payeectrynm")
    public ValidResult checkPayeeCtryNm(TxfmodVo vo) {
        if ("X".equalsIgnoreCase(vo.getTxfflg()) && "Y".equalsIgnoreCase(vo.getTxfrst()) && "Y".equalsIgnoreCase(vo.getAcpflg())) {
            Argument<String> txfPayeeCtryCodBox = new Argument<String>();
            if (txfmodService.getCtryCodeByName(vo.getTxform().getPayeectrynm(), txfPayeeCtryCodBox)) {
                String countcode = txfmodService.getVerifiedCtryCode(vo);
                if (!MdaUtils.isEmpty(countcode) && MdaUtils.compareTo(countcode, txfPayeeCtryCodBox.value) != 0) {
                    return ValidResult.build(false, "该笔备案表收款人国别与交易中收款人国别不一致");
                }
            }
        }
        return null;
    }

    // 核验纳税人识别号
    @Validate(path = "txfmod.txpaym.taxpyidnfno")
    public ValidResult checkTaxpyIdnfNo(TxfmodVo vo) {
        if ("X".equalsIgnoreCase(vo.getTxfflg()) && "Y".equalsIgnoreCase(vo.getTxfrst()) && "Y".equalsIgnoreCase(vo.getAcpflg())) {
            if (!MdaUtils.isEmpty(vo.getTxpaym().getTaxpyidnfno())) {
                String idcode = "";
                String ecifjuscod = "";
                String ptyinr = txfmodService.getVerifiedPtyinr(vo);
                Pty pty = ptyMapper.selectByPtyinr(ptyinr);
                if (pty == null) {
                    return ValidResult.build(false, "交易中客户不存在");
                }
                idcode = pty.getIdcode();
                ecifjuscod = pty.getEcifjuscod();
                if (!MdaUtils.isEmpty(idcode)) {
                    if (MdaUtils.compareTo(vo.getTxpaym().getTaxpyidnfno(), idcode) != 0) {
                        return ValidResult.build(false, "该笔备案表客户与交易中客户不一致");
                    }
                } else {
                    if (MdaUtils.compareTo(Strings.mid(vo.getTxpaym().getTaxpyidnfno(), 9, 9), ecifjuscod) != 0) {
                        return ValidResult.build(false, "该笔备案表客户与交易中客户不一致");
                    }
                }
            }
        }
        return null;
    }

    // 业务受理标志
    @Validate(path = "acpflg")
    public ValidResult checkAcpflg(TxfmodVo vo) {
        if ("X".equalsIgnoreCase(vo.getTxfflg())) {
            if ("Y".equalsIgnoreCase(vo.getTxfrst()) && StringUtils.isEmpty(vo.getAcpflg())) {
                return ValidResult.build(false, "未点击业务受理按钮,请检查");
            }
        }
        return null;
    }

    // 收支申报
    @Validate(path = "szflg")
    public ValidResult checkSzflg(TxfmodVo vo) {
        if ("X".equalsIgnoreCase(vo.getTxfflg())) {
            if ("Y".equalsIgnoreCase(vo.getTxfrst()) && StringUtils.isNotEmpty(vo.getAcpflg())) {
                TxfmodBizInfo rec = vo.getRec();
                if ("3".equalsIgnoreCase(rec.getSzflg())) {
                    return ValidResult.build(false, "业务已受理,但未填写申报信息，请检查");
                }
            }
        }
        return null;
    }

}
