package com.brilliance.isc.common.bop.bopdec.service.imp;

import com.brilliance.mda.runtime.mda.util.MdaUtils;
import com.brilliance.isc.bo.bop.bopprint.BopTrnBo;
import com.brilliance.isc.bo.model.Dbfgrp;
import com.brilliance.isc.common.bopset.service.IBopPrintService;
import com.brilliance.isc.common.codetable.service.CodetableService;
import com.brilliance.isc.common.util.Utils;
import org.apache.commons.io.IOUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import sun.misc.BASE64Encoder;

import javax.annotation.PostConstruct;
import java.io.IOException;
import java.math.BigDecimal;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

@Service("dbf.print")
public class DbfPrintServiceImpl implements IBopPrintService<Dbfgrp> {

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

    private String bgimg;

    private String partbgimg;

    @Autowired
    Pntmod pntmod;

    @Autowired
    CodetableService codetableService;

    @PostConstruct
    public  void loadBgImg() throws IOException {
        //获取背景图片
        String base64 = new BASE64Encoder().encode(IOUtils.resourceToByteArray("images/BOPCOMDBF.jpg", DbaPrintServiceImpl.class.getClassLoader()));
        bgimg = "data:image/jpg;base64,"+base64;
        //维护交易部分打印
        String partbase64 = new BASE64Encoder().encode(IOUtils.resourceToByteArray("images/BOPCOMDBFPART.jpg", DbaPrintServiceImpl.class.getClassLoader()));
        partbgimg = "data:image/jpg;base64,"+base64;
    }

    @Override
    public Map<String, Object> getInputMapData(Dbfgrp bopGroup, Date credat,String alonflg) {
        //新申请一个空的Map
        Map<String, Object> data = new HashMap<String, Object>();
        //赋值背景图片
        data.put("bgImg",bgimg);
        data.put("partbgimg",partbgimg);

        String checkedSign = pntmod.getCheckedChar();//勾选符
        BigDecimal zero = new BigDecimal(0);
        //下面将要向Map中输入数据
        //下面将要向Map中输入数据
        pntmod.setSplitCodeNumber(data,bopGroup.getBas().getRptno(), "rptno");//! 申报号码
        data.put("custnm",bopGroup.getBas().getCustnm());//收款人名称
        data.put("basbuscode",bopGroup.getBas().getBuscode());//银行业务编号
        data.put("buscode",bopGroup.getBas().getBuscode());//银行业务编号
        data.put("date", Utils.fmtDate(credat, "yyyy-MM-dd"));//日期
        String methodsCode = bopGroup.getBas().getMethod();
        pntmod.setCodetableData(data, methodsCode,"methods","L:C:O");
        //金软的校验需求
  /*
  栏位“结算方式”、“来单币种及金额”和“索汇币种及金额”控制应该如下：当结算方式为“信用证”、“托收”和“其他”时，
  栏位“来单币种及金额”取补录交易（新增交易）中的“实际付款金额”的值，栏位“索汇币种及金额”为空；
  当结算方式为“保函”时，栏位“来单币种及金额”为空，栏位“索汇币种及金额”取补录交易中的“实际付款金额”的值。
  */
        BigDecimal  tx_amt = bopGroup.getBas().getTxamt();
        BigDecimal  actu_amt = bopGroup.getBas().getActuamt();
  /*20191101根据行内业务要求将“来单币种及金额”和“索汇币种及金额”的值都取交易中的“实际付款金额”的值
  if("G".equals(methodsCode))
  {
  data.put("shccy_amt",pntmod.getFormatedMoney(bopGroup.getBas().actuccy.getValue(),actu_amt));
  }
  else
  {
  data.put("ldccy_amt",pntmod.getFormatedMoney(bopGroup.getBas().actuccy.getValue(),actu_amt));
  }//结算方式：信用证、托收、其它
  */

        data.put("shccy_amt",pntmod.getFormatedMoney(bopGroup.getBas().getTxccy(),tx_amt));
        data.put("ldccy_amt",pntmod.getFormatedMoney(bopGroup.getBas().getTxccy(),tx_amt));
        data.put("lcbgno",bopGroup.getBas().getLcbgno());//信用证编号
        data.put("issdate",Utils.fmtDate(bopGroup.getBas().getIssdate(),"yyyy-MM-dd"));//开征日期
        //索汇币种及金额
        data.put("tenor",bopGroup.getBas().getTenor());//期限
        //到期日
        //来单行名称
        //来单行编号
        data.put("custnm",bopGroup.getBas().getCustnm());//收款人名称
        //收款行名称及地址
        data.put("oppuser",bopGroup.getBas().getOppuser());//付款人名称
        String custypeCode =bopGroup.getBas().getCustype();
        if("C".equals(custypeCode))
        {
            data.put("custype_c", checkedSign);					//! 勾选对公
            pntmod.setSplitCodeNumber(data,
                    bopGroup.getBas().getCustcod(), "custcod");//! 组织机构代码
        }//对公
        else if("D".equals(custypeCode))
        {
            data.put("custype_df", checkedSign);				//! 对私
            data.put("custype_d", checkedSign);					//! 中国居民个人
            data.put("idcode", bopGroup.getBas().getIdcode());		  //! 对私将加入个人身份证号码
        }
        //对私非中国居民
        else if("F".equals(custypeCode))
        {
            data.put("custype_df", checkedSign);				//! 对私
            data.put("custype_f", checkedSign);					//! 非中国居民个人
            data.put("idcode", bopGroup.getBas().getIdcode());			//! 对私将加入个人身份证号码
        }
        //直接忽视掉其他情况（属于异常）
        else
        {
            log.error("data incorrect in 'dbapt',custype not recognized:"+ custypeCode);//对私
        }

        BigDecimal outchargeamt =bopGroup.getBas().getOutchargeamt();
        data.put("outchargeccy_amt",pntmod.getFormatedMoney(bopGroup.getBas().getOutchargeccy(),outchargeamt));//扣费币种及金额

        data.put("actuccy_amt",pntmod.getFormatedMoney(bopGroup.getBas().getActuccy(),actu_amt));//实际付款币种及金额  acttxccy_amt

        ////若为购回支出，则购汇汇率
        if(bopGroup.getBas().getExrate().compareTo(zero) <= 0){
            data.put("exrate","");
        }else
        {
            BigDecimal exrateStr = bopGroup.getBas().getExrate();
            data.put("exrate", exrateStr.toPlainString());
        }

        data.put("txccy_amt",pntmod.getFormatedMoney(bopGroup.getBas().getTxccy(),tx_amt));//付款币种及金额  txccy_amt
        //金额大写
        String amtCn = pntmod.covCnAmt(tx_amt);
        String curtxt = codetableService.getTblLabel(bopGroup.getBas().getTxccy(),"curtxt");
        data.put("txamtcap", curtxt + amtCn);

        if(!MdaUtils.isEmpty(bopGroup.getBas().getLcyamt())){
            BigDecimal l_lcyamt = bopGroup.getBas().getLcyamt();
            data.put("lcyamt",pntmod.getFormatedMoney(bopGroup.getBas().getTxccy(),l_lcyamt));//购汇金额
        }
        data.put("lcyacc", bopGroup.getBas().getLcyacc());  //账号1

        if(!MdaUtils.isEmpty(bopGroup.getBas().getFcyamt())){
            BigDecimal l_fcyamt = bopGroup.getBas().getFcyamt();
            data.put("fcyamt",pntmod.getFormatedMoney(bopGroup.getBas().getTxccy(),l_fcyamt));//现汇金额
        }
        data.put("fcyacc", bopGroup.getBas().getFcyacc());	//账号2

        if(!MdaUtils.isEmpty(bopGroup.getBas().getOthamt())){
            BigDecimal l_othamt = bopGroup.getBas().getOthamt();
            data.put("othamt", pntmod.getFormatedMoney(bopGroup.getBas().getTxccy(),l_othamt));	//其它金额
        }
        data.put("othacc", bopGroup.getBas().getOthacc());  //账号3

        //判断是否需要打印全部信息
        if("1".equals(alonflg)){
            pntmod.setSplitCodeNumber(data,
                    bopGroup.getVrf().getTxcode(), "txcode");  //! 交易编码1
            if(!MdaUtils.isEmpty(bopGroup.getVrf().getTxcode()))
            {
                BigDecimal tc1_amt = new BigDecimal(0);;
                if(!MdaUtils.isEmpty(bopGroup.getVrf().getTc1amt())){
                    tc1_amt = bopGroup.getVrf().getTc1amt();
                }
                data.put("tc1ccyamt",
                        pntmod.getFormatedMoney( bopGroup.getBas().getTxccy(),tc1_amt));//! 币种及金额
            }
            else
            {
                data.put("tc1ccyamt","");
            }

            pntmod.setSplitCodeNumber(data,
                    bopGroup.getVrf().getTxcode2(), "txcode2"); //! 交易编码2
            if(!MdaUtils.isEmpty(bopGroup.getVrf().getTxcode2()))
            {
                BigDecimal tc2amt = new BigDecimal(0);;
                if(!MdaUtils.isEmpty(bopGroup.getVrf().getTc2amt())){
                    tc2amt = bopGroup.getVrf().getTc2amt();
                }
                data.put("tc2ccyamt",
                        pntmod.getFormatedMoney( bopGroup.getBas().getTxccy(),tc2amt));//! 币种及金额2
            }
            else
            {
                data.put("tc2ccyamt","");
            }

            data.put("regno",bopGroup.getVrf().getRegno()); //外汇局批件编号/备案编号/业务编号
            String payattr =bopGroup.getVrf().getPayattr();//付汇性质
            if("X".equals(payattr))
            {
                data.put("payattr_x", checkedSign);					//保税区
            }
            else if("E".equals(payattr))
            {
                data.put("payattr_e", checkedSign);				//出口加工区
            }
            else if("D".equals(payattr))
            {
                data.put("payattr_d", checkedSign);				//钻石交易所
            }
            else if("A".equals(payattr))
            {
                data.put("payattr_a", checkedSign);				//其他特殊经济区
            }
            else if("M".equals(payattr))
            {
                data.put("payattr_m", checkedSign);				//深加工结转
            }
            else if("O".equals(payattr))
            {
                data.put("payattr_o", checkedSign);				//其他
            }
            else
            {
                //doNothing（）			//null
            }
            String country_cod = bopGroup.getVrf().getCountry();
            String[] numCodeAndName = pntmod.getCountryNumCodeAndName(country_cod);
            //pntmod.setSplitCodeNumber(data,numCodeAndName[0], "country");//收款人常驻国家（地区）名称呢个及代码
            pntmod.setSplitCodeNumber(data,bopGroup.getVrf().getCountry(), "country");//收款人常驻国家（地区）名称及代码
            data.put("country_nam",numCodeAndName[1]);//国家名称

            //同意即期付款、同意承兑并到期付款、申请拒付????没有找到相应字段
            data.put("crtuser", bopGroup.getVrf().getCrtuser());
            data.put("inptelc", bopGroup.getVrf().getInptelc());
            data.put("rptdate", Utils.fmtDate(bopGroup.getVrf().getRptdate(),"yyyy-MM-dd"));

            data.put("billno",bopGroup.getVrf().getBillno());//提运单号
            data.put("contrno",bopGroup.getVrf().getContrno());//合同号contrno
            data.put("invoino",bopGroup.getVrf().getInvoino());//发票号
            if(MdaUtils.isEmpty(bopGroup.getVrf().getContamt())){
                data.put("contamt","");
            }else{
                BigDecimal contamt = bopGroup.getVrf().getContamt();
                data.put("contamt",pntmod.getMoney(contamt));
            }

            //data.put("contamt",bopGroup.getVrf().contamt);//合同金额contamt
            pntmod.setCodetableData(data, bopGroup.getVrf().getPaytype(),
                    "paytype", "A:O");//是否为预付货款
            pntmod.setCodetableData(data, bopGroup.getVrf().getIsref(),
                    "isref", "Y:N");      ////本笔贷款是否为保税货物下付款：是、否  isref_y  isref_n
        }

        
        return data;
    }

    @Override
    public Map<String, Object> getInputMapDataForTrn(Dbfgrp bopGroup, Date credate, String alonflg, BopTrnBo bopTrnBo) {
        //先打印申报数据
        Map<String, Object> data = this.getInputMapData(bopGroup,credate,alonflg);
        //补充打印业务信息 若需要
        if(!MdaUtils.isEmpty(bopTrnBo)){
            //到期日
            data.put("expdate",bopTrnBo.getMatdat());
            //来单行名称
            data.put("srcbnknm",bopTrnBo.getPrbbnknam());
            //来单行编号
            data.put("srcbnkcod",bopTrnBo.getPrbref());
            //收款行名称及地址
            data.put("rcvbnknm_add",bopTrnBo.getRcvbnkadr());

            //合同号 管理信息中为空取交易中的
            if(MdaUtils.isEmpty(bopGroup.getVrf().getContrno())){
                data.put("contrno",bopTrnBo.getContrno());
            }

            //发票号 管理信息中为空取交易中的
            if(MdaUtils.isEmpty(bopGroup.getVrf().getInvoino())){
                data.put("invoino",bopTrnBo.getInvoino());
            }

            //银行附言标题-到单日期
            data.put("bnkrem1",bopTrnBo.getBnkrem1());

            //到单日期
            data.put("rcvdat",bopTrnBo.getRcvdat());

            //银行附言标题-单据类型 单据数量
            data.put("bnkrem2",bopTrnBo.getBnkrem2());

            //左侧列单据信息
            data.put("leftdocinfo",bopTrnBo.getLeftdocinfo());

            //右侧列单据信息
            data.put("rightdocinfo",bopTrnBo.getRightdocinfo());

            //银行附言标题-不符点
            data.put("bnkrem3",bopTrnBo.getBnkrem3());

            //不符点
            data.put("docdis",bopTrnBo.getDocdis());

            //银行附言-送达通知
            data.put("bnkrem4",bopTrnBo.getBnkrem4());

            //来单币种及金额
            if(!MdaUtils.isEmpty(bopTrnBo.getDocamt())){
                data.put("ldccy_amt",pntmod.getFormatedMoney(bopTrnBo.getDoccur(),bopTrnBo.getDocamt()));
            }

            //索汇币种及金额
            if(!MdaUtils.isEmpty(bopTrnBo.getPrbamt())){
                data.put("shccy_amt",pntmod.getFormatedMoney(bopTrnBo.getDoccur(),bopTrnBo.getPrbamt()));
            }

        }

        return data;
    }
}
