package com.brilliance.isc.common.bop.service.impl;

import cn.hutool.core.date.DateUtil;
import com.brilliance.mda.runtime.mda.util.MdaUtils;
import com.brilliance.isc.bo.Cbb;
import com.brilliance.isc.bo.Led;
import com.brilliance.isc.bo.Lid;
import com.brilliance.isc.bo.Pbl;
import com.brilliance.isc.common.bop.service.PblmodService;
import com.brilliance.isc.common.bop.service.Rmb2106Service;
import com.brilliance.isc.common.component.DyncDaoService;
import com.brilliance.isc.common.context.BopContext;
import com.brilliance.isc.common.context.SettleContext;
import com.brilliance.isc.common.liaallg.vo.LiaallgVo;
import com.brilliance.isc.common.rmbbop.entity.Tdn;
import com.brilliance.isc.common.rmbbop.entity.Tej;
import com.brilliance.isc.common.rmbbop.entity.Tek;
import com.brilliance.isc.common.rmbbop.model.Tdngrp;
import com.brilliance.isc.common.rmbbop.vo.Rmb2106;
import com.brilliance.isc.common.sysmod.SysmodService;
import com.brilliance.isc.common.util.BopUtils;
import com.brilliance.isc.common.util.RmbbopUtils;
import com.brilliance.isc.common.vo.BizAmdInfoVo;
import com.brilliance.isc.common.vo.BizInfoVo;
import com.brilliance.isc.mda.dao.*;
import com.brilliance.isc.vo.finance.BpdBizInfoVo;
import com.brilliance.isc.vo.lc.*;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
import java.util.Map;

@Service("tdn")
public class Rmb2106ServiceImpl implements Rmb2106Service {
    @Autowired
    private DyncDaoService dyncDaoService;
    @Autowired
    private PblmodService pblmodService;
    @Autowired
    private SysmodService sysmodService;
    @Autowired
    private PblMapper pblMapper;
    @Autowired
    private TdnMapper tdnMapper;
    @Autowired
    private TejMapper tejMapper;
    @Autowired
    private LedMapper ledMapper;
    @Autowired
    private LidMapper lidMapper;

    @Override
    public void save(Rmb2106 rmb2106) {
        String objinr = rmb2106.getRecgrp().getAds().getInr();
        if (!MdaUtils.isEmpty(objinr)) {
            Pbl pbl = pblMapper.selectByObjtypAndObjinr("TDN", objinr);
            rmb2106.getPblmod().setWrkpbl(pbl);
        }
        pblmodService.storeAllinBusTx(rmb2106);
    }

    @Override
    public void updrmb(Rmb2106 rmb2106) {
        String transName = SettleContext.getTransName().substring(0, 6);
        if (StringUtils.isEmpty(rmb2106.getLodflg())) {
            BizInfoVo bizInfo = BopContext.getBizInfo();
            String ownref = bizInfo.getOwnref();
            Tdn tdn = tdnMapper.selectByBanktrano(ownref);
            if (!StringUtils.equals(transName, "BTTSND") && tdn == null) {
                Map<String, Object> map = dyncDaoService.dyncReadByInr(bizInfo.getPnttyp(), bizInfo.getPntinr());
                tdn = tdnMapper.selectByBanktrano((String) map.get("ownref"));
            }
            if (tdn != null) {
                rmb2106.getRecgrp().setAds(tdn);
                Pbl pbl = pblMapper.selectByObjtypAndObjinr("TDN", tdn.getInr());
                rmb2106.getPblmod().setPbl(pbl);
            }
            rmb2106.setLodflg(tdn == null ? "N" : "Y");
        }
        if (StringUtils.equals(rmb2106.getLodflg(), "Y")) {
            if (StringUtils.equals(transName, "LITAME") || StringUtils.equals(transName, "LITDLA")) {
                setAmeData(rmb2106);
            }
        } else {
            pblmodService.mappingRMBDataCommon(rmb2106);
            mappingRMBDataAAAAAA(rmb2106);
        }
        setTej(rmb2106);
        setTek(rmb2106);
    }

    @Override
    public void saveSpt(Rmb2106 rmb2106) {
        BopUtils.saveSpt(rmb2106.getObjtyp() + "ADD");
    }

    private void setTej(Rmb2106 rmb2106) {
        BigDecimal tejAmt = BigDecimal.ZERO;
        Date tejDat = DateUtil.date();
        Date tejMatdat = DateUtil.date();
        List<LiaallgVo> liaallg = BopContext.getLiaallg();
        for (LiaallgVo eot : liaallg) {
            if (StringUtils.equals(eot.getCbtpfx(), "AKZ")) {
                tejAmt = eot.getAmt();
                tejDat = eot.getValdat();
                tejMatdat = eot.getMatdat();
            }
        }
//        RECP\TEJPP( Val( tejRow ) )\ACP = "X"
        Tdngrp recgrp = rmb2106.getRecgrp();
        for (int i = 0; i < recgrp.getTej().size(); i++) {
            Tej tej = recgrp.getTej().get(i);
            //明细主键
            int seqno = i + 1;
            if (StringUtils.equals(rmb2106.getLodflg(), "Y")) {
                String inr = recgrp.getAds().getInr();
                Integer maxSeqno = tejMapper.selectMaxSeqno(inr);
                if (maxSeqno != null) {
                    seqno += maxSeqno;
                }
            }
            tej.setSeqno(seqno);
            //明细操作类型
            tej.setListopertype("1");
            //承兑日期
            tej.setExchangedate(tejDat);
            //承兑金额
            String transName = SettleContext.getTransName().substring(0, 6);
            if (!StringUtils.equals(transName, "BTTACC")) {
                tej.setExchangeamt(tejAmt);
            }
            //承兑到期日
            tej.setExchangeenddate(tejMatdat);
//            ExecuteDefault(RECP\RECGRP\TEJ)
        }
    }

    private void setTek(Rmb2106 rmb2106) {
        Tdngrp recgrp = rmb2106.getRecgrp();
        for (int i = 0; i < recgrp.getTek().size(); i++) {
            Tek tek = recgrp.getTek().get(i);
            tek.setSeqno(i + 1);
            //明细操作类型
            tek.setListopertype("1");
            //资金融入企业名称
            String inorgname = RmbbopUtils.getOrgName("FIA");
            if (StringUtils.isEmpty(inorgname))
                inorgname = BopUtils.getPtsByRol("FIA").getNam();
            tek.setInorgname(inorgname);
            //资金融入企业国家（地区）代码
            tek.setIncountrycode("CHN");
//            ExecuteDefault( RECP\RECGRP\TEK )
        }
    }

    private void setAmeData(Rmb2106 rmb2106) {
        //受益人（即出口商）名称、信用证到期日、金额、即远期
        Map<String, Cbb> cbsMap = BopContext.getCbsMap();
        Tdngrp recgrp = rmb2106.getRecgrp();
        String transName = SettleContext.getTransName().substring(0, 6);
        switch (transName) {
            case "LITAME": {
                LidBizInfoVo bizInfo = (LidBizInfoVo) BopContext.getBizInfo();
                BizAmdInfoVo bizAmdInfo = BopContext.getBizAmdInfo();
                //信用证金额
                BigDecimal ameamt = bizAmdInfo.getEngamt();
                if (ameamt.compareTo(BigDecimal.ZERO) >= 0) {
                    recgrp.getAds().setAmt(bizAmdInfo.getMaxamt());
                } else {
                    recgrp.getAds().setAmt(cbsMap.get("OLDMAX").getAmt());
                }
                //出口商名称
                String exportername = RmbbopUtils.getOrgName("BEN");
                if (StringUtils.isEmpty(exportername))
                    exportername = BopUtils.getPtsByRol("BEN").getNam();
                recgrp.getAds().setExportername(exportername);
                //业务到期日
                recgrp.getAds().setEnddate(bizAmdInfo.getNewexpdat());
                //信用证到期日
                recgrp.getAds().setCreditenddate(bizAmdInfo.getNewexpdat());
                //期限条件
                recgrp.getAds().setTermtype(bizInfo.getTenmaxday() > 0 ? "02" : "01");
                break;
            }
            case "LITDLA": {
                LidBizInfoVo bizInfo = (LidBizInfoVo) BopContext.getBizInfo();
                String ameflg = bizInfo.getAmeflg();
                BigDecimal oriamt = cbsMap.get("OLDMAX").getAmt();
                BigDecimal reduceamt = bizInfo.getReduceamt();
                recgrp.getAds().setAmt(StringUtils.equals(ameflg, "Y") ? oriamt.add(reduceamt) : oriamt);
            }
        }
    }

    /**
     * 保存子节点信息
     *
     * @param rmb2106 报送业务信息
     */
    @Override
    public void saveChildData(Rmb2106 rmb2106) {
        Tdngrp recgrp = rmb2106.getRecgrp();
        //savdatafrompanel
        pblmodService.setListData(rmb2106.getPblmod(), recgrp.getTej());
        pblmodService.setListData(rmb2106.getPblmod(), recgrp.getTek());
        recgrp.getAds().setExchangelist(recgrp.getTej().size());
        recgrp.getAds().setForfeitinglist(recgrp.getTek().size());
        //存储TEJ数据
        for (Tej tej : recgrp.getTej()) {
            tej.setObjinr(recgrp.getAds().getInr());
            tej.setObjtyp(rmb2106.getObjtyp());
            if (dyncDaoService.dyncReadNoDataByInr(tej))
                sysmodService.sdbUpdateWithLog(tej);
            else
                sysmodService.sdbInsertWithLog(tej);
        }
        //存储TEK数据
        for (Tek tek : recgrp.getTek()) {
            tek.setObjinr(recgrp.getAds().getInr());
            tek.setObjtyp(rmb2106.getObjtyp());
            if (dyncDaoService.dyncReadNoDataByInr(tek))
                sysmodService.sdbUpdateWithLog(tek);
            else
                sysmodService.sdbInsertWithLog(tek);
        }
    }

    private void mappingRMBDataAAAAAA(Rmb2106 rmb2106) {
        Tdngrp recgrp = rmb2106.getRecgrp();
//         $cty = ""
        recgrp.getAds().setCurrencycode(RmbbopUtils.getCur());
//      \SYSMOD.getlhanum ( $lhanam, $bchname )
//      Disable( RECGRP\ADS\TRANSTYPE )
//
        BizInfoVo bizInfo = BopContext.getBizInfo();
        switch (bizInfo.getObjtyp()) {
            case "BED": {
                recgrp.getAds().setTransattr("AL01");
                //业务类型
                recgrp.getAds().setTranstype("1001");
                recgrp.getAds().setForbankswiftbic(BopUtils.getPtsptaByRol("OTH").getPtyextkey());
                //进口商国家代码
                setImpcountrycode(recgrp, "APL", "ISS");
                //进口商机构代码
                setImportercode(recgrp, "APL");
                //进口商名称
                recgrp.getAds().setImportername(BopUtils.getPtsByRol("APL").getNam());
                //出口商国家代码
                setExpcountrycode(recgrp, "BEN");
                //出口商机构代码
                setExportercode(recgrp, "BEN");
                //出口商名称
                recgrp.getAds().setExportername(RmbbopUtils.getPty("BEN").getNam1());
                //业务发生日期
                BedBizInfoVo bedBizInfoVo = (BedBizInfoVo) bizInfo;
                recgrp.getAds().setOccurdate(bedBizInfoVo.getPredat());
                //业务到期日
                Led led = ledMapper.selectByInr(bedBizInfoVo.getPntinr());
                recgrp.getAds().setEnddate(led.getExpdat());
                //信用证到期日
                recgrp.getAds().setCreditenddate(led.getExpdat());
                recgrp.getAds().setAmt(RmbbopUtils.getAmt());
                //期限条件
                recgrp.getAds().setTermtype(bedBizInfoVo.getTenmaxday() > 0 ? "02" : "01");
                break;
            }
            case "LID": {
                recgrp.getAds().setTransattr("AL02");
                recgrp.getAds().setTranstype("1001");
                recgrp.getAds().setForbankswiftbic(BopUtils.getAdrByRol("ADV").getBic());
                LidBizInfoVo lidBizInfoVo = (LidBizInfoVo) bizInfo;
                if (StringUtils.equals(lidBizInfoVo.getDkflg(), "X")) {
                    //委托行银行机构代码
//                 $ENTRUSTBANKORGCODE = ""
//                 Getptyfields_rmb( "APL", "JUSCOD", $ENTRUSTBANKORGCODE )
//                 MappingField_RMB( GetField( "RECGRP\ADS\ENTRUSTBANKORGCODE" ), $ENTRUSTBANKORGCODE )
                    //进口商国家代码
                    setImpcountrycode(recgrp, "OTH");
                    //进口商机构代码
                    setImportercode(recgrp, "OTH");
                    //进口商名称
                    recgrp.getAds().setImportername(RmbbopUtils.getOrgName("OTH"));
                } else {
                    //进口商国家代码
                    setImpcountrycode(recgrp, "APL");
                    //进口商机构代码
                    setImportercode(recgrp, "APL");
                    //进口商名称
                    recgrp.getAds().setImportername(RmbbopUtils.getOrgName("APL"));
                }
                //出口商国家代码
                String transName = SettleContext.getTransName().substring(0, 6);
                if (StringUtils.equals(transName, "LITOPN")) {
                    recgrp.getAds().setExpcountrycode(lidBizInfoVo.getStacty());
                } else {
                    setExpcountrycode(recgrp, "BEN", "ADV");
                }
                //出口商机构代码
                setExportercode(recgrp, "BEN");
                //出口商名称
                String exportername = RmbbopUtils.getOrgName("BEN");
                if (StringUtils.isEmpty(exportername))
                    exportername = BopUtils.getPtsByRol("BEN").getNam();
                recgrp.getAds().setExportername(exportername);
                //业务发生日期
                recgrp.getAds().setOccurdate(lidBizInfoVo.getOpndat());
                //业务到期日
                recgrp.getAds().setEnddate(lidBizInfoVo.getExpdat());
                //信用证到期日
                recgrp.getAds().setCreditenddate(lidBizInfoVo.getExpdat());
                //信用证金额
                recgrp.getAds().setAmt(RmbbopUtils.getAmt());
                //期限条件
                recgrp.getAds().setTermtype(lidBizInfoVo.getTenmaxday() > 0 ? "02" : "01");
                break;
            }
            case "BRD": {
                recgrp.getAds().setTransattr("AL02");
                recgrp.getAds().setTranstype("1001");
                recgrp.getAds().setForbankswiftbic(BopUtils.getAdrByRol("PRB").getBic());
                //进口商国家代码
                setImpcountrycode(recgrp, "APL");
                //进口商机构代码
                setImportercode(recgrp, "APL");
                //进口商名称
                recgrp.getAds().setImportername(RmbbopUtils.getOrgName("APL"));
                //出口商国家代码
                setExpcountrycode(recgrp, "BEN", "ADV");
                //出口商机构代码
                setExportercode(recgrp, "BEN");
                //出口商名称
                recgrp.getAds().setExportername(RmbbopUtils.getOrgName("BEN"));
                if (StringUtils.isEmpty(recgrp.getAds().getExportername())) {
                    recgrp.getAds().setExportername(BopUtils.getPtsByRol("BEN").getNam());
                }
                BrdBizInfoVo brdBizInfoVo = (BrdBizInfoVo) bizInfo;
                //业务发生日期
                recgrp.getAds().setOccurdate(brdBizInfoVo.getOpndat());
                //业务到期日
                recgrp.getAds().setEnddate(brdBizInfoVo.getMatdat());
                //信用证到期日
                Lid lid = lidMapper.selectByInr(brdBizInfoVo.getPntinr());
                recgrp.getAds().setCreditenddate(lid.getExpdat());
                recgrp.getAds().setAmt(RmbbopUtils.getAmt());
                //期限条件
                recgrp.getAds().setTermtype(brdBizInfoVo.getTenmaxday() > 0 ? "02" : "01");
                break;
            }
            case "BTD": {
                recgrp.getAds().setTransattr("AL01");
                recgrp.getAds().setTranstype("1001");
                recgrp.getAds().setForbankswiftbic(BopUtils.getPtsptaByRol("ISS").getPtyextkey());
                //进口商国家代码
                String impcountrycode = RmbbopUtils.getCountryCodeByRol("APL");
                if (StringUtils.isNotEmpty(impcountrycode))
                    recgrp.getAds().setImpcountrycode(impcountrycode);
                //进口商机构代码
                setImportercode(recgrp, "APL");
                //进口商名称
                recgrp.getAds().setImportername(BopUtils.getPtsByRol("APL").getNam());
                //出口商国家代码
                setExpcountrycode(recgrp, "BE1");
                //出口商机构代码
                setExportercode(recgrp, "BE1");
                //出口商名称
                recgrp.getAds().setExportername(RmbbopUtils.getOrgName("BE1"));
                //业务发生日期
                recgrp.getAds().setOccurdate(DateUtil.date());
                //业务到期日
                BtdBizInfoVo btdBizInfoVo = (BtdBizInfoVo) bizInfo;
                recgrp.getAds().setEnddate(btdBizInfoVo.getExpdat());
                //信用证到期日
                recgrp.getAds().setCreditenddate(btdBizInfoVo.getExpdat());
                //金额
//                MappingField_RMB( GetField( "RECGRP\ADS\AMT" ), "%\BTDGRP\CBS\MAX\AMT" )
                recgrp.getAds().setTermtype(btdBizInfoVo.getTenmaxday() > 0 ? "02" : "01");
                break;
            }
            case "LTD": {
                recgrp.getAds().setTransattr("AL02");
                //业务类型
                recgrp.getAds().setTranstype("1001");
                recgrp.getAds().setForbankswiftbic(BopUtils.getPtsptaByRol("ADT").getPtyextkey());
                //进口商国家代码
                setImpcountrycode(recgrp, "BE1");
                //进口商机构代码
                setImportercode(recgrp, "BE1");
                //进口商名称
                recgrp.getAds().setImportername(BopUtils.getPtsByRol("BE1").getNam());
                //出口商国家代码
                setExpcountrycode(recgrp, "BE2");
                //出口商机构代码
                setExportercode(recgrp, "BE2");
                //出口商名称
                recgrp.getAds().setExportername(RmbbopUtils.getOrgName("BE2"));
                if (StringUtils.isEmpty(recgrp.getAds().getExportername()))
                    recgrp.getAds().setExportername(BopUtils.getPtsByRol("BE2").getNam());
                recgrp.getAds().setOccurdate(DateUtil.date());
                //业务到期日
                LtdBizInfoVo ltdBizInfoVo = (LtdBizInfoVo) bizInfo;
                recgrp.getAds().setEnddate(ltdBizInfoVo.getExpdat());
                recgrp.getAds().setCreditenddate(ltdBizInfoVo.getExpdat());
                recgrp.getAds().setAmt(RmbbopUtils.getAmt());
                //期限条件
                recgrp.getAds().setTermtype(ltdBizInfoVo.getTenmaxday() > 0 ? "02" : "01");
                break;
            }
            case "BPD": {
                //业务属性
//                MappingField_RMB( GetField( "RECGRP\ADS\TRANSATTR" ), "AL01" )
                recgrp.getAds().setTranstype("2001");
                //委托行银行机构代码
                //境外对手行代码
                String forbankswiftbic = BopUtils.getPtsptaByRol("OTH").getPtyextkey();
                if (StringUtils.isNotEmpty(forbankswiftbic)) {
                    recgrp.getAds().setForbankswiftbic(forbankswiftbic);
                }
                //进口商国家代码
                setImpcountrycode(recgrp, "APL", "ISS");
                //进口商机构代码(福费廷业务取信用证开立APL角色信息)
                setImportercode(recgrp, "APL");
                //进口商名称
                recgrp.getAds().setImportername(BopUtils.getPtsByRol("APL").getNam());
                //出口商国家代码
                setExpcountrycode(recgrp, "FIA");
                //出口商机构代码
                setExportercode(recgrp, "FIA");
                //出口商名称
                recgrp.getAds().setExportername(RmbbopUtils.getOrgName("FIA"));
                //业务发生日期
                recgrp.getAds().setOccurdate(DateUtil.date());
                //业务到期日
                BpdBizInfoVo bpdBizInfoVo = (BpdBizInfoVo) bizInfo;
                recgrp.getAds().setEnddate(bpdBizInfoVo.getMatdat());
                //信用证到期日
//                if RECGRP\ADS\TRANSTYPE = "1001" then
//                    MappingField_RMB( GetField( "RECGRP\ADS\CREDITENDDATE" ), "%\LEDGRP\REC\EXPDAT" )
//                endif
                //金额
                recgrp.getAds().setAmt(RmbbopUtils.getAmt());
                recgrp.getAds().setTermtype(bpdBizInfoVo.getTenmaxday() > 0 ? "02" : "01");
            }
        }
    }

    private void setImportercode(Tdngrp recgrp, String rol) {
        if (StringUtils.equals(recgrp.getAds().getImpcountrycode(), "CHN")) {
            recgrp.getAds().setImportercode(RmbbopUtils.getOrgCode(rol));
        } else {
            recgrp.getAds().setImportercode("");
        }
    }

    private void setExportercode(Tdngrp recgrp, String rol) {
        if (StringUtils.equals(recgrp.getAds().getExpcountrycode(), "CHN")) {
            recgrp.getAds().setExportercode(RmbbopUtils.getOrgCode(rol));
        } else {
            recgrp.getAds().setExportercode("");
        }
    }

    private void setImpcountrycode(Tdngrp recgrp, String... rols) {
        if (rols.length == 1) {
            String impcountrycode = RmbbopUtils.getCountryCodeByRol(rols[0]);
            recgrp.getAds().setImpcountrycode(StringUtils.isEmpty(impcountrycode) ? "CHN" : impcountrycode);
        } else if (rols.length == 2) {
            String countryCode1 = RmbbopUtils.getCountryCodeByRol(rols[0]);
            String countryCode2 = RmbbopUtils.getCountryCodeByRol(rols[1]);
            recgrp.getAds().setImpcountrycode(StringUtils.isEmpty(countryCode1) ? countryCode2 : countryCode1);
        }
    }

    private void setExpcountrycode(Tdngrp recgrp, String... rols) {
        if (rols.length == 1) {
            String expcountrycode = RmbbopUtils.getCountryCodeByRol(rols[0]);
            recgrp.getAds().setExpcountrycode(StringUtils.isEmpty(expcountrycode) ? "CHN" : expcountrycode);
        } else if (rols.length == 2) {
            String countryCode1 = RmbbopUtils.getCountryCodeByRol(rols[0]);
            String countryCode2 = RmbbopUtils.getCountryCodeByRol(rols[1]);
            recgrp.getAds().setExpcountrycode(StringUtils.isEmpty(countryCode1) ? countryCode2 : countryCode1);
        }
    }


}
