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

import com.brilliance.isc.bo.Pte;
import com.brilliance.isc.common.context.SettleContext;
import com.brilliance.isc.common.liaall.service.LiaallService;
import com.brilliance.isc.common.liaall.vo.AcceptLineVo;
import com.brilliance.isc.common.liaall.vo.LiaallVo;
import com.brilliance.isc.common.liaallg.vo.LiaallgVo;
import com.brilliance.isc.common.liaallr.vo.LiaallrVo;
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.util.Utils;
import com.brilliance.isc.mda.dao.PteMapper;
import com.brilliance.mda.runtime.mda.util.MdaUtils;
import com.brilliance.mda.runtime.mda.util.Strings;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;
import java.math.BigDecimal;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Component
public class LiaallValidator extends AbstractModuleValidator<LiaallVo> {

    @Autowired
    private LiaallService liaallService;

    @Autowired
    private LiaallgValidator liaallgValidator;

    @Autowired
    private LiaallrValidator liaallrValidator;

    @Autowired
    private AcceptLineValidator acceptLineValidator;

    @Autowired
    private PteMapper pteMapper;

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

    @Override
    public Map<String, String> validate(LiaallVo vo) {
        Map<String, String> maps = new HashMap<>();
        maps.putAll(super.validate(vo));
        liaallgValidator.registerParent(vo);
        List<LiaallgVo> liaallgs = vo.getLiaallg();
        for (int i = 0; i < liaallgs.size(); i++) {
            maps.putAll(liaallgValidator.validate(liaallgs.get(i), i));
        }
        liaallgValidator.removeTl();

        liaallrValidator.registerParent(vo);
        List<LiaallrVo> liaallrs = vo.getLiaallr();
        for (int i = 0; i < liaallrs.size(); i++) {
            maps.putAll(liaallrValidator.validate(liaallrs.get(i), i));
        }
        liaallrValidator.removeTl();

        List<AcceptLineVo> acceptLines = vo.getAcceptLines();
        for (int i = 0; i < acceptLines.size(); i++) {
            maps.putAll(acceptLineValidator.validate(acceptLines.get(i), i));
        }

        return maps;
    }

    @Validate(path="setmod.docamt")
    public ValidResult checkDocamt(LiaallVo liaallVo){
        String tenstmVisible = liaallService.liaallParGet("VISIBLE", "TENSTM");
        if ("X".equals(tenstmVisible)) {
            if(liaallService.liaallParFound("TENCBT", "CBTPFX")){
                if(liaallVo.getDocamt().compareTo(liaallVo.getTensetamt()) > 0 ){
                    return ValidResult.build(false, Strings.formatText("You may not use more than the amount of the selected tenor of $1 $2", liaallVo.getConcur(), Utils.fmtAmount(liaallVo.getTensetamt(), liaallVo.getConcur())));
                }
            }
        }
        return null;
    }

    @Validate(path = "liaall.misamt")
    public ValidResult checkmisamt(LiaallVo liaallVo) {
        if (liaallVo.getMisamt().compareTo(BigDecimal.ZERO) != 0) {
            return ValidResult.build(false, Strings.formatText("Please use the missing amount of $1 $2", liaallVo.getConcur(), Utils.fmtAmount(liaallVo.getMisamt(), liaallVo.getConcur())));
        }
        return null;
    }

    //@Validate(path = "liaall.tenstm")
    @Validate(path = "liaall.tenorSettles.0.flag")
    public ValidResult checkTenstmN1000(LiaallVo liaallVo){
        String tenstmVisible = liaallService.liaallParGet("VISIBLE", "TENSTM");
        if ("X".equals(tenstmVisible)) {
            String alwFlg = liaallService.liaallParGet( "LiaallSetCbtAlwEmp", "" );
            if (MdaUtils.isEmpty(alwFlg)) {
                boolean chooseFlag = false;
                for (int i = 0; i < liaallVo.getTenorSettles().size(); i++) {
                    if ("X".equals(liaallVo.getTenorSettles().get(i).getFlag())) {
                        chooseFlag = true;
                        break;
                    }
                }
                if (!chooseFlag) {
                    return ValidResult.build(false,"请至少选择一个期限");
                }
            }
        }
        return null;
    }

    //@Validate(path = "liaall.tenstm")
    @Validate(path = "liaall.tenorSettles.0.flag")
    public ValidResult checkTenstmN1001(LiaallVo liaallVo){
        String tenstmVisible = liaallService.liaallParGet("VISIBLE", "TENSTM");
        if ("X".equals(tenstmVisible)) {
            String frame = SettleContext.getDirectTransName();
            if("BOTSET|BETSET|BCTSET|BRTSET|BDTSET|BFTSET".indexOf(frame) >= 0){
                int count = 0;
                for (int i=0; i<liaallVo.getTenorSettles().size(); i++) {
                    if ("X".equals(liaallVo.getTenorSettles().get(i).getFlag())) {
                        count += 1;
                    }
                }
                if (count > 1) {
                    return  ValidResult.build(false,"You cannot select more than one tenor");
                }
            }
        }
        return null;
    }

    @Validate(path="liaall.acceptLines.0.matdat")
    public ValidResult checkMatdat(LiaallVo liaallVo){
        String transName = SettleContext.getTransName();
        //XXXEUS 展期交易
        if ("EUS".equals(transName.substring(3, 6)) && !"BDTEUS".equals(transName)) {
            boolean changeFlag = false;
            List<AcceptLineVo> acceptLines = liaallVo.getAcceptLines();
            if (acceptLines != null && acceptLines.size() > 0) {
                for (int i=0; i<acceptLines.size(); i++) {
                    Date newMatdat = acceptLines.get(i).getMatdat();
                    String pteinr = acceptLines.get(i).getPteinr();
                    Pte pte = pteMapper.selectByInr(pteinr);
                    if (pte != null && MdaUtils.compareTo(newMatdat, pte.getMatdat()) != 0) {
                        changeFlag = true;
                        break;
                    }
                }
            } else {
                //没有承兑数据
                return null;
            }
            if (!changeFlag) {
                return ValidResult.build(false, "No changes for maturities entered yet.  Please enter extensions");
            }
        }
        return null;
    }


}
