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.constants.CS;
import com.jeequan.jeepay.core.model.DBApplicationConfig;
import com.jeequan.jeepay.core.model.oauth2.WxpayOauth2Params;
import com.jeequan.jeepay.core.model.params.dgpay.DgpayIsvParams;
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.ArrayList;
import java.util.List;

@Data
public class DgpayApplymentInfo extends ApplymentBasicInfo {

    /**
     * 1：线下反扫
     * 2：线下公众号
     * 3：线下小程序
     * 4：线上公众号
     * 5：线上小程序
     * 12：线上反扫
     * */
    public static final String PAY_SCENE_OFFLINE_BAR = "1";
    public static final String PAY_SCENE_OFFLINE_JSAPI = "2";
    public static final String PAY_SCENE_OFFLINE_LITE = "3";
    public static final String PAY_SCENE_ONLINE_JSAPI = "4";
    public static final String PAY_SCENE_ONLINE_LITE = "5";
    public static final String PAY_SCENE_ONLINE_BAR = "12";

    /** 企业商户进件请求地址 **/
    public static final String MCH_APPLY_ENT_URL = "/merchant/basicdata/ent";
    /** 个人商户进件请求地址 **/
    public static final String MCH_APPLY_INDV_URL = "/merchant/basicdata/indv";
    /** 商户统一进件请求地址 **/
    public static final String MCH_APPLY_REG_URL = "/merchant/integrate/reg";

    /** 管理员账号 */
    protected String loginUserName;

    /** 公司类型 1：政府机构 2：国营企业 3：私营企业 4：外资企业 5：个体工商户 6：其它组织 7：事业单位*/
    protected String entType;

    /** 结算银行卡绑定手机号 */
    protected String settAccountBindPhone;

    /** 银行编码 */
    protected String bankCode;

    /** 联行号 */
    protected String branchCode;

    /** 支行名称 */
    protected String branchName;

    /** 客服电话  */
    protected String servicePhone;

    /** 组织机构代码证  */
    protected String orgCodePic;

    /** 税务登记证照片  */
    protected String taxRegPic;

    /** 结算卡反面  */
    protected String settBankCardBackImg;

    /** 授权委托书  */
    protected String authEnturstPic;

    /** D1结算协议图片文件  */
    protected String settleAgreePic;

    /** 经营类型 1-实体 2-虚拟  */
    protected String busiType;

    /** 小票名称  */
    protected String receiptName;

    /** 协议类型 0-电子协议 1-纸质协议  */
    protected String agreementType;

    /** 协议号  */
    protected String agreementNo;

    /** 协议模板号 */
    protected String agreementModel;

    /** 协议模板名称 */
    protected String agreementName;

    /** 商户微信配置 业务开通类型 */
    protected String wxFeeType;

    /** 商户微信配置 授权目录 */
    protected String wxWoaPath;

    /** 商户微信配置 微信小程序APPID */
    protected String wxAppletAppId;

    /** 商户微信配置 渠道号 */
    protected String bankChannelNo;

    /** 【结算配置】 业务类型 */
    protected String cashType;

    /** 【结算配置】 手续费类型 */
    protected String selectFeeType;

    /** 【结算配置】 提现手续费（固定/元） */
    protected String fixAmt;

    /** 【结算配置】 费率（百分比/%） */
    protected String feeRate;

    /** 【结算配置】 结算周期 */
    protected String settleCycle;

    /** 【结算配置】 起结金额 */
    protected String minAmt;

    /** 【结算配置】 留存金额 */
    protected String remainedAmt;

    /** 【微信实名认证】 小微经营类型 */
    protected String microBizType;

    /** 【微信实名认证】 申请单号 */
    protected String applymentId;

    /** 支付宝配置对象  */
    protected JSONArray aliConfList;

    /** 微信配置对象  */
    protected JSONArray wxConfList;

    /** 支付宝费率设置参数 MCC **/
    protected String aliFeeMcc;

    /** （银联pos）商务协议 **/
    protected String bankPic;

    /** 银联商户类别 **/
    protected String unionMchType;

    /** 最大分账比例 0-100 （支持两位小数）**/
    protected String applyRatio;

    /** 经度 **/
    protected String longtude;

    /** 纬度 **/
    protected String latitude;

    /** 商户英文名称 **/
    protected String merEnName;

    /** 法人手机号 **/
    protected String idCardPhone;

    /** 法人邮箱 **/
    protected String idCardEmail;

    /** 注册资本 **/
    protected String regCapital;

    /** 斗拱平台综合支付服务协议 **/
    protected String serviceAgreement;

    /** 【商户】斗拱平台综合支付服务功能及价格确认表（纸质合同版） **/
    protected String priceConfirmation;

    /** 签约人法人授权书 **/
    protected String signAuthFileId;

    /** 商户经营内容 **/
    public String licenseBusiness;


    public String getCertValidityType(String effectEnd) {
        if ("长期".equals(effectEnd)) {
            return "1";
        }
        return "0";
    }

    public String getApplymentReqUrl() {
        String reqUrl = "";
        if (this.getMerchantType() == 1) {
            reqUrl = MCH_APPLY_INDV_URL;
        }else {
            reqUrl = MCH_APPLY_ENT_URL;
        }
        return reqUrl;
    }

    /** 支付宝费率配置 **/
    public List<JSONObject> convertAliPayFee(DgpayIsvParams isvParams) {

        ArrayList<JSONObject> result = new ArrayList<>();
        ArrayList<JSONObject> resultOnline = new ArrayList<>();

        List<PaywayFee> paywayFeeList = this.paywayFeeList;
        // 费率设置列表
        if (CollectionUtils.isNotEmpty(paywayFeeList)) {
            paywayFeeList.forEach(item -> {

                // 单笔费率
                if (item.getWayCode().startsWith("ALI_") && PaywayFee.FEE_TYPE_SINGLE.equals(item.getFeeType())) {
                    JSONObject aliJsonFee = new JSONObject();
                    aliJsonFee.put("pay_channel_id", isvParams.getZfbChannelNo());
                    // 支付场景
                    aliJsonFee.put("pay_scene", StringUtils.defaultString(isvParams.getPayScene(), "1"));
                    // 支付宝费率
                    aliJsonFee.put("mcc", this.getMccCode());
                    aliJsonFee.put("fee_rate", convertRate(item.getFeeRate()));
                    result.add(aliJsonFee);
                }

                if (CS.PAY_WAY_CODE.SCAN.equals(item.getWayCode())) {
                    // 线上支付费率
                    JSONObject aliJsonFee = new JSONObject();
                    aliJsonFee.put("pay_channel_id", isvParams.getZfbChannelNo());
                    // 支付场景
                    aliJsonFee.put("pay_scene", StringUtils.defaultString(isvParams.getPayScene(), "1"));
                    // 支付宝费率
                    aliJsonFee.put("mcc", this.getMccCode());
                    aliJsonFee.put("fee_rate", convertRate(item.getFeeRate()));
                    resultOnline.add(aliJsonFee);
                }
            });
        }

        if (!resultOnline.isEmpty()) {
            return resultOnline;
        }

        return result;
    }

    /** 微信费率配置 **/
    public List<JSONObject> convertWxPayFee(DgpayIsvParams isvParams, WxpayOauth2Params wxpayOauth2Params, DBApplicationConfig dbApplicationConfig) {


        ArrayList<JSONObject> result = new ArrayList<>();
        ArrayList<JSONObject> resultOnline = new ArrayList<>();

        List<PaywayFee> paywayFeeList = this.paywayFeeList;

        // 支付场景
        String payScene = StringUtils.defaultString(isvParams.getPayScene(), "1");
        // 费率设置列表
        if (CollectionUtils.isNotEmpty(paywayFeeList)) {
            paywayFeeList.forEach(item -> {

                // 单笔费率
                if (item.getWayCode().startsWith("WX_") && PaywayFee.FEE_TYPE_SINGLE.equals(item.getFeeType())) {
                    JSONObject wxJsonFee = new JSONObject();
//                    // 商户经营类目
//                    wxJsonFee1.put("mcc", this.getMccCode());
                    wxJsonFee.put("mcc", this.getMccCode());
                    wxJsonFee.put("wx_woa_app_id", wxpayOauth2Params.getAppId());
                    wxJsonFee.put("wx_woa_path", dbApplicationConfig.getPaySiteUrl());
                    wxJsonFee.put("wx_applet_app_id", wxpayOauth2Params.getLiteAppId());
                    switch (item.getWayCode()){
                        case CS.PAY_WAY_CODE.WX_BAR: {
                            if ("1".equals(payScene)) {
                                // 支付场景 线下
                                wxJsonFee.put("pay_scene", PAY_SCENE_OFFLINE_BAR);
                                // 手续费
                                wxJsonFee.put("fee_rate", convertRate(item.getFeeRate()));
                                // 费率规则号
                                wxJsonFee.put("fee_rule_id", getFeeRuleId(PAY_SCENE_OFFLINE_BAR));
                            }else {
                                // 支付场景 线上
                                wxJsonFee.put("pay_scene", PAY_SCENE_ONLINE_BAR);
                                // 手续费
                                wxJsonFee.put("fee_rate", convertRate(item.getFeeRate()));
                                // 费率规则号
                                wxJsonFee.put("fee_rule_id", getFeeRuleId(PAY_SCENE_ONLINE_BAR));
                                // 条码线上不上送
                                break;
                            }
                            result.add(wxJsonFee);
                        }
                        break;
                        case CS.PAY_WAY_CODE.WX_JSAPI: {
                            if ("1".equals(payScene)) {
                                // 支付场景 线下
                                wxJsonFee.put("pay_scene", PAY_SCENE_OFFLINE_JSAPI);
                                // 手续费
                                wxJsonFee.put("fee_rate", convertRate(item.getFeeRate()));
                                // 费率规则号
                                wxJsonFee.put("fee_rule_id", getFeeRuleId(PAY_SCENE_OFFLINE_JSAPI));
                            }else {
                                // 支付场景 线上
                                wxJsonFee.put("pay_scene", PAY_SCENE_ONLINE_JSAPI);
                                // 手续费
                                wxJsonFee.put("fee_rate", convertRate(item.getFeeRate()));
                                // 费率规则号
                                wxJsonFee.put("fee_rule_id", getFeeRuleId(PAY_SCENE_ONLINE_JSAPI));
                            }
                            result.add(wxJsonFee);
                        }
                        break;
                        case CS.PAY_WAY_CODE.WX_LITE: {
                            if ("1".equals(payScene)) {
                                // 支付场景 线下
                                wxJsonFee.put("pay_scene", PAY_SCENE_OFFLINE_LITE);
                                // 手续费
                                wxJsonFee.put("fee_rate", convertRate(item.getFeeRate()));
                                // 费率规则号
                                wxJsonFee.put("fee_rule_id", getFeeRuleId(PAY_SCENE_OFFLINE_LITE));
                            }else {
                                // 支付场景 线下
                                wxJsonFee.put("pay_scene", PAY_SCENE_ONLINE_LITE);
                                // 手续费
                                wxJsonFee.put("fee_rate", convertRate(item.getFeeRate()));
                                // 费率规则号
                                wxJsonFee.put("fee_rule_id", getFeeRuleId(PAY_SCENE_ONLINE_LITE));

                            }
                            result.add(wxJsonFee);
                        }
                        break;
                    }
                }

                if (CS.PAY_WAY_CODE.SCAN.equals(item.getWayCode())) {
                    // 线上支付费率
                    JSONObject wxJsonFee = new JSONObject();
                    // 支付场景 线下
                    wxJsonFee.put("pay_scene", PAY_SCENE_OFFLINE_BAR);
                    // 手续费
                    wxJsonFee.put("fee_rate", convertRate(item.getFeeRate()));
                    // 费率规则号
                    wxJsonFee.put("fee_rule_id", getFeeRuleId(PAY_SCENE_OFFLINE_BAR));

                    result.add(wxJsonFee);

                    wxJsonFee = new JSONObject();

                    // 支付场景 线下
                    wxJsonFee.put("pay_scene", PAY_SCENE_OFFLINE_JSAPI);
                    // 手续费
                    wxJsonFee.put("fee_rate", convertRate(item.getFeeRate()));
                    // 费率规则号
                    wxJsonFee.put("fee_rule_id", getFeeRuleId(PAY_SCENE_OFFLINE_JSAPI));

                    result.add(wxJsonFee);

                    wxJsonFee = new JSONObject();

                    // 支付场景 线下
                    wxJsonFee.put("pay_scene", PAY_SCENE_OFFLINE_LITE);
                    // 手续费
                    wxJsonFee.put("fee_rate", convertRate(item.getFeeRate()));
                    // 费率规则号
                    wxJsonFee.put("fee_rule_id", getFeeRuleId(PAY_SCENE_OFFLINE_LITE));

                    result.add(wxJsonFee);
                }
            });
        }

        if (!resultOnline.isEmpty()) {
            return resultOnline;
        }

        return result;
    }

    /** 银联费率 **/
    public List<JSONObject> convertUniPayFee() {
        ArrayList<JSONObject> list = new ArrayList<>();
        List<PaywayFee> paywayFeeList = this.paywayFeeList;
        JSONObject feeJson = new JSONObject();
        // 费率设置列表
        if (CollectionUtils.isNotEmpty(paywayFeeList)) {
            paywayFeeList.forEach(item -> {
                // 阶梯费率
                if ((item.getWayCode().startsWith("YSF_") || item.getWayCode().startsWith("UP_")) && PaywayFee.FEE_TYPE_LEVEL.equals(item.getFeeType())) {
                    // 手续费类型 03-标准类
                    feeJson.put("charge_cate_code", "03");
                    // 借记卡费率
                    if(CollUtil.isNotEmpty(item.getLevelList())){
                        // 借记卡手续费费率（单笔交易≤1000元） 参数单位为‰
                        // 借记手续费
                        feeJson.put("debit_fee_rate_down", convertRate(item.getLevelList().get(0).getFeeRate()) + "");
                        // 借记封顶
                        feeJson.put("debit_fee_limit_down", AmountUtil.convertCent2Dollar(item.getMaxFee()));

                        // 借记卡手续费费率（单笔交易>1000元） 参数单位为‰
                        // 借记手续费
                        feeJson.put("debit_fee_rate_up", convertRate(item.getLevelList().get(1).getFeeRate()) + "");
                        // 借记封顶
                        feeJson.put("debit_fee_limit_up", AmountUtil.convertCent2Dollar(item.getMaxFee()));
                    }

                    // 贷记卡费率
                    if(item.getCreditCardPaywayFee() != null && CollUtil.isNotEmpty(item.getCreditCardPaywayFee().getLevelList())){
                        // 贷记卡手续费费率 （单笔交易≤1000元） 参数单位为‰
                        feeJson.put("credit_fee_rate_down", convertRate(item.getCreditCardPaywayFee().getLevelList().get(0).getFeeRate()) + "");

                        // 贷记卡手续费费率（单笔交易>1000元） 参数单位为‰
                        feeJson.put("credit_fee_rate_up", convertRate(item.getCreditCardPaywayFee().getLevelList().get(1).getFeeRate()) + "");
                    }
                    feeJson.put("mcc", this.getMccCode());
                }

                if (CS.PAY_WAY_CODE.SCAN.equals(item.getWayCode())) {
                    // 线上费率
                    feeJson.put("charge_cate_code", "03");

                    // 借记卡手续费费率（单笔交易≤1000元） 参数单位为‰
                    // 借记手续费
                    feeJson.put("debit_fee_rate_down", convertRate(item.getFeeRate()) + "");
                    // 借记封顶
                    feeJson.put("debit_fee_limit_down", "20");

                    // 借记卡手续费费率（单笔交易>1000元） 参数单位为‰
                    // 借记手续费
                    feeJson.put("debit_fee_rate_up", convertRate(item.getFeeRate()) + "");
                    // 借记封顶
                    feeJson.put("debit_fee_limit_up", "20");
                    // 借记封顶
//                    feeJson.put("debit_fee_limit_up", AmountUtil.convertCent2Dollar(item.getMaxFee()));

                    // 贷记卡手续费费率 （单笔交易≤1000元） 参数单位为‰
                    feeJson.put("credit_fee_rate_down", convertRate(item.getFeeRate()) + "");

                    // 贷记卡手续费费率（单笔交易>1000元） 参数单位为‰
                    feeJson.put("credit_fee_rate_up", convertRate(item.getFeeRate()) + "");

                    feeJson.put("mcc", this.getMccCode());
                }

            });
        }

        if (StringUtils.isNotEmpty(feeJson.getString("mcc"))) {
            list.add(feeJson);
        }
        return list;
    }

    /** 银行卡费率 **/
    public JSONObject convertBankPayFee() {
        List<PaywayFee> paywayFeeList = this.paywayFeeList;
        JSONObject feeJson = new JSONObject();
        // 费率设置列表
        if (CollectionUtils.isNotEmpty(paywayFeeList)) {
            paywayFeeList.forEach(item -> {

                // 阶梯费率
                if (("AUTO_POS".equals(item.getWayCode()) && PaywayFee.FEE_TYPE_LEVEL.equals(item.getFeeType()))) {
                    // 手续费类型 03-标准类
                    feeJson.put("charge_cate_code", "03");
                    // 	商户经营类目（底层接口）
                    feeJson.put("mcc", this.getMccCode());
                    // 借记卡费率
                    if(CollUtil.isNotEmpty(item.getLevelList())){
                        // 云闪付贷记卡手续费1000以下（%）
                        feeJson.put("cloud_credit_fee_rate_down", convertRate(item.getLevelList().get(0).getFeeRate()) + "");
                        // 云闪付借记卡封顶1000以下(元)
                        feeJson.put("cloud_debit_fee_limit_down", AmountUtil.convertCent2Dollar(item.getMaxFee()));

                        // 借记卡手续费（%）
                        feeJson.put("debit_fee_rate", convertRate(item.getLevelList().get(0).getFeeRate()) + "");
                        // 借记卡封顶值
                        feeJson.put("debit_fee_limit", AmountUtil.convertCent2Dollar(item.getMaxFee()));

                        // 云闪付借记卡手续费1000以上（%）
                        feeJson.put("cloud_debit_fee_rate_up", convertRate(item.getLevelList().get(1).getFeeRate()) + "");
                        // 云闪付借记卡封顶1000以上(元)
                        feeJson.put("cloud_debit_fee_limit_up", AmountUtil.convertCent2Dollar(item.getMaxFee()));
                    }

                    // 贷记卡费率
                    if(item.getCreditCardPaywayFee() != null && CollUtil.isNotEmpty(item.getCreditCardPaywayFee().getLevelList())){
                        // 贷记卡手续费（%）
                        feeJson.put("credit_fee_rate", convertRate(item.getCreditCardPaywayFee().getLevelList().get(0).getFeeRate()) + "");
                        // 云闪付借记卡手续费1000以下（%）
                        feeJson.put("cloud_debit_fee_rate_down", convertRate(item.getCreditCardPaywayFee().getLevelList().get(0).getFeeRate()) + "");
                        // 云闪付贷记卡手续费1000以上（%）
                        feeJson.put("cloud_credit_fee_rate_up", convertRate(item.getCreditCardPaywayFee().getLevelList().get(1).getFeeRate()) + "");
                    }
                }

                if (CS.PAY_WAY_CODE.SCAN.equals(item.getWayCode())) {
                    // 云闪付贷记卡手续费1000以下（%）
                    feeJson.put("cloud_credit_fee_rate_down", convertRate(item.getFeeRate()) + "");
                    // 云闪付借记卡封顶1000以下(元)
                    feeJson.put("cloud_debit_fee_limit_down", "20");

                    // 借记卡手续费（%）
                    feeJson.put("debit_fee_rate", convertRate(item.getFeeRate()) + "");
                    // 借记卡封顶值
                    feeJson.put("debit_fee_limit", "20");

                    // 云闪付借记卡手续费1000以上（%）
                    feeJson.put("cloud_debit_fee_rate_up", convertRate(item.getFeeRate()) + "");
                    // 云闪付借记卡封顶1000以上(元)
                    feeJson.put("cloud_debit_fee_limit_up", "9999");

                    // 贷记卡手续费（%）
                    feeJson.put("credit_fee_rate", convertRate(item.getFeeRate()) + "");
                    // 云闪付借记卡手续费1000以下（%）
                    feeJson.put("cloud_debit_fee_rate_down", convertRate(item.getFeeRate()) + "");
                    // 云闪付贷记卡手续费1000以上（%）
                    feeJson.put("cloud_credit_fee_rate_up", convertRate(item.getFeeRate()) + "");
                }

            });
        }
        return feeJson;
    }

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

    private String getFeeRuleId(String payScene){

        if (this.getMerchantType() != null && this.getMerchantType() == 1) {
            // 个人
            if ("1".equals(payScene) || "2".equals(payScene) || "3".equals(payScene)) {
                return "770";
            }else if ("4".equals(payScene) || "5".equals(payScene)) {
                return "775";
            }
        }else if (this.getMerchantType() != null && this.getMerchantType() == 3) {
            // 企业
            if ("1".equals(payScene) || "2".equals(payScene) || "3".equals(payScene)) {
                if ("3".equals(this.entType)) {
                    return "758";
                }else {
                    return "762";
                }
            }else if ("4".equals(payScene) || "5".equals(payScene)) {
                if ("3".equals(this.entType)) {
                    return "756";
                }else {
                    return "761";
                }
            }
        }
        return null;
    }

    /** 银联小微入驻信息实体 **/
    public String getMicroInfo() {
        JSONObject resJson = new JSONObject();
        // 银联商户类别
        resJson.put("mchnt_type", this.getUnionMchType());
        // 商户经度
        resJson.put("mer_lng", this.longtude);
        // 商户纬度
        resJson.put("mer_lat", this.latitude);
        // 店铺名称
        resJson.put("shop_name", this.mchFullName);
        // 商户经营类目
        resJson.put("mcc", this.getMccCode());
        return resJson.toJSONString();
    }

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