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

import com.alibaba.fastjson2.JSON;
import com.brilliance.mda.runtime.mda.util.MdaUtils;
import org.slf4j.LoggerFactory;
import org.slf4j.Logger;
import com.brilliance.isc.common.codetable.service.CodetableService;
import com.brilliance.isc.common.context.SettleContext;
import com.brilliance.isc.common.counter.service.CounterService;
import com.brilliance.isc.common.esb.clm.IClmFeign;
import com.brilliance.isc.common.exception.CommonServiceException;
import com.brilliance.isc.common.limmod.service.LimOptionService;
import com.brilliance.isc.common.limmod.service.LimmodService;
import com.brilliance.isc.common.limmod.vo.DggrdVo;
import com.brilliance.isc.common.limmod.vo.LimPreCalVo;
import com.brilliance.isc.common.limmod.vo.LimmodVo;
import com.brilliance.isc.common.limmod.vo.TygrdVo;
import com.brilliance.isc.common.vo.PtsptaVo;
import com.brilliance.isc.esb.model.inner.InnerReq;
import com.brilliance.isc.esb.model.inner.InnerReqCL41;
import com.brilliance.isc.esb.model.inner.InnerRes;
import com.brilliance.isc.esb.model.inner.InnerResCL41;
import com.brilliance.isc.transfer.esb.IEsbMapper;
import com.brilliance.isc.utils.BigDecimalUtils;
import com.brilliance.isc.utils.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@Service("limprecal")
public class LimPreCalServiceImpl implements LimOptionService<InnerResCL41> {

    @Autowired
    private LimmodService limmodService;
    @Autowired
    private CodetableService codetableService;
    @Autowired(required = false)
    private IClmFeign clmFeign;

    @Autowired
    private CounterService counterService;

    public static final Logger logger = LoggerFactory.getLogger(LimPreCalServiceImpl.class);


    @Override
    public void assertLim(LimmodVo limmodVo) {
        logger.info("-----------开始处理额度试算{}{}------------", limmodVo.getRec().getOwnref(), SettleContext.getTransName());
        if (!limmodService.cL43oPn(limmodVo)) {
            return;
        }

        limmodService.LimRegParstm(limmodVo);
        limmodService.checkData(limmodVo);
        LimRegParstm(limmodVo);
        logger.info("-----------额度试算结束{}{}------------", limmodVo.getRec().getOwnref(), SettleContext.getTransName());

    }

    @Override
    public void callEsb(LimmodVo limmodVo) {
        InnerReq<InnerReqCL41> innerReqCL41InnerReq = new InnerReq<InnerReqCL41>(IEsbMapper.INSTANCE.copyLimPreCal(limmodVo.getLimPreCalVo()));
        if (logger.isDebugEnabled()) {
            logger.debug("开始调用试算接口:{}", JSON.toJSONString(limmodVo.getLimPreCalVo()));
        }
        InnerRes<InnerResCL41> innerResCL41InnerRes = clmFeign.callCL41(innerReqCL41InnerReq);
        if ("AAAAAAA".equals(innerResCL41InnerRes.header.code)) {
            responseMapping(innerResCL41InnerRes, limmodVo);
            limmodService.limRegister().resPonseMapping(limmodVo);
            if (logger.isDebugEnabled()) {
                logger.debug("额度试算接口调用成功");
            }
            showCLmLim(limmodVo);
        } else {

            throw new CommonServiceException(StringUtils.stringAppend("额度试算接口调用失败:", innerResCL41InnerRes.header.description));
        }
    }

    @Override
    public void limDataCal(LimmodVo limmodVo) {
        LimPreCalVo limPreCalVo = limmodVo.getLimPreCalVo();
        PtsptaVo ptsptaVo = limmodVo.getLimpts().getWrk();
        String idtype = limmodService.getidtypeinr(ptsptaVo.getPtyinr(), "C");
        limmodVo.setIdtyp(idtype);
//        String rol = limmodVo.getWrkrol();

        String extkey = "";
        String extname = "";
        extkey = limmodVo.getLimpts().getWrk().getExtkey();
        extname = limmodVo.getLimpts().getWrk().getNam();
        if (!MdaUtils.isEmpty(limmodVo.getEcifno())) {
            extkey = limmodVo.getEcifno();
//            extkey = limmodService.getPtsptaFromPtslist(limmodVo.getPtsList(), "BEN").getExtkey();
//            extname = limmodService.getPtsptaFromPtslist(limmodVo.getPtsList(), "BEN").getNam();
        }
        extkey = extkey.split("-")[0];
        String limtyp = codetableService.getTblLabel(limmodVo.getExtid(), "LMSCOD");

        String inifrm = SettleContext.getTransName();

        String ywcj = limPreCalVo.getYwcj();

        String buscur = codetableService.getTblLabel(limmodVo.getCur(), "CURKEY");
        String busamt = BigDecimalUtils.BigD2stringHalfUP(limmodVo.getComamt(), 2);
        String guaamt = BigDecimalUtils.BigD2stringHalfUP(limmodVo.getCcvamt(), 2);
        String caltyp = "";
//        if ("1".equals(idtype)) {
//            caltyp = "1";
//        } else {
//            caltyp = "2";
//        }
        caltyp = "3";
        limPreCalVo.setExtkey(extkey);
        limPreCalVo.setExtname(extname);
        //保函的直接读码表
        limPreCalVo.setLimtyp(limtyp);
        limPreCalVo.setInifrm(inifrm);
        limPreCalVo.setYwcj(ywcj);
        limPreCalVo.setBuscur(buscur);
        limPreCalVo.setBusamt(busamt);
        limPreCalVo.setGuaamt(guaamt);
        limPreCalVo.setCaltyp(caltyp);
        limPreCalVo.setQantno(counterService.dbCounterFormat("CLMLSH"));
        limPreCalVo.setBchusr(StringUtils.isEmpty(limmodVo.getUser()) ? SettleContext.getUserSession().getUsr().getExtkey() : limmodVo.getUser());
        limPreCalVo.setAccbch(StringUtils.isEmpty(limmodVo.getBranch()) ? SettleContext.getUserSession().getBch().getBranch() : limmodVo.getBranch());
    }

    @Override
    public void LimRegParstm(LimmodVo limmodVo) {
        if ("E".equals(limmodVo.getLimpts().getErrorflg())) {
            return;
        }
        limDataCal(limmodVo);
        limmodService.limRegister().limPreCalRegister(limmodVo);
        callEsb(limmodVo);

        saveTables(limmodVo);
    }

    @Override
    public void responseMapping(InnerRes<InnerResCL41> innerRes, LimmodVo limmodVo) {
        List<DggrdVo> dggrdVoList = limmodVo.getLimPreCalVo().getDggrd();
        List<TygrdVo> tygrdVolist = limmodVo.getLimPreCalVo().getTygrd();
        dggrdVoList.clear();
        tygrdVolist.clear();

        String typ = "3";
        if ("1".equals(typ) || "3".equals(typ)) {
            if (innerRes.DATA.lstCL413.size() > 0) {
                innerRes.DATA.lstCL413.forEach(fcl413 -> {
                    DggrdVo dggrdVo = new DggrdVo();
                    dggrdVo.setPtyextkey(innerRes.DATA.restxt02);
                    dggrdVo.setPtynam(innerRes.DATA.restxt03);
                    dggrdVo.setLimtyp(innerRes.DATA.restxt04);
                    dggrdVo.setOwnref(innerRes.DATA.restxt05);
                    if (!MdaUtils.isEmpty(innerRes.DATA.restxt06)) {
                        dggrdVo.setCur(codetableService.getTblKey(innerRes.DATA.restxt06, "CURKEY"));
                    }
                    dggrdVo.setCcvbl(BigDecimalUtils.string2BigDecimal(innerRes.DATA.restxt07));
                    dggrdVo.setTzhamt(BigDecimalUtils.string2BigDecimal(innerRes.DATA.restxt08));
                    dggrdVo.setTzqamt(BigDecimalUtils.string2BigDecimal(innerRes.DATA.restxt09));
                    dggrdVo.setTzhccv(BigDecimalUtils.string2BigDecimal(innerRes.DATA.restxt10));
                    dggrdVo.setTzqccv(BigDecimalUtils.string2BigDecimal(innerRes.DATA.restxt11));
                    dggrdVo.setTzhlimamt(BigDecimalUtils.string2BigDecimal(innerRes.DATA.restxt12));
                    dggrdVo.setTzqlimamt(BigDecimalUtils.string2BigDecimal(innerRes.DATA.restxt13));
                    dggrdVo.setTzhlimck(BigDecimalUtils.string2BigDecimal(innerRes.DATA.restxt14));
                    dggrdVo.setTzqlimck(BigDecimalUtils.string2BigDecimal(innerRes.DATA.restxt15));
                    dggrdVo.setTzhlibamt(BigDecimalUtils.string2BigDecimal(innerRes.DATA.restxt16));
                    dggrdVo.setTzqlibamt(BigDecimalUtils.string2BigDecimal(innerRes.DATA.restxt17));
                    dggrdVo.setXzylimamt(BigDecimalUtils.string2BigDecimal(innerRes.DATA.restxt18));
                    dggrdVo.setKylimamt(BigDecimalUtils.string2BigDecimal(innerRes.DATA.restxt19));
                    dggrdVo.setXzylimck(BigDecimalUtils.string2BigDecimal(innerRes.DATA.restxt20));
                    dggrdVo.setKylimck(BigDecimalUtils.string2BigDecimal(innerRes.DATA.restxt21));
                    dggrdVo.setXzylibamt(BigDecimalUtils.string2BigDecimal(innerRes.DATA.restxt22));
                    dggrdVo.setKylibamt(BigDecimalUtils.string2BigDecimal(innerRes.DATA.restxt23));
                    dggrdVo.setKhflimamt(BigDecimalUtils.string2BigDecimal(innerRes.DATA.restxt24));
                    dggrdVo.setKhflimck(BigDecimalUtils.string2BigDecimal(innerRes.DATA.restxt25));
                    dggrdVo.setKhflibamt(BigDecimalUtils.string2BigDecimal(innerRes.DATA.restxt26));


                    dggrdVo.setLimvar(fcl413.tbxx01);
                    dggrdVo.setDgzylimref(fcl413.tbxx02);
                    dggrdVo.setDgzyliminfref(fcl413.tbxx03);
                    dggrdVo.setDgzylimvar(fcl413.tbxx04);
                    if (!MdaUtils.isEmpty(fcl413.tbxx05)) {

                        dggrdVo.setDglimcur(codetableService.getTblKey(fcl413.tbxx05, "CURKEY"));
                    }
                    dggrdVo.setDgccvbl(BigDecimalUtils.string2BigDecimal(fcl413.tbxx06));
                    dggrdVo.setDgsxlimamt(BigDecimalUtils.string2BigDecimal(fcl413.tbxx07));
                    dggrdVo.setDgyylimamt(BigDecimalUtils.string2BigDecimal(fcl413.tbxx08));
                    dggrdVo.setDgkylimamt(BigDecimalUtils.string2BigDecimal(fcl413.tbxx09));
                    dggrdVo.setDgcklimamt(BigDecimalUtils.string2BigDecimal(fcl413.tbxx10));
                    dggrdVo.setDgyylimck(BigDecimalUtils.string2BigDecimal(fcl413.tbxx11));
                    dggrdVo.setDgkylimck(BigDecimalUtils.string2BigDecimal(fcl413.tbxx12));
                    dggrdVo.setDgdqlibamt(BigDecimalUtils.string2BigDecimal(fcl413.tbxx13));
                    dggrdVo.setDgyylibamt(BigDecimalUtils.string2BigDecimal(fcl413.tbxx14));
                    dggrdVo.setDgkylibamt(BigDecimalUtils.string2BigDecimal(fcl413.tbxx15));
                    dggrdVo.setDghfxh(Integer.parseInt(fcl413.tbxx16));


                    dggrdVoList.add(dggrdVo);
                });
            }
        }
        //同业额度信息列表，是cl412和cl414的合并

        if ("2".equals(typ) || "3".equals(typ)) {
            if (innerRes.DATA.lstCL414.size() > 0) {
                for (int i = 0; i < innerRes.DATA.lstCL414.size(); i++) {
                    TygrdVo tygrdVo = new TygrdVo();

                    tygrdVo.setPtyextkey(innerRes.DATA.restxt02);
                    tygrdVo.setPtynam(innerRes.DATA.restxt03);
                    tygrdVo.setLimtyp(innerRes.DATA.restxt04);
                    tygrdVo.setOwnref(innerRes.DATA.restxt05);
                    if (!MdaUtils.isEmpty(innerRes.DATA.restxt06)) {
                        tygrdVo.setCur(codetableService.getTblKey(innerRes.DATA.restxt06, "CURKEY"));
                    }
                    tygrdVo.setCcvbl(BigDecimalUtils.string2BigDecimal(innerRes.DATA.restxt07));
                    tygrdVo.setTzhamt(BigDecimalUtils.string2BigDecimal(innerRes.DATA.restxt08));
                    tygrdVo.setTzqamt(BigDecimalUtils.string2BigDecimal(innerRes.DATA.restxt09));
                    tygrdVo.setTzhccv(BigDecimalUtils.string2BigDecimal(innerRes.DATA.restxt10));
                    tygrdVo.setTzqccv(BigDecimalUtils.string2BigDecimal(innerRes.DATA.restxt11));
                    tygrdVo.setTzhlimamt(BigDecimalUtils.string2BigDecimal(innerRes.DATA.restxt12));
                    tygrdVo.setTzqlimamt(BigDecimalUtils.string2BigDecimal(innerRes.DATA.restxt13));
                    tygrdVo.setTzhlimck(BigDecimalUtils.string2BigDecimal(innerRes.DATA.restxt14));
                    tygrdVo.setTzqlimck(BigDecimalUtils.string2BigDecimal(innerRes.DATA.restxt15));
                    tygrdVo.setTzhlibamt(BigDecimalUtils.string2BigDecimal(innerRes.DATA.restxt16));
                    tygrdVo.setTzqlibamt(BigDecimalUtils.string2BigDecimal(innerRes.DATA.restxt17));
                    tygrdVo.setXzylimamt(BigDecimalUtils.string2BigDecimal(innerRes.DATA.restxt18));
                    tygrdVo.setKylimamt(BigDecimalUtils.string2BigDecimal(innerRes.DATA.restxt19));
                    tygrdVo.setXzylimck(BigDecimalUtils.string2BigDecimal(innerRes.DATA.restxt20));
                    tygrdVo.setKylimck(BigDecimalUtils.string2BigDecimal(innerRes.DATA.restxt21));
                    tygrdVo.setXzylibamt(BigDecimalUtils.string2BigDecimal(innerRes.DATA.restxt22));
                    tygrdVo.setKylibamt(BigDecimalUtils.string2BigDecimal(innerRes.DATA.restxt23));
                    tygrdVo.setKhflimamt(BigDecimalUtils.string2BigDecimal(innerRes.DATA.restxt24));
                    tygrdVo.setKhflimck(BigDecimalUtils.string2BigDecimal(innerRes.DATA.restxt25));
                    tygrdVo.setKhflibamt(BigDecimalUtils.string2BigDecimal(innerRes.DATA.restxt26));

                    tygrdVo.setTyptyextkey(innerRes.DATA.lstCL414.get(i).tb2xx01);
                    tygrdVo.setTyswiftno(innerRes.DATA.lstCL414.get(i).tb2xx02);
                    tygrdVo.setTyptynam(innerRes.DATA.lstCL414.get(i).tb2xx03);
                    tygrdVo.setTyownref(innerRes.DATA.lstCL414.get(i).tb2xx04);
                    tygrdVo.setTyinfref(innerRes.DATA.lstCL414.get(i).tb2xx05);
                    tygrdVo.setLimtyp(innerRes.DATA.lstCL414.get(i).tb2xx06);

                    if (MdaUtils.isEmpty(innerRes.DATA.lstCL414.get(i).tb2xx07)) {
                        tygrdVo.setTycur(codetableService.getTblKey(innerRes.DATA.lstCL414.get(i).tb2xx07, "CURKEY"));
                    }
                    tygrdVo.setTysxlimamt(BigDecimalUtils.string2BigDecimal(innerRes.DATA.lstCL414.get(i).tb2xx08));

                    tygrdVo.setTyyylimamt(BigDecimalUtils.string2BigDecimal(innerRes.DATA.lstCL414.get(i).tb2xx09));
                    tygrdVo.setTykylimamt(BigDecimalUtils.string2BigDecimal(innerRes.DATA.lstCL414.get(i).tb2xx10));
                    tygrdVo.setTycklimamt(BigDecimalUtils.string2BigDecimal(innerRes.DATA.lstCL414.get(i).tb2xx11));
                    tygrdVo.setTyyylimck(BigDecimalUtils.string2BigDecimal(innerRes.DATA.lstCL414.get(i).tb2xx12));
                    tygrdVo.setTykylimck(BigDecimalUtils.string2BigDecimal(innerRes.DATA.lstCL414.get(i).tb2xx13));

                    tygrdVo.setTytzqlimamt(BigDecimalUtils.string2BigDecimal(innerRes.DATA.lstCL412.get(i).tbx01));
                    tygrdVo.setTytzhlimamt(BigDecimalUtils.string2BigDecimal(innerRes.DATA.lstCL412.get(i).tbx02));
                    tygrdVo.setTytzqlimck(BigDecimalUtils.string2BigDecimal(innerRes.DATA.lstCL412.get(i).tbx03));
                    tygrdVo.setTytzhlimck(BigDecimalUtils.string2BigDecimal(innerRes.DATA.lstCL412.get(i).tbx04));
                    tygrdVo.setTykhflimamt(BigDecimalUtils.string2BigDecimal(innerRes.DATA.lstCL412.get(i).tbx05));
                    tygrdVo.setTyxzylimamt(BigDecimalUtils.string2BigDecimal(innerRes.DATA.lstCL412.get(i).tbx06));
                    tygrdVo.setTykhflimck(BigDecimalUtils.string2BigDecimal(innerRes.DATA.lstCL412.get(i).tbx07));
                    tygrdVo.setTyxzylimck(BigDecimalUtils.string2BigDecimal(innerRes.DATA.lstCL412.get(i).tbx08));
                    tygrdVolist.add(tygrdVo);
                }
            }
        }
    }

    /**
     * 给前端赋值
     *
     * @param limmodVo
     */
    public void showCLmLim(LimmodVo limmodVo) {
        if (!"3".equals(limmodVo.getLimpts().getQueryFlg())) {
            if ("Y".equals(limmodVo.getLimpts().getDothflg())) {
                limmodVo.getLimQueryVo().getLmegrdVos().clear();
            }
            limmodVo.getLimQueryVo().getLimgrdVoList().clear();
            limmodService.limRegister().fillLimGrdNew(limmodVo);
        }
        limmodService.limRegister().fillClmCbbNew(limmodVo);
        limmodService.limRegister().fillClmCbeNew(limmodVo);
        limmodService.limRegister().fillClmPtyNew(limmodVo);

        limmodVo.getLimpts().setPfcod1(limmodVo.getLimQueryVo().getLimgrdVoList().size() == 0 ? "" : limmodVo.getLimQueryVo().getLimgrdVoList().get(0).getLimref());
        limmodVo.getLimpts().setPfcod2(limmodVo.getLimQueryVo().getLmegrdVos().size() == 0 ? "" : limmodVo.getLimQueryVo().getLmegrdVos().get(0).getLimref());

    }

    @Override
    public void saveTables(LimmodVo limmodVo) {

    }
}
