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

import com.brilliance.mda.runtime.mda.IStream;
import com.brilliance.mda.runtime.mda.impl.StreamImpl;
import com.brilliance.mda.runtime.mda.util.MdaUtils;
import com.brilliance.mda.runtime.mda.util.Streams;
import com.brilliance.mda.runtime.mda.util.Strings;
import com.brilliance.isc.bo.Pty;
import com.brilliance.isc.common.cache.pty.PtyCacheService;
import com.brilliance.isc.common.component.PtsptaToolComponent;
import com.brilliance.isc.common.umdcus.service.UmdcusService;
import com.brilliance.isc.common.umdmod.service.UmdmodService;
import com.brilliance.isc.common.umdmod.vo.TranVo;
import com.brilliance.isc.common.umdmod.vo.UmdmodVo;
import com.brilliance.isc.common.vo.PtsptaVo;
import com.brilliance.isc.mda.dao.PtyMapper;
import com.brilliance.isc.utils.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;

@Service
public class UmdcusServiceImpl implements UmdcusService {
    @Autowired
    private PtyCacheService ptyCacheService;
    @Autowired
    private UmdmodService umdmodService;
    @Autowired
    private PtsptaToolComponent ptsptaToolComponent;

    /**
     * source:umdcus.0001.script
     */
    public void addCheckCustByRol(String extkey, String argRol, UmdmodVo umdmodVo) {
        //!参数：
        //!   -Arggrp : 业务模块
        //!   -ArgRol : 角色
        //!

        String ptyinr = getPtyInrByRol(argRol, umdmodVo.getPtsptas());
        String custName = "";
        Pty pty = ptyCacheService.getPtyById(ptyinr);
        if (pty != null) {
            custName = pty.getNam1();
        }
        List<TranVo> tranVos = umdmodVo.getTRANS();
        if (MdaUtils.isEmpty(tranVos)) {
            tranVos = new ArrayList<>();
        }
        TranVo tranVo = new TranVo();
        tranVo.setCUST_NAME(custName);
        tranVo.setREL_TYPE("01");
        tranVo.setCUST_TYPE("2");

        tranVos.add(tranVo);
        umdmodVo.setTRANS(tranVos);
    }

    @Override
    public void addCheckCustByRol(PtsptaVo ptsptaVo, UmdmodVo umdmodVo) {
        if (ptsptaToolComponent.ptsIsRolSet(ptsptaVo)) {
            String ptyinr = ptsptaVo.getPtyinr();
            String custName = "";
            Pty pty = ptyCacheService.getPtyById(ptyinr);
            if (pty != null) {
                custName = pty.getNam1();
            }
            TranVo tranVo = new TranVo();
            tranVo.setCUST_NAME(custName);
            tranVo.setREL_TYPE("01");
            tranVo.setCUST_TYPE("2");
            umdmodVo.addTran(tranVo);
        }
    }

    public String getPtyInrByRol(String rol, List<PtsptaVo> pts) {

        for (PtsptaVo ptyvo : pts) {
            if (rol.equals(ptyvo.getRol())) {
                return ptyvo.getPtyinr();
            }
        }
        return "";
    }

    public void addCheckOthParty(UmdmodVo umdmodVo, String argRol, String argPartyName) {

        PtsptaVo ptsptaVo = umdmodService.getPtsptaFromPtslist(umdmodVo.getPtsptas(), argRol);
        // 有些parties先设置完之后，之后再删除rol可能没有删除，使用ptsIsRolSet会更准确
        if(!ptsptaToolComponent.ptsIsRolSet(ptsptaVo)){
            return;
        }

        List<TranVo> tranVos = umdmodVo.getTRANS();
        if (MdaUtils.isEmpty(tranVos)) {
            tranVos = new ArrayList<>();
        }
        TranVo tranVo = new TranVo();
        tranVo.setCUST_NAME(argPartyName);
        tranVo.setREL_TYPE("03");
        tranVo.setCUST_TYPE("2");

        tranVos.add(tranVo);
        umdmodVo.setTRANS(tranVos);
    }

    @Override
    public void addCheckOthParty(UmdmodVo umdmodVo, PtsptaVo ptsptaVo, String argPartyName) {
        if (ptsptaToolComponent.ptsIsRolSet(ptsptaVo) && StringUtils.isNotEmpty(argPartyName)) {
            TranVo tranVo = new TranVo();
            tranVo.setCUST_NAME(argPartyName);
            tranVo.setREL_TYPE("03");
            tranVo.setCUST_TYPE("2");
            umdmodVo.addTran(tranVo);
        }
    }

    public String getPtyExtkeyByRol(String rol, List<PtsptaVo> pts) {

        for (PtsptaVo ptyvo : pts) {
            if (rol.equals(ptyvo.getRol())) {
                return ptyvo.getExtkey();
            }
        }
        return "";
    }

    public void umdcusAddCheck(UmdmodVo umdmodVo, String extkey, String argname, String argtyp, String argcustyp) {
        if (MdaUtils.isEmpty(extkey)) {
            return;
        }
        List<TranVo> tranVos = umdmodVo.getTRANS();
        if (MdaUtils.isEmpty(tranVos)) {
            tranVos = new ArrayList<>();
        }
        TranVo tranVo = new TranVo();
        tranVo.setCUST_NAME(argname);
        tranVo.setREL_TYPE(argtyp);
        tranVo.setCUST_TYPE(argcustyp);
        tranVo.setNAT("");


        tranVos.add(tranVo);
        umdmodVo.setTRANS(tranVos);
    }


//    /**
//     * source:umdcus.0012.script
//     */
//    public void umdcusAddCheckInc(UmdmodVo umdmodVo, String argExtkey, String argName, String argTyp, String argCusTyp, String nat, String tnat, String addinf) {
//        //! 添加交易对手客户信息名单检核
//        //! copy from UmdcusAddCheckOth, ArgExtkey can be null
//        //!================================
//        //!- id : id
//        //!- ArgExtkey: 客户号
//        //!- ArgName: 客户名称
//        //!- ArgTyp：筛选类型 01- 我行客户  03-对手客户
//        //!- ArgCusTyp:客户类型 1-个人  2-实体
//        //!- NAT: 国籍/注册国家（地区）  单证交易：交易对手国别送此字段
//        //!- TNAT: 汇往国家（地区）/汇入国家（地区）	汇款交易：收款人常驻国家/地区代码
//        //!- Addinf：预留字段
//        //CUSTYP=
//        //ACCNUM= 账号
//        //NATCOD= 国籍/注册国家（地区）  单证交易：交易对手国别送此字段
//        //TNATCO= 汇往国家（地区）/汇入国家（地区）	汇款交易：收款人常驻国家/地区代码
//        //!================================
//        // 1. nothing to do if no party no. used
//        if (MdaUtils.isEmpty(argExtkey)) {
//            return;
//        }
//        // e.g    custtype  accountno
//        //  CUSTYP=01 CR ACCNUM=2000145001
//        String custtype = "";
//        String accountno = "";
//        String vnat = nat;
//        String vtnat = tnat;
//        String swiftno = "";
//        String cusnam = Strings.trim(argName);
//        if (Strings.len(cusnam) > 128) {
//            cusnam = Strings.trim(Strings.mid(cusnam, 1, 128));
//        }
//        IStream addstm = new StreamImpl();
//        int stmcnt = 0;
//        String addline = "";
//        if (!MdaUtils.isEmpty(addinf)) {
//            Streams.streamSet(addstm, addinf);
//            stmcnt = Streams.streamCount(addstm);
//            for (int i = 1; i <= stmcnt; i++) {
//                addline = Strings.getLine(addstm, i);
//                switch (Strings.toUpper(Strings.mid(addline, 1, 6))) {
//                    case "CUSTYP":
//                        custtype = Strings.mid(addline, 8);
//                        break;
//                    case "ACCNUM":
//                        accountno = Strings.mid(addline, 8);
//                        break;
//                    case "NATCOD":
//                        vnat = Strings.mid(addline, 8);
//                        break;
//                    case "TNATCO":
//                        vtnat = Strings.mid(addline, 8);
//                        break;
//                    case "SWFTNO":
//                        swiftno = Strings.mid(addline, 8);
//                        break;
//                }
//            }
//        }
//        TranVo tranVo = new TranVo();
//        tranVo.setCUST_NAME(cusnam);
//        tranVo.setREL_TYPE(argTyp);
//        tranVo.setCUST_TYPE(argCusTyp);
//        tranVo.setNAT(vnat);
//        tranVo.setT_NAT(vtnat);
//        tranVo.setACCOUNT_NO(accountno);
//        tranVo.setSWIFT_NO(swiftno);
//        umdmodVo.addTran(tranVo);
//    }

    public void umdcusAddCheckInc(UmdmodVo umdmodVo, String argname, String argtyp, String argcustyp, String nat, String tnat, String swiftno, String accountno) {
        if (StringUtils.isEmpty(argname) && StringUtils.isEmpty(accountno) &&
                StringUtils.isEmpty(tnat) &&
                StringUtils.isEmpty(nat) &&
                StringUtils.isEmpty(swiftno)) {
            return;
        }
        List<TranVo> tranVos = umdmodVo.getTRANS();
        if (MdaUtils.isEmpty(tranVos)) {
            tranVos = new ArrayList<>();
        }
        TranVo tranVo = new TranVo();
//       umdmodVo.setCUST_NO(extkey);
        tranVo.setCUST_NAME(argname);
        tranVo.setREL_TYPE(argtyp);
        tranVo.setCUST_TYPE(argcustyp);
        tranVo.setNAT(nat);
        tranVo.setT_NAT(tnat);
        tranVo.setACCOUNT_NO(accountno);
        tranVo.setSWIFT_NO(swiftno);


        tranVos.add(tranVo);
        umdmodVo.setTRANS(tranVos);
    }

    public void umdcusAddCheckInc(UmdmodVo umdmodVo, String argname, String argtyp, String argcustyp, String nat, String tnat, String swiftno, String accountno , String celist) {
        if (StringUtils.isEmpty(argname) && StringUtils.isEmpty(accountno) &&
                StringUtils.isEmpty(tnat) &&
                StringUtils.isEmpty(nat) &&
                StringUtils.isEmpty(swiftno) &&
                StringUtils.isEmpty(celist)) {
            return;
        }
        List<TranVo> tranVos = umdmodVo.getTRANS();
        if (MdaUtils.isEmpty(tranVos)) {
            tranVos = new ArrayList<>();
        }
        TranVo tranVo = new TranVo();
        tranVo.setCUST_NAME(argname);
        tranVo.setREL_TYPE(argtyp);
        tranVo.setCUST_TYPE(argcustyp);
        tranVo.setNAT(nat);
        tranVo.setT_NAT(tnat);
        tranVo.setACCOUNT_NO(accountno);
        tranVo.setSWIFT_NO(swiftno);
        tranVo.setCE_LIST(celist);

        tranVos.add(tranVo);
        umdmodVo.setTRANS(tranVos);
    }

    public void umdcusAddCheckOth(UmdmodVo umdmodVo, String extkey, String argname, String argtyp, String argcustyp, String nat, String tnat) {
        if (MdaUtils.isEmpty(extkey)) {
            return;
        }
        TranVo tranVo = new TranVo();
        tranVo.setCUST_NAME(argname);
        tranVo.setREL_TYPE(argtyp);
        tranVo.setCUST_TYPE(argcustyp);
        tranVo.setNAT(nat);
        tranVo.setT_NAT(tnat);
        umdmodVo.addTran(tranVo);
    }
}
