package com.jeequan.jeepay.core.model.applyment;

import cn.hutool.core.collection.CollUtil;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.jeequan.jeepay.core.entity.MchApplyment;
import com.jeequan.jeepay.core.utils.AmountUtil;
import lombok.Data;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;

import java.math.BigDecimal;
import java.util.HashMap;
import java.util.List;

@Data
public class AllinpayApplymentInfo extends ApplymentBasicInfo {

    /** 客服电话 **/
    private String servicephone;

    /** 结算方式 0-商户自主提现 1-结算到银行卡 2-结算到通联账户 **/
    private String clearMode;

    /** 卡折类型 00-借记卡 01-存折 **/
    private String accttp;

    /** 所属银行 **/
    private String bankcode;

    /** 支行行号 **/
    private String cnapsno;

    /** 经营场所证明文件 url [个人必填] **/
    private String bizplacepic;

    /** 拓展人 **/
    private String expanduser;

    /** 股东身份证人像面 [非个人必填] **/
    private String holderIdcard1Img;

    /** 控股股东姓名 [非个人必填] **/
    private String holdername;

    /** 控股股东身份证号 [非个人必填] **/
    private String holderidno;

    /** 控股股东身份证有效期 [非个人必填] **/
    private String holderexpire;

    /** 注册资本 1(<10w) 2(10-20w) 3(20-50w) 4(50-100w) 5(>100w) [非个人必填] **/
    private String registerfund;

    /** 员工人数 1(<10) 2(10-20) 3(20-50) 4(50-100) 5(>100) [非个人必填] **/
    private String stafftotal;

    /** 经营区域 1-城区 2-郊区 3-边远地区 [非个人必填] **/
    private String operatelimit;

    /** 经营地段 1-商业区 2-工业区 3-住宅区 [非个人必填] **/
    private String inspect;

    /** 是否为三证合一 1-是 0-否 默认：1 **/
    private String thrcertflag;

    /*** 对公账户信息 [企业对私必填] 格式：对公账户号#支付行号#对公账户名称 */
    private String pubacctinfo;

    /*** 业务场景 0-线下 1-线上 默认0 */
    private String offlag;

    /*** 网站url/下载地址/平台名称 [开通网关（含B2B、APP）、快捷、云闪付APP或线上场景必填] */
    private String cusurl;

    /*** 网站名称/应用名称 [开通网关（含B2B、APP）、快捷、云闪付APP或线上场景必填] */
    private String webname;

    /** 法人手机号 **/
    private String persontel;

    /** 性别 1-男 2-女 **/
    private String idcardSex;
    /** 职业
     * 1-国家机关、党群组织、企业、事业单位人员
     * 2-专业技术人员
     * 3-办事人员和有关人员
     * 4-商业、服务业人员
     * 5-农、林、牧、渔、水利业生产人员
     * 6-生产、运输设备操作人员及有关人员
     * 7-军人
     * 8-其他 **/
    private String occupation;

    /*** 通联电子账户号 */
    private String tlbankno;

    /*** 经营场所 1-独立门店、连锁店、专卖店 2-综合卖场 3-批发市场 4-其他 */
    private String businessplace;

    /*** 税务登记号 */
    private String taxregcode;

    /*** 税务登记日期 */
    private String taxcodeexpire;

    /*** 税务登记照片 */
    private String taxcodepic;

    /*** 经营内容 */
    private String busdetail;

    /*** 签字授权书 */
    private String authorpic;

    /*** 结算授权书 */
    private String settauthpic;


    /** 商户类型转换 **/
    public String convertMerchantType() {
        if (MchApplyment.MERCHANT_TYPE_PERSONAL == this.merchantType) {
            // 个人
            return "4";
        }else if (MchApplyment.MERCHANT_TYPE_INDIVIDUAL == this.merchantType) {
            // 个体户
            return "3";
        }else if (MchApplyment.MERCHANT_TYPE_ENTERPRISE == this.merchantType) {
            // 企业
            return "1";
        }
        return "";
    }

    /** 结算账户类型 **/
    public String convertSettType() {
        if (MchApplyment.SETT_ACCOUNT_TYPE_CORPORATE.equals(this.getSettAccountType())) {
            // 对公
            return "1";
        }else if (MchApplyment.SETT_ACCOUNT_TYPE_PERSONAL.equals(this.getSettAccountType())) {
            // 对私
            return "0";
        }
        return "";
    }

    /** 门店信息 **/
    public JSONArray covertStoreInfo() {
        JSONArray array = new JSONArray();
        JSONObject storeJson = new JSONObject();
        /** 门店编号 进件时，为空 **/
        storeJson.put("branchno", "");
        /** 门店名称 **/
        storeJson.put("branchname", this.mchShortName);
        /** 门店地址 **/
        storeJson.put("branchaddr", this.address);
        /** 门店联系人 **/
        storeJson.put("contactperson", this.contactName);
        /** 联系人电话 **/
        storeJson.put("contactphone", this.contactPhone);
        /** 所在区 **/
        storeJson.put("districtcode", this.areaCode.get(2));
        array.add(storeJson);
        return array;
    }

    /** 法人信息 **/
    public String covertLegal() {
        JSONObject legalJson = new JSONObject();
        legalJson.put("persontel", this.persontel);
        legalJson.put("nationality", "中国");
        legalJson.put("sex", "男".equals(this.idcardSex) ? "1":"2");
        legalJson.put("occupation", this.occupation);
        legalJson.put("personaddr", this.idcardAddress);
        return legalJson.toJSONString();
    }

    /** 受益人信息 **/
    public String covertBnf() {
        JSONObject bnfJson = new JSONObject();
        // 是否与法人信息一致 当bnfflag为0时json内其他字段为空
        bnfJson.put("bnfflag", "0");
        return bnfJson.toJSONString();
    }

    /** 图片信息 **/
    public String covertPic() {
        JSONObject picJson = new JSONObject();

        if (MchApplyment.SETT_ACCOUNT_TYPE_PERSONAL.equals(this.getSettAccountType())) {
            /** 银行卡正面照 [账户对私必填] **/
            picJson.put("settlebankpic", this.getSettAccountLicenseImg());
        }else {
            /** 开户许可证照片 [账户对公必填] **/
            picJson.put("acctlicensepic", this.getCompanyAccountLicenseImg());
        }
        if (MchApplyment.MERCHANT_TYPE_PERSONAL == this.getMerchantType() && StringUtils.isNotEmpty(this.getStoreCashierImg())) {
            /** 经营者与店铺门头合照 [商户为个人必填] **/
            picJson.put("peasonheadpic", this.getStoreCashierImg());
        }
        if (!"1".equals(this.thrcertflag) && StringUtils.isNotEmpty(this.getLicenseImg())) {
            /** 组织机构代码证照片 [非三证合一时，可上传组织机构代码证] **/
            picJson.put("orgcodepic", this.getLicenseImg());
        }

        if (StringUtils.isNotEmpty(this.settauthpic)) {
            /** 结算账户授权书 [结算账户对私时，且允许法人与结算账户不一致时，必填] **/
            picJson.put("settauthpic", this.getSettauthpic());
        }
        if (picJson != null) {
            return picJson.toJSONString();
        }
        return null;
    }

    /** 联行号转所属银行号 **/
    public String covertBankNo(String cnapsno) {
        // 联行号不能为空，切长度大于5位
        if (StringUtils.isNotEmpty(cnapsno) && cnapsno.length() > 5) {
            // 截取前三位
            return "0" + cnapsno.substring(0, 3);
        }
        return null;
    }

    /** 支付产品 **/
    public JSONArray convertProduct() {
        JSONArray array = new JSONArray();
        List<PaywayFee> paywayFeeList = this.paywayFeeList;
        // 费率设置列表
        if (paywayFeeList != null && CollectionUtils.isNotEmpty(paywayFeeList)) {
            paywayFeeList.stream().forEach(item -> {
                // 阶梯费率
                if ((item.getWayCode().startsWith("YSF_") || item.getWayCode().startsWith("UP_")) && PaywayFee.FEE_TYPE_LEVEL.equals(item.getFeeType())) {
                    JSONObject feeJson = new JSONObject();
                    // 产品名称
                    feeJson.put("pid", "P0001");
                    // 交易类型
                    feeJson.put("mtrxcode", "VSP551");
                    // 借记卡费率
                    if(CollUtil.isNotEmpty(item.getLevelList())){
                        // 借记手续费
                        feeJson.put("feerate", convertRate(item.getLevelList().get(0).getFeeRate()) + "");
                        // 借记保底
                        feeJson.put("lowlimit", AmountUtil.convertCent2Dollar(item.getMinFee()));
                        // 借记封顶
                        feeJson.put("toplimit", AmountUtil.convertCent2Dollar(item.getMaxFee()));
                    }

                    // 贷记卡费率
                    if(item.getCreditCardPaywayFee() != null && CollUtil.isNotEmpty(item.getCreditCardPaywayFee().getLevelList())){
                        feeJson.put("creditrate", convertRate(item.getCreditCardPaywayFee().getLevelList().get(0).getFeeRate()) + "");
                    }
                    JSONObject feeJson2 = JSONObject.parseObject(feeJson.toJSONString());
                    feeJson2.put("pid", "P0003");
                    feeJson2.remove("toplimit");

//                    JSONObject feeJson3 = JSONObject.parseObject(feeJson.toJSONString());
//                    feeJson3.put("mtrxcode", "VSP591");
                    array.add(feeJson);
                    array.add(feeJson2);
//                    array.add(feeJson3);
                }

                // 支付宝费率
                if (item.getWayCode().startsWith("ALI_") && PaywayFee.FEE_TYPE_SINGLE.equals(item.getFeeType())) {
                    JSONObject aliJsonFee = new JSONObject();
                    // 产品名称
                    aliJsonFee.put("pid", "P0003");
                    // 交易类型
                    aliJsonFee.put("mtrxcode", "VSP511");
                    aliJsonFee.put("feerate", convertRate(item.getFeeRate()));

                    JSONObject feeJson2 = JSONObject.parseObject(aliJsonFee.toJSONString());
                    feeJson2.put("pid", "P0001");
                    array.add(aliJsonFee);
                    array.add(feeJson2);
                }

                // 微信费率
                if (item.getWayCode().startsWith("WX_") && PaywayFee.FEE_TYPE_SINGLE.equals(item.getFeeType())) {
                    JSONObject wxJsonFee = new JSONObject();
                    // 产品名称
                    wxJsonFee.put("pid", "P0003");
                    // 交易类型
                    wxJsonFee.put("mtrxcode", "VSP501");
                    // 商户经营类目
                    wxJsonFee.put("feerate", convertRate(item.getFeeRate()));

                    JSONObject feeJson2 = JSONObject.parseObject(wxJsonFee.toJSONString());
                    feeJson2.put("pid", "P0001");

                    array.add(wxJsonFee);
                    array.add(feeJson2);
                }

            });
        }
        HashMap<String, JSONObject> productMap = new HashMap<>();
        // 去除重复
        JSONArray resultJson = new JSONArray();
        for (int i = 0; i < array.size(); i++) {
            Object json = array.get(i);

            JSONObject jsonParams = JSONObject.parseObject(json.toString());
            String mapKey = jsonParams.getString("pid") + jsonParams.getString("mtrxcode");
            // 重复的配置
            if (productMap.get(mapKey) == null){
                resultJson.add(jsonParams);
            }
            productMap.put(mapKey, jsonParams);
        }
        return resultJson;
    }

    public static String convertRate(BigDecimal rate){
        return rate == null ? null : String.valueOf(rate.multiply(new BigDecimal(1000)).setScale(2, BigDecimal.ROUND_HALF_UP));
    }


    @Override
    public String bankBranchNo() {
        return cnapsno;
    }
}
