package com.brilliance.isc.common.api;

import com.brilliance.mda.runtime.mda.util.Strings;
import com.brilliance.isc.common.api.liaccv.service.LiaccvApiService;
import com.brilliance.isc.common.api.liaccv.vo.LiaccvRequest;
import com.brilliance.isc.common.api.liaccv.vo.LiaccvResponse;
import com.brilliance.isc.common.codetable.service.CodetableService;
import com.brilliance.isc.common.esb.account.IAccountFeign;
import com.brilliance.isc.common.liaccv.service.LiaccvService;
import com.brilliance.isc.common.liaccv.vo.LiaccvAcctVo;
import com.brilliance.isc.common.liaccv.vo.LiaccvVo;
import com.brilliance.isc.common.vo.FcdVo;
import com.brilliance.isc.esb.model.inner.InnerReq;
import com.brilliance.isc.esb.model.inner.InnerReq8023;
import com.brilliance.isc.esb.model.inner.InnerRes;
import com.brilliance.isc.esb.model.inner.InnerRes8023;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class LiaccvApiServiceImpl implements LiaccvApiService {

    private static Logger log = LoggerFactory.getLogger(LiaccvApiServiceImpl.class);

    @Autowired
    private LiaccvService liaccvService;

    @Autowired
    private CodetableService codetableService;

    @Autowired(required = false)
    private IAccountFeign accountFeign;

    @Override
    public LiaccvResponse calcLiaccv(LiaccvRequest liaccvRequest) {
        liaccvRequest.reset();
        LiaccvVo liaccvVo = liaccvRequest.getLiaccvVo();
        liaccvService.assertLiaccv(liaccvVo);
        return buildLiaccvResponse(liaccvVo);
    }

    @Override
    public LiaccvResponse addLiaccvg(LiaccvRequest liaccvRequest) {
        liaccvRequest.reset();
        LiaccvVo liaccvVo = liaccvRequest.getLiaccvVo();
        liaccvService.addLiaccvg(liaccvVo);
        return buildLiaccvResponse(liaccvVo);
    }

    @Override
    public LiaccvResponse deleteLiaccvg(LiaccvRequest liaccvRequest) {
        liaccvRequest.reset();
        LiaccvVo liaccvVo = liaccvRequest.getLiaccvVo();
        liaccvService.deleteLiaccvg(liaccvVo);
        return buildLiaccvResponse(liaccvVo);
    }


    @Override
    public List<FcdVo> getFcdList(LiaccvRequest liaccvRequest) {
        liaccvRequest.reset();
        LiaccvVo liaccvVo = liaccvRequest.getLiaccvVo();
        return liaccvService.getFcdList(liaccvRequest.getTransName(), liaccvVo);
    }

    @Override
    public LiaccvAcctVo getLiaccvAccountInfo(String account) {
        //组装8023接口请求对象
        InnerReq8023 req8023 = new InnerReq8023(account);
        InnerReq<InnerReq8023> innerReq8023 = new InnerReq<>(req8023);
        LiaccvAcctVo liaccvAcctVo = new LiaccvAcctVo();
        //调用接口
        try {
            InnerRes<InnerRes8023> innerRes8023 = accountFeign.call8023(innerReq8023);
            //分析接口返回码
            if (innerRes8023 == null) {
                liaccvAcctVo.setErrorMsg(Strings.formatText("查询Account8023接口结果为空:$1", account));
                return liaccvAcctVo;
            }
            if (!"AAAAAAA".equals(innerRes8023.header.code)) {
                log.error("查询Account8023接口出错{}, {}", account, innerRes8023.header.description);
                liaccvAcctVo.setErrorMsg(Strings.formatText("查询Account8023接口结果为空:$1", account));
                return liaccvAcctVo;
            }
            //获取接口返回信息,组装liaccvAcctVo
            if (innerRes8023.DATA != null) {
                liaccvAcctVo.setZhangh(innerRes8023.DATA.zhangh);
                liaccvAcctVo.setZhuzwm(innerRes8023.DATA.zhuzwm);
                liaccvAcctVo.setHuobdh(innerRes8023.DATA.huobdh);
                if (com.brilliance.isc.utils.StringUtils.isNotEmpty(liaccvAcctVo.getHuobdh())) {
                    String cur = codetableService.getTblKey(liaccvAcctVo.getHuobdh(), "CURKEY");
                    liaccvAcctVo.setCur(cur);
                }
                liaccvAcctVo.setZhhuye(innerRes8023.DATA.zhhuye);
                liaccvAcctVo.setBliuye(innerRes8023.DATA.bliuye);
                liaccvAcctVo.setDjieye(innerRes8023.DATA.djieye);
                liaccvAcctVo.setKngzye(innerRes8023.DATA.kngzye);
                liaccvAcctVo.setQnriye(innerRes8023.DATA.qnriye);
                liaccvAcctVo.setTouzbz(innerRes8023.DATA.touzbz);
                liaccvAcctVo.setTouzje(innerRes8023.DATA.touzje);
                liaccvAcctVo.setKehhao(innerRes8023.DATA.kehhao);
                return liaccvAcctVo;
            } else {
                liaccvAcctVo.setErrorMsg("查询Account8023接口结果为空!");
                return liaccvAcctVo;
            }
        } catch (Throwable e) {
            log.error("查询Account8023接口出错", e);
            liaccvAcctVo.setErrorMsg(Strings.formatText("查询Account8023接口出错:$1", account));
            return liaccvAcctVo;
        }
    }

    private LiaccvResponse buildLiaccvResponse(LiaccvVo liaccvVo) {
        return LiaccvResponse.builder()
                .oldcur(liaccvVo.getOldcur())
                .oldamt(liaccvVo.getOldamt())
                .chgamt(liaccvVo.getChgamt())
                .concur(liaccvVo.getConcur())
                .newamt(liaccvVo.getNewamt())
                .newresamt(liaccvVo.getNewresamt())
                .relcshpct(liaccvVo.getRelcshpct())
                .pctresamt(liaccvVo.getPctresamt())
                .totcovamt(liaccvVo.getTotcovamt())
                .addinf(liaccvVo.getAddinf())
                .liaccvg(liaccvVo.getLiaccvg())
                .newrol(liaccvVo.getNewrol())
                .oldredflg(liaccvVo.getOldredflg())
                .cshpct(liaccvVo.getCshpct())
                .oldresamt(liaccvVo.getOldresamt())
                .chgresamt(liaccvVo.getChgresamt())
                .macold(liaccvVo.getMacold())
                .objmodpath(liaccvVo.getObjmodpath())
                .addbut(liaccvVo.getAddbut())
                .glebut(liaccvVo.getGlebut())
                .gleflg(liaccvVo.getGleflg())
                .cbeListJson(liaccvVo.getCbeListJson())
                .build();
    }
}