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.Dbcgrp;
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("dbc.print")
public class DbcPrintServiceImpl implements IBopPrintService<Dbcgrp> {

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

    private String bgimg;

    @Autowired
    Pntmod pntmod;

    @Autowired
    CodetableService codetableService;

    @PostConstruct
    public  void loadBgImg() throws IOException {
        //获取背景图片
        String base64 = new BASE64Encoder().encode(IOUtils.resourceToByteArray("images/BOPCOMDBC.jpg", DbaPrintServiceImpl.class.getClassLoader()));
        bgimg = "data:image/jpg;base64,"+base64;
    }

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

        String checkedSign = pntmod.getCheckedChar();//勾选符
        //下面将要向Map中输入数据
        data.put("date",Utils.fmtDate(credat,"yyyy-MM-dd"));//右上角日期
        data.put("buscode",bopGroup.getBas().getBuscode());//银行业务编号
        data.put("tmpref",bopGroup.getBas().getBuscode());//付款编号
        String methodsCode = bopGroup.getBas().getMethod();
        pntmod.setCodetableData(data, methodsCode,
                "method", "L:G:C:O");				//结算方式：信用证、保函、托收、其它
        //金软的校验需求
  /*
  栏位“结算方式”、“来单币种及金额”和“索汇币种及金额”控制应该如下：当结算方式为“信用证”、“托收”和“其他”时，
  栏位“来单币种及金额”取补录交易（新增交易）中的“实际付款金额”的值，栏位“索汇币种及金额”为空；
  当结算方式为“保函”时，栏位“来单币种及金额”为空，栏位“索汇币种及金额”取补录交易中的“实际付款金额”的值。
  */
        BigDecimal zero = new BigDecimal(0);
        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());//信用证/保函编号lcbgno

        //data.put("txccy_amt",pntmod.getFormatedMoney(bopGroup.getBas().txccy.getValue(),tx_amt1));//来单币种及金额
        data.put("issdate",Utils.fmtDate(bopGroup.getBas().getIssdate(), "yyyy-MM-dd"));//开征日期
        // Long outcharge_amt= bopGroup.getBas().outchargeamt;
        // data.put("outchargeccy_amt",pntmod.getFormatedMoney(bopGroup.getBas().outchargeccy,outcharge_amt));//索汇币种及金额
        data.put("tenor",bopGroup.getBas().getTenor());//期限
        // data.put("expdate",$recgrp);//到期日
        //来单行名称
        //来单行编号
        data.put("oppuser",bopGroup.getBas().getOppuser());//收款人名称
        //收款行名称及地址
        data.put("custnm",bopGroup.getBas().getCustnm());//付款人名称
        //收款行名称及地址
        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);//对私
        }
        if(bopGroup.getBas().getOutchargeamt().compareTo(zero) == 0){
            data.put("outchargeccy_amt","");
        }
        else
        {
            BigDecimal outcharge_amt = bopGroup.getBas().getOutchargeamt();
            data.put("outchargeccy_amt",
                    pntmod.getFormatedMoney(bopGroup.getBas().getOutchargeccy(),outcharge_amt));//扣费币种及金额
        }

        //银行附言？？？？
        pntmod.setSplitCodeNumber(data,bopGroup.getBas().getRptno(), "rptno");	//申报号码

        if(bopGroup.getBas().getTxamt().compareTo(zero)== 0){
            data.put("txccy_amt","");
        }
        else
        {
            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);
        }
        //
        //Long actu_amt = bopGroup.getBas().actuamt.getValue();
        if(bopGroup.getBas().getActuamt().compareTo(zero) == 0){
            data.put("actuccy_amt","");
        }
        else
        {
            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());
            }

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

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

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


            //判断是否需要打印全部信息
        if("1".equals(alonflg)){
            data.put("rptdate",Utils.fmtDate(bopGroup.getDcl().getRptdate(),"yyyy-MM-dd"));//日期,
            pntmod.setSplitCodeNumber(data,bopGroup.getDcl().getCountry(), "country");//收款人常驻国家（地区）名称呢个及代码
            pntmod.setCodetableData(data, bopGroup.getDcl().getIsref(),
                    "isref", "Y:N");			//本笔贷款是否为保税货物下付款：是、否  isref_y  isref_n
            pntmod.setCodetableData(data, bopGroup.getDcl().getPaytype(),
                    "paytype", "A:O");//是否为预付货款
            data.put("regno",bopGroup.getDcl().getRegno()); //外汇局批件编号/备案编号/业务编号

            pntmod.setSplitCodeNumber(data,
                    bopGroup.getDcl().getTxcode(), "txcode");  //! 交易编码1
            if(!MdaUtils.isEmpty(bopGroup.getDcl().getTxcode()))
            {
                BigDecimal tc1_amt = new BigDecimal(0);;
                if(!MdaUtils.isEmpty(bopGroup.getDcl().getTc1amt())){
                    tc1_amt = bopGroup.getDcl().getTc1amt();
                }
                log.debug("-----------------------E");
                data.put("tc1ccyamt",
                        pntmod.getFormatedMoney( bopGroup.getBas().getTxccy(),tc1_amt));//! 币种及金额
            }
            else
            {
                data.put("tc1ccyamt","");
            }
            data.put("txrem", bopGroup.getDcl().getTxrem());		      //! 交易附言
            pntmod.setSplitCodeNumber(data,
                    bopGroup.getDcl().getTxcode2(), "txcode2"); //! 交易编码2
            if(!MdaUtils.isEmpty(bopGroup.getDcl().getTxcode2()))
            {
                BigDecimal tc2amt = new BigDecimal(0);;
                if(!MdaUtils.isEmpty(bopGroup.getDcl().getTc2amt())){
                    tc2amt = bopGroup.getDcl().getTc2amt();
                }
                data.put("tc2ccyamt",
                        pntmod.getFormatedMoney( bopGroup.getBas().getTxccy(),tc2amt));//! 币种及金额2
            }
            else
            {
                data.put("tc2ccyamt","");
            }
            data.put("tx2rem", bopGroup.getDcl().getTx2rem());		    //! 交易附言2
            data.put("crtuser", bopGroup.getDcl().getCrtuser());		  //! 填报人
            data.put("inptelc", bopGroup.getDcl().getInptelc());		  //! 电话
            data.put("rptdate",Utils.fmtDate(bopGroup.getDcl().getRptdate(),"yyyy-MM-dd"));      //申报日期

            data.put("contrno",bopGroup.getVrf().getContrno());//合同号contrno
            data.put("invoino",bopGroup.getVrf().getInvoino());//发票号
            data.put("bilno",bopGroup.getVrf().getBillno());//提运单号

            if(MdaUtils.isEmpty(bopGroup.getVrf().getContamt())){
                data.put("contamt","");
            }
            else
            {
                BigDecimal contamt = bopGroup.getVrf().getContamt();
                data.put("contamt",pntmod.getMoney(contamt));//合同金额contamt
            }
        }



        //同意即期付款、同意承兑并到期付款、申请拒付
        //联系人及电话？？？
        return data;
    }

    @Override
    public Map<String, Object> getInputMapDataForTrn(Dbcgrp 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("srcbnknam",bopTrnBo.getPrbbnknam());
            //来单行编号
            data.put("srcbnkno",bopTrnBo.getPrbref());
            //收款行名称及地址
            data.put("rcvbnknam",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;
    }
}
