package com.seeyon.apps.src_powerfeeinvoice.service;

import cn.hutool.log.Log;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.seeyon.apps.src_hxinvoice.util.GzipUtils;
import com.seeyon.apps.src_hxinvoice.util.HxinvoiceHttpUtil;
import com.seeyon.apps.src_hxinvoice.util.TripleDesUtil;
import com.seeyon.apps.src_hxinvoice.vo.HxinvoiceResponse;
import com.seeyon.apps.src_powerfeeinvoice.vo.PowerFeeInvoiceInfo;
import org.apache.commons.codec.binary.Base64;

import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import java.text.SimpleDateFormat;
import java.util.TreeMap;

public class HxInvoiceInfoFillService {
    private static Log log = Log.get(HxInvoiceInfoFillService.class);
    public String getParam(PowerFeeInvoiceInfo invoiceInfo){
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        JSONObject jsonObject = new JSONObject();

        JSONObject DDPCXX = new JSONObject();
        DDPCXX.put("DDQQPCH",invoiceInfo.getReqNo());//订单请求批次号
        DDPCXX.put("NSRSBH",invoiceInfo.getSellerTaxNo());//纳税人识别号
//		001	是	数电专用发票
//		002	是	数电普通发票
//		003	是	数电机动车销售统一发票
//		104	是	数电二手车销售统一发票
//		085	是	数电纸票专用发票
//		086	是	数电纸票普通发票
//		087	是	数电纸票机动车销售统一发票
//		088	是	数电纸票二手车销售统一发票
//		004	否	增值税专用发票
//		005	否	机动车销售统一发票
//		006	否	二手车销售统一发票
//		007	否	增值税普通发票
//		026	否	增值税电子普通发票
//		028	否	增值税电子专用发票
        DDPCXX.put("FPLXDM","002");//发票类型代码
//		DDPCXX.put("ENTID","");//企业组织ID
		DDPCXX.put("KPFS","1");//开票方式0:自动开票;1:手动开票
        jsonObject.put("DDPCXX",DDPCXX);

        JSONArray DDZXXS = new JSONArray();
        for(int i = 0 ; i < 1 ; i++){
            JSONObject DDZXX = new JSONObject();

            JSONObject DDTXX = new JSONObject();
            DDTXX.put("DDQQLSH",invoiceInfo.getOrderTradeNo());//订单请求流水号
            DDTXX.put("KPLX","0");//开票类型0蓝字发票1红字发票
            DDTXX.put("XHFSBH",invoiceInfo.getSellerTaxNo());//销货方纳税人识别号
            DDTXX.put("XHFMC",invoiceInfo.getSellerName());//销货方名称
//            DDTXX.put("XHFDZ","宜昌市港窑路5号");//销货方地址
//            DDTXX.put("XHFDH","0717-6452373");//销货方电话
//			DDTXX.put("XHFYH","");//销货方银行名称
//			DDTXX.put("XHFZH","");//销货方银行账号
//			DDTXX.put("NCPSGZJLXDM","");//农产品收购证件类型代码
//			大小写		不得使用小写字母
//			6～15位		6～15位任意数字字母组合
//			16～18位	6位数字+最大12任意数字字母组合
//						1位字母+6位数字+最大11位任意数字字母组合
//						2位字母+6位数字+最大10位任意数字字母组合
//			19～20位	15位身份证号（考虑最后一位X的情况）+最大5位任意数字字母组合
//						18位身份证号（考虑最后一位X的情况）+最大2位任意数字字母组合
//						1位字母+15位身份证号（考虑最后一位X的情况）+最大4位任意数字字母组合
//						1位字母+18位身份证号（考虑最后一位X的情况）+最大1位任意数字字母组合
//						6位数字+最大14位数字字母组合（不支持字母O、I、S、Z）
//			26位(数电)	由数字和大写字母组成
//			DDTXX.put("GMFBM","");//购买方编码   GMFSBH,GMFMC,GMFDZ,GMFDH,GMFYH,GMFZH,GMFLX
            DDTXX.put("GMFSBH",invoiceInfo.getBuyerTaxNo());//购买方纳税人识别号GMFLX为01时必填;开具专用发票时必填;
            DDTXX.put("GMFMC",invoiceInfo.getBuyer());//购买方名称
//            DDTXX.put("GMFDZ","中国（湖北）自贸区宜昌片区大连路33号清华科技园11栋705-706室");//购买方地址
            DDTXX.put("GMFDH",invoiceInfo.getBuyerPhone());//购买方电话
//			DDTXX.put("GMFYH","");//购买方银行名称
//			DDTXX.put("GMFZH","");//购买方银行账号
            DDTXX.put("GMFLX","04");//购买方类型
            DDTXX.put("GMFSJH",invoiceInfo.getBuyerPhone());//购买方手机
//            DDTXX.put("GMFDZYX","438926402@qq.com");//购买方邮箱
            DDTXX.put("KPR",invoiceInfo.getInvoicer());//开票人
//			DDTXX.put("KPRZJHM","");//开票人证件号码
//			100	单位
//			101	组织机构代码证
//			102	营业执照
//			103	税务登记证
//			199	其他单位证件
//			200	个人
//			201	居民身份证
//			202	军官证
//			DDTXX.put("KPRZJLX","");//开票人证件类型
//			DDTXX.put("SKR","");//收款人
//			DDTXX.put("FHR","");//复核人
            DDTXX.put("JSHJ",invoiceInfo.getTotalPrice());//价税合计
            DDTXX.put("HJJE","0");//合计金额
            DDTXX.put("HJSE","0");//合计税额
            DDTXX.put("BZ",invoiceInfo.getRemark());//备注
			DDTXX.put("DDH",invoiceInfo.getOrderNo());//订单号
			DDTXX.put("DDSJ",invoiceInfo.getDdsj());//订单时间
//			DDTXX.put("YWLX","");//业务类型
//			DDTXX.put("HZXXBBH","");//红字信息表编号
//			DDTXX.put("SFCF","");//是否拆分
//			DDTXX.put("SLKJLY","");//税率开具理由
//			DDTXX.put("YHM","");//电局登录用户名
//			DDTXX.put("SFZSGFDZDH","");//是否展示购方地址电话
//			DDTXX.put("SFZSGFYHZH","");//是否展示购方银行账号
//			DDTXX.put("SFZSXFDZDH","");//是否展示销方地址电话
//			DDTXX.put("SFZSXFYHZH","");//是否展示销方银行账号
//			DDTXX.put("BYZD1","");//备用字段1
//			DDTXX.put("BYZD2","");//备用字段2
//			DDTXX.put("BYZD3","");//备用字段3
//			DDTXX.put("BYZD4","");//备用字段4
//			DDTXX.put("BYZD5","");//备用字段5
			DDTXX.put("SX_CUSTOMERNO",invoiceInfo.getCustomerNo());//客户号
            DDTXX.put("SX_XTLY","SX_OA");//数据的来源系统
            DDZXX.put("DDTXX",DDTXX);

            JSONObject QDTXX = new JSONObject();
//			QDTXX.put("QYDM","");//区域代码
//			QDTXX.put("CEZSLXDM","");//差额征税类型代码
//			QDTXX.put("SGFPLXDM","");//收购发票类型代码
//			QDTXX.put("CKYWSYZCDM","");//出口业务适用政策代码
//			QDTXX.put("ZZSJZJTDM","");//增值税即征即退代码
//			QDTXX.put("ZPPZDM","");//纸票票种代码
//			QDTXX.put("GMFJBR","");//经办人
//			QDTXX.put("JBRSFZJHM","");//经办人身份证件号码
//			QDTXX.put("GMFJBRLXDH","");//经办人联系电话
//			QDTXX.put("JSFS","");//结算方式
//			QDTXX.put("SKYHMC","");//收款银行名称
//			QDTXX.put("SKYHZH","");//收款银行账号
//			QDTXX.put("YSXWFSD","");//应税行为发生地
//			QDTXX.put("JAZSLXDM","");//减按征税类型代码
//			JSONArray FJYSLISTS = new JSONArray();
//			for(int n = 0 ; n < 1 ; n++){
//				JSONObject FJYSLIST = new JSONObject();
//				FJYSLIST.put("FJYSMC","");//附加要素名称
//				FJYSLIST.put("FJYSLX","");//附加要素类型
//				FJYSLIST.put("FJYSZ","");//附加要素值
//				FJYSLISTS.add(FJYSLIST);
//			}
//			QDTXX.put("FJYSLIST",FJYSLISTS);
//			JSONArray CEZSLISTS = new JSONArray();
////			1.开具蓝字发票
////			1.1 CEZSLXDM=01且发票明细行KCE等于0时该节点整体信息非必填；
////			1.2 CEZSLXDM=01且发票明细行KCE大于0时该节点整体信息必填；
////			1.3 CEZSLXDM=02时该节点整体信息必填；
////
////			2.开具红字发票
////			2.1 该节点整体信息非必填；
////			2.2 必须全额冲红，扣除额为负数，其绝对值必须与蓝票扣除额相同
////
////			3.填写时必须填写以下完整的字段信息；
////			for(int n = 0 ; n < 1 ; n++){
////				JSONObject CEZSLIST = new JSONObject();
////				CEZSLIST.put("XH","");//序号
////				CEZSLIST.put("PZLX","");//凭证类型
////				CEZSLIST.put("FPDM","");//发票代码
////				CEZSLIST.put("FPHM","");//发票号码
////				CEZSLIST.put("ZZFPHM","");//纸质发票号码
////				CEZSLIST.put("PZHM","");//凭证号码
////				Date date = new Date();
////				CEZSLIST.put("KJRQ","");//开具日期
////				CEZSLIST.put("HJJE","");//合计金额
////				CEZSLIST.put("KCE","");//扣除额
////				CEZSLIST.put("BZ","");//备注
////				CEZSLIST.put("LRFS","");//录入方式
////				CEZSLIST.put("BCKCJE","");//本次扣除金额
////				CEZSLIST.put("PZHJJE","");//凭证合计金额
////				CEZSLISTS.add(CEZSLIST);
////			}
//			QDTXX.put("CEZSLIST",CEZSLISTS);
            DDZXX.put("QDTXX",QDTXX);

            JSONArray DDMXXXS = new JSONArray();
            for(int n = 0 ; n < 1 ; n++){
                JSONObject DDMXXX = new JSONObject();
//				DDMXXX.put("XH","");//项目序号
//				DDMXXX.put("DYLZFPMXXH","");//对应蓝字发票明细序号
//				如果传递该值,SPBM,ZXBM,YHZCBS,LSLBS,ZZSTSGL,XMMC,GGXH,DW,SPSL,DJ,HSBZ,SL,SE非必填,会使用该值在发票系统维护的数据进行补全,如果上述节点填写数据,则以填写数据为准.
                DDMXXX.put("SPID","");//商品ID
                DDMXXX.put("FPHXZ","0");//发票行性质
                DDMXXX.put("SPBM","1100101020100000000");//商品编码
//				DDMXXX.put("ZXBM","");//自行编码
                DDMXXX.put("YHZCBS","0");//优惠政策标识
//				空：非零税率，1：免税，2：不征税 3:普通零税率
//				若填写了3(普通零税率), 则:
//				YHZCBS填0,ZZSTSGL填空
//				DDMXXX.put("LSLBS","");//零税率标识
//				DDMXXX.put("ZZSTSGL","");//增值税特殊管理
//				DDMXXX.put("XMMC","");//项目名称
//				DDMXXX.put("GGXH","");//规格型号
//				DDMXXX.put("DW","");//单位
//                DDMXXX.put("SPSL","1");//商品数量
                DDMXXX.put("DJ",invoiceInfo.getPrice());//单价
                DDMXXX.put("JE",invoiceInfo.getTotalPrice());//金额
                DDMXXX.put("HSBZ","1");//含税标志
                DDMXXX.put("SL","0.13");//税率
                DDMXXX.put("SE","");//税额
//				DDMXXX.put("KCE","");//扣除额
//				DDMXXX.put("BYZD1","");//备用字段1
//				DDMXXX.put("BYZD2","");//备用字段2
//				DDMXXX.put("BYZD3","");//备用字段3
                DDMXXXS.add(DDMXXX);
            }
            DDZXX.put("DDMXXX",DDMXXXS);
            DDZXXS.add(DDZXX);
        }
        jsonObject.put("DDZXX",DDZXXS);
        return jsonObject.toString();
    }

    public void pushInvoiceInfo(String params,String secretKey,String secretId,String url) throws Exception {
//        String secretKey = "IGedAOlfMsPotl7WXePNPSNdPtjnvn85Tvt9";
//		secretId
//        String secretId = "NfD7rBPYAk1Zod37wqlB4wWdgSFtRgMj";
//		请求类型
        String qingqiu = "POST";
//		接口地址
//        String url = "10.1.10.202:10000/sims-api/invoice/api/v6/GenerateQdInvoice";
//		设置自定义字段
        String dataExchangeId = "20241205";
        String password = secretKey.substring(0, 24);
//		压缩工具类
        GzipUtils gzipUtils = new GzipUtils();
//		加解密工具类
        TripleDesUtil tripleDesUtil = new TripleDesUtil();

        System.out.println(params);
        byte[] src = params.getBytes("UTF-8");
//		判断是否需要加密
        String encryptCode = "1";//固定为1进行加密
        byte[] bys = {};
        if ("1".equals(encryptCode)) {
            //		进行加密
            bys = tripleDesUtil.encryptMode(password, src);
        }
//		判断是否需要压缩
        String zipCode = "1";//固定为1进行压缩
        byte[] gzis = bys;
        if ("1".equals(zipCode)) {
            //		进行压缩
            gzis = gzipUtils.compress(bys);
        }
//		进行baes64加密
        String base64Encoded = Base64.encodeBase64URLSafeString(gzis);
//		设置签名参数
        TreeMap<String, String> treeMap = new TreeMap<>();
        treeMap.put("content", base64Encoded);
        treeMap.put("dataExchangeId", dataExchangeId);
        treeMap.put("encryptCode", encryptCode);
        treeMap.put("secretId", secretId);
        treeMap.put("zipCode", zipCode);
        StringBuilder contentStr = new StringBuilder();
        for (String key : treeMap.keySet()) {
            contentStr.append(key + "=" + treeMap.get(key) + "&");
        }
        String content = contentStr.toString();
        content = content.substring(0, content.length() - 1);
        log.info("水电费开票推送参数: " + content);
        String[] urls = url.split("/");
        String uri = urls[0];
        String fuwu = "/" + urls[1];
        String path = "/" + urls[2] + "/" + urls[3] + "/";
        String banben = urls[4];
        String method = "/" + urls[5];
        String srcStr = qingqiu + uri + fuwu + path + banben + method + "?" + content;
//		进行签名
        SecretKeySpec keySpec = new SecretKeySpec(secretKey.getBytes("UTF-8"), "HmacSHA1");
        Mac mac = Mac.getInstance("HmacSHA1");
        mac.init(keySpec);
        byte[] signBytes = mac.doFinal(srcStr.getBytes("UTF-8"));
//		签名转换成字符串
        String signStr = Base64.encodeBase64URLSafeString(signBytes);
//		设置参数
        JSONObject jsonGenerateQdInvoice = new JSONObject();
        jsonGenerateQdInvoice.put("secretId", secretId);
        jsonGenerateQdInvoice.put("dataExchangeId", dataExchangeId);
        jsonGenerateQdInvoice.put("encryptCode", encryptCode);
        jsonGenerateQdInvoice.put("zipCode", zipCode);
        jsonGenerateQdInvoice.put("content", base64Encoded);
        jsonGenerateQdInvoice.put("signature", signStr);
        System.out.println(jsonGenerateQdInvoice);
        String res = HxinvoiceHttpUtil.doPost("http://" + url, jsonGenerateQdInvoice.toString());
        JSONObject resjson = JSON.parseObject(res);
        String con = resjson.getString("content");
        byte[] decodedBytes = Base64.decodeBase64(con);
        String iszipCode = resjson.getString("zipCode");
        String isencryptCode = resjson.getString("encryptCode");
//            是否需要进行解压
        byte[] dec = decodedBytes;
        if ("1".equals(iszipCode)) {
            dec = gzipUtils.decompress(decodedBytes);
        }
//            是否需要进行解密
        byte[] d = dec;
        if ("1".equals(isencryptCode)) {
            d = tripleDesUtil.decryptMode(password, dec);
        }
        String str = new String(d, "UTF-8");
        HxinvoiceResponse hxinvoiceResponse = HxinvoiceHttpUtil.parseResponse(str);
        if (hxinvoiceResponse.isSuccess()) {
            System.out.println("参数处理完成" + hxinvoiceResponse);
            log.info("开票信息推送成功: " + hxinvoiceResponse.getData());
            System.out.println("推送成功显示" + hxinvoiceResponse.getMsg());
        } else {
            System.out.println(hxinvoiceResponse.getMsg());
            log.info("电费发票信息推送失败: " + hxinvoiceResponse.getMsg());
        }
    }
}
