package com.cool.store.enums;

import com.aliyun.openservices.shade.org.apache.commons.lang3.StringUtils;
import com.cool.store.constants.CommonConstants;
import lombok.extern.slf4j.Slf4j;

import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.util.Map;
import java.util.Objects;
import java.util.StringJoiner;

/**
 * @author zhangchenbiao
 * @FileName: MessageEnum
 * @Description:
 * @date 2024-03-27 10:50
 */
@Slf4j
public enum MessageEnum {

    MESSAGE_1("您有一份加盟意向申请，请查收。", "加盟商姓名：${partnerUsername}\n手机号码：${partnerMobile}\n"),
    MESSAGE_2("您收到一份邀约面谈预约，请查收", "加盟商姓名：${partnerUsername}\n预约时间：${appointmentTime}\n"),
    MESSAGE_3("您收到一份一次面审预约，请查收", "##### 加盟商姓名：${partnerUsername}\n##### 预约时间：${appointmentTime}\n"),
    MESSAGE_3_1("您的线索已预约一次面审，请关注", "##### 加盟商姓名：${partnerUsername}\n面审官：${interviewUsername}\n##### 预约时间：${appointmentTime}\n"),
    MESSAGE_4("您有线索未通过面审，请查收", "##### 加盟商姓名：${partnerUsername}\n##### 面审时间：${interviewTime}\n##### 面审官：${interviewUsername}\n"),
    MESSAGE_5("您收到一份缴纳意向金审核，请查收", "加盟商姓名：${partnerUsername}\n手机号码：${partnerMobile}\n"),
    MESSAGE_6("您有一份加盟意向协议待提交，请查收", "加盟商姓名：${partnerUsername}\n手机号码：${partnerMobile}\n"),
    MESSAGE_7("您提交的一份加盟意向协议OA审核未通过，请查收", "##### 加盟商姓名：${partnerUsername}\n##### 审批提交时间：${submitTime}\n"),
    MESSAGE_8("您有一位加盟商待安排体验门店及体验时间，请查收", "##### 加盟商姓名：${partnerUsername}\n##### 手机号码：${partnerMobile}\n"),
    MESSAGE_9("您有一位加盟商已放弃门店体验，请查收", "##### 加盟商姓名：${partnerUsername}\n##### 手机号码：${partnerMobile}\n"),
    MESSAGE_10("您收到一份二次面审预约，请查收", "##### 加盟商姓名：${partnerUsername}\n##### 预约时间：${appointmentTime}\n"),
    MESSAGE_10_1("您的线索已预约二次面审，请关注", "##### 加盟商姓名：${partnerUsername}\n面审官：${interviewUsername}\n##### 预约时间：${appointmentTime}\n"),
    MESSAGE_11("您的一个铺位已审核通过，请查收", "铺位名称：${pointName}\n铺位地址：${pointAddress}\n"),
    MESSAGE_12("您的一个铺位审核未通过，请查收", "铺位名称：${pointName}\n铺位地址：${pointAddress}\n未通过原因：${reason}\n"),
    MESSAGE_13("您有一个铺位需要审核，请查收", "铺位名称：${pointName}\n铺位地址：${pointAddress}"),
    MESSAGE_14("已为您分配一位加盟商，待推送铺位，请查收", "加盟商姓名：${partnerUsername}\n手机号码：${partnerMobile}\n"),
    MESSAGE_15("您有一份加盟商上传的租赁合同待审核，请查收", "加盟商姓名：${partnerUsername}\n手机号码：${partnerMobile}\n"),
    MESSAGE_16("您有一家门店待提交系统建店申请，请查收", "##### 门店名称：${storeName}\n##### 加盟商姓名：${partnerUsername}\n##### 加盟商手机号码：${partnerMobile}\n"),
    MESSAGE_16_1("您有一家门店待提交系统建店申请，请查收", "##### 加盟商姓名：${partnerUsername}\n##### 加盟商手机号码：${partnerMobile}\n"),
    MESSAGE_17("您收到一份证照信息审核申请，请查收", "##### 门店名称：${storeName}\n##### 加盟商姓名：${partnerUsername}\n##### 加盟商手机号码：${partnerMobile}\n"),
    MESSAGE_18("您有一个门店已缴纳加盟费/保证金，请审核", " 门店名称：${storeName}\n 加盟商姓名：${partnerUsername}\n 加盟商手机号码：${partnerMobile}\n"),
    MESSAGE_19("您有一个门店待提交加盟合同，请查收", "门店名称：${storeName}\n加盟商姓名：${partnerUsername}\n加盟商手机号码：${partnerMobile}\n"),
    MESSAGE_19_1("您有一个门店加盟合同待审核，请查收", "门店名称：${storeName}\n加盟商姓名：${partnerUsername}\n加盟商手机号码：${partnerMobile}\n"),
    MESSAGE_20("您有一个门店的加盟合同审核未通过，请查收", "##### 门店名称：${storeName}\n##### 加盟商姓名：${partnerUsername}\n##### 加盟商手机号码：${partnerMobile}\n"),
    MESSAGE_21("您有一个门店待提交培训人员，请查收", "加盟商姓名：${partnerUsername}\n手机号码：${partnerMobile}"),
    MESSAGE_22("您收到一位员工由您带教，请查收", "员工姓名：【${userName}】，员工手机号码：【${mobile}】，登记时间：【${registerTime}】"),
    MESSAGE_23("您有一个门店待发布加盟费/保证金账单，请查收", "加盟商姓名：${partnerUsername}\n加盟商手机号码：${partnerMobile}\n"),
    MESSAGE_24("您有一个门店待预约三方验收时间，请查收", "门店名称：${storeName}\n加盟商姓名：${partnerUsername}\n加盟商手机号码：${partnerMobile}\n"),
    MESSAGE_25("您有一个门店待进行三方验收，请查收","##### 门店名称：${storeName}\n##### 加盟商姓名：${partnerUsername}\n##### 加盟商手机号码：${partnerMobile}\n"),
    MESSAGE_26("您有一个门店需要上传开业运营方案，请查收","门店名称：${storeName}\n加盟商姓名：${partnerUsername}\n加盟商手机号码：${partnerMobile}\n"),
    MESSAGE_27("您有一个门店需要上传首批订货清单，请查收","##### 门店名称：${storeName}\n##### 加盟商姓名：${partnerUsername}\n##### 加盟商手机号码：${partnerMobile}\n"),
    MESSAGE_28("您有一个门店需要进行视觉验收，请查收","##### 门店名称：${storeName}\n##### 加盟商姓名：${partnerUsername}\n##### 加盟商手机号码：${partnerMobile}\n"),

    MESSAGE_29("您有一份加盟申请书，请查收","##### 加盟商姓名：${partnerUsername}\n##### 加盟商手机号码：${partnerMobile}\n##### 意向加盟区域：${regionName}\n"),
    MESSAGE_30("您收到一份加盟意向协议信息审核，请查收","##### 加盟商姓名：${partnerUsername}\n##### 加盟商手机号码：${partnerMobile}\n##### 信息提交时间：${submitTime}\n"),
    MESSAGE_31("您提交的一份加盟意向协议OA审核未通过，请查收","##### 加盟商姓名：${partnerUsername}\n##### 信息提交时间：${submitTime}\n"),
    MESSAGE_32("您有一位加盟商待安排体验门店及体验时间，请查收","##### 加盟商姓名：${partnerUsername}\n##### 加盟商手机号码：${partnerMobile}\n"),
    MESSAGE_33("您有一位加盟商已放弃门店体验，请查收","##### 加盟商姓名：${partnerUsername}\n##### 加盟商手机号码：${partnerMobile}\n"),


    MESSAGE_34("您有一个门店待提交发票，请查收","门店名称：${storeName}\n加盟商姓名：${partnerUsername}\n加盟商手机号码：${partnerMobile}\n"),
    MESSAGE_35("您有一个门店设计阶段待提交，请查收","门店名称：${storeName}\n加盟商姓名：${partnerUsername}\n加盟商手机号码：${partnerMobile}\n"),
    MESSAGE_36("您有一个门店施工阶段待提交，请查收","门店名称：${storeName}\n加盟商姓名：${partnerUsername}\n加盟商手机号码：${partnerMobile}\n"),
    MESSAGE_37("您有一个门店装修验收待验收，请查收","门店名称：${storeName}\n加盟商姓名：${partnerUsername}\n加盟商手机号码：${partnerMobile}\n"),
    MESSAGE_38("您有一个门店POS信息待提交，请查收","门店名称：${storeName}\n加盟商姓名：${partnerUsername}\n加盟商手机号码：${partnerMobile}\n"),
    MESSAGE_39("您有一个门店订货系统信息待提交，请查收","门店名称：${storeName}\n加盟商姓名：${partnerUsername}\n加盟商手机号码：${partnerMobile}\n"),
    MESSAGE_40("您有一个门店信发系统信息待提交，请查收","门店名称：${storeName}\n加盟商姓名：${partnerUsername}\n加盟商手机号码：${partnerMobile}\n"),
    MESSAGE_41("您有一个门店营帐通信息待提交，请查收","门店名称：${storeName}\n加盟商姓名：${partnerUsername}\n加盟商手机号码：${partnerMobile}\n"),
    MESSAGE_42("您有一个门店开业运营方案待审核，请查收","门店名称：${storeName}\n加盟商姓名：${partnerUsername}\n加盟商手机号码：${partnerMobile}\n"),
    MESSAGE_43("您有一个门店已提交抖音建店资料，请查收","门店名称：${storeName}\n加盟商姓名：${partnerUsername}\n加盟商手机号码：${partnerMobile}\n"),
    MESSAGE_44("您有一个门店已提交美团外卖建店资料，请查收","门店名称：${storeName}\n加盟商姓名：${partnerUsername}\n加盟商手机号码：${partnerMobile}\n"),
    MESSAGE_45("您有一个门店已提交美团团购建店资料，请查收","门店名称：${storeName}\n加盟商姓名：${partnerUsername}\n加盟商手机号码：${partnerMobile}\n"),
    MESSAGE_46("您有一个门店已提交饿了么建店资料，请查收","门店名称：${storeName}\n加盟商姓名：${partnerUsername}\n加盟商手机号码：${partnerMobile}\n"),
    MESSAGE_47("您有一个门店已提交快手建店资料，请查收","门店名称：${storeName}\n加盟商姓名：${partnerUsername}\n加盟商手机号码：${partnerMobile}\n"),
    MESSAGE_48("您有一个门店饿了么初审已通过，请查收","门店名称：${storeName}\n加盟商姓名：${partnerUsername}\n加盟商手机号码：${partnerMobile}\n"),
    MESSAGE_49("您有一个门店美团外卖初审已通过，请查收","门店名称：${storeName}\n加盟商姓名：${partnerUsername}\n加盟商手机号码：${partnerMobile}\n"),
    MESSAGE_50("您有一个门店开业运营方案审核未通过，请查收","门店名称：${storeName}\n加盟商姓名：${partnerUsername}\n加盟商手机号码：${partnerMobile}\n"),
    MESSAGE_51("您有一个加盟商提交了铺位，请查收","铺位名称：${pointName}\n加盟商姓名：${partnerUsername}\n加盟商手机号码：${partnerMobile}\n"),
    MESSAGE_52("您有一个门店建店资料的订货信息待提交，请查收","门店名称：${storeName}\n加盟商姓名：${partnerUsername}\n加盟商手机号码：${partnerMobile}\n"),
    MESSAGE_53("您有一个门店建店资料的总部订货收款账户信息待提交，请查收","门店名称：${storeName}\n加盟商姓名：${partnerUsername}\n加盟商手机号码：${partnerMobile}\n"),
    MESSAGE_54("您有一个门店建店资料待审核，请查收","门店名称：${storeName}\n加盟商姓名：${partnerUsername}\n加盟商手机号码：${partnerMobile}\n"),
    MESSAGE_55("您有一个门店设计阶段待提交，请查收","门店名称：${storeName}\n加盟商姓名：${partnerUsername}\n加盟商手机号码：${partnerMobile}\n"),
    MESSAGE_56("您有一个门店测量阶段待提交，请查收","门店名称：${storeName}\n加盟商姓名：${partnerUsername}\n加盟商手机号码：${partnerMobile}\n"),
    MESSAGE_57("您有一个门店测量阶段待分配测量员和设计组，请查收","门店名称：${storeName}\n加盟商姓名：${partnerUsername}\n加盟商手机号码：${partnerMobile}\n"),
    MESSAGE_58("您有一个门店设计阶段待分配设计师，请查收","门店名称：${storeName}\n加盟商姓名：${partnerUsername}\n加盟商手机号码：${partnerMobile}\n"),
    MESSAGE_59("您有一个门店设计阶段报价任务待领取，请查收","门店名称：${storeName}\n加盟商姓名：${partnerUsername}\n加盟商手机号码：${partnerMobile}\n"),
    MESSAGE_60("您有一个门店已提交京东建店资料，请查收","门店名称：${storeName}\n加盟商姓名：${partnerUsername}\n加盟商手机号码：${partnerMobile}\n"),
    MESSAGE_61("您有一个门店京东外卖初审已通过，请查收","门店名称：${storeName}\n加盟商姓名：${partnerUsername}\n加盟商手机号码：${partnerMobile}\n"),
    MESSAGE_62("您有一个门店设计阶段设计图待提交，请查收","门店名称：${storeName}\n加盟商姓名：${partnerUsername}\n加盟商手机号码：${partnerMobile}\n"),



    MESSAGE_63("您有一个门店开业日期报备待确认，请查收","##### 加盟商姓名：${partnerUsername}\n门店名称：${storeName}\n计划开业时间：${planOpenDate}\n门店地址：${shopAddress}\n请及时跟进开业筹备支持工作！"),


    MESSAGE_100("您有一个门店开业日期报备待确认，请查收","##### 您管辖的${storeName}已提交开业日期报备，计划开业日期为${planOpenDate},门店地址：${shopAddress}，请及时跟进开业筹备支持工作。"),

    ;

    private String title;

    private String content;

    MessageEnum(String title, String content) {
        this.title = title;
        this.content = content;
    }

    public String getTitle() {
        return title;
    }

    public String getContent() {
        return content;
    }

    public String getContent(Map<String, String> paramMap) {
        String result = this.content;
        for (String key : paramMap.keySet()) {
            result = result.replace("${" + key + "}", paramMap.get(key));
        }
        return result;
    }

    public String getImageUrl() {
        return "https://oss-store.coolcollege.cn/xfsg_notice.png";
    }


    public String getMessageUrl(String domainUrl, String appId, String corpId, Map<String, String> paramMap) {
        if (StringUtils.isAnyBlank(domainUrl, appId, corpId) || Objects.isNull(paramMap)) {
            return "";
        }
        try {
            switch (this) {
                case MESSAGE_1:
                case MESSAGE_2:
                case MESSAGE_3_1:
                case MESSAGE_4:
                case MESSAGE_5:
                case MESSAGE_6:
                case MESSAGE_7:
                case MESSAGE_8:
                case MESSAGE_9:
                case MESSAGE_29:
                case MESSAGE_30:
                    return domainUrl + "/dd-noticemsg?appId=" + appId + "&corpId=" + corpId + "&appUrl=" +
                            URLEncoder.encode("pages/common-web-view/index?noticeType=xfsg&routerUrl=notice&target=clue&timestamp=" + System.currentTimeMillis() + "&lineId=" + paramMap.get("lineId"), StandardCharsets.UTF_8.name());
                case MESSAGE_3:
                case MESSAGE_10:
                    return domainUrl + "/dd-noticemsg?appId=" + appId + "&corpId=" + corpId + "&appUrl=" +
                            URLEncoder.encode("pages/common-web-view/index?noticeType=xfsg&routerUrl=notice&target=interview&timestamp=" + System.currentTimeMillis() + "&lineId=" + paramMap.get("lineId"), StandardCharsets.UTF_8.name());
                case MESSAGE_11:
                case MESSAGE_12:
                    return domainUrl + "/dd-noticemsg?appId=" + appId + "&corpId=" + corpId + "&appUrl=" +
                            URLEncoder.encode("pages/common-web-view/index?noticeType=xfsg&routerUrl=notice&target=point&timestamp=" + System.currentTimeMillis() + "&pointId=" + paramMap.get("pointId"), StandardCharsets.UTF_8.name());
                case MESSAGE_13:
                    return "dingtalk://dingtalkclient/action/open_micro_app?appId=" + appId + "&corpId=" + corpId + "&page=" +
                            URLEncoder.encode("pages/common-web-view/index?noticeType=xfsg&routerUrl=notice&target=point&timestamp=" + System.currentTimeMillis() + "&pointId=" + paramMap.get("pointId"), StandardCharsets.UTF_8.name());
                case MESSAGE_14:
                    return "dingtalk://dingtalkclient/action/open_micro_app?appId=" + appId + "&corpId=" + corpId + "&page=" +
                            URLEncoder.encode("pages/common-web-view/index?noticeType=xfsg&routerUrl=notice&target=franchiseeDetails&timestamp=" + System.currentTimeMillis() + "&lineId=" + paramMap.get("lineId"), StandardCharsets.UTF_8.name());
                case MESSAGE_15:
                case MESSAGE_10_1:
                case MESSAGE_31:
                case MESSAGE_32:
                case MESSAGE_33:
                    //跳转我的加盟商的加盟商详情都可以使用这个
                    return domainUrl + "/dd-noticemsg?appId=" + appId + "&corpId=" + corpId + "&appUrl=" +
                            URLEncoder.encode("pages/common-web-view/index?noticeType=xfsg&routerUrl=notice&target=franchiseeDetails&timestamp=" + System.currentTimeMillis() + "&lineId=" + paramMap.get("lineId"), StandardCharsets.UTF_8.name());
                case MESSAGE_21:
                    return domainUrl + "/dd-noticemsg?appId="+appId+"&corpId="+corpId+"&page=" +
                            URLEncoder.encode("pages/common-web-view/index?noticeType=xfsg&routerUrl=notice&target=employeeTraining&timestamp="+System.currentTimeMillis()+"&userDetailId="+ paramMap.get("userDetailId"), StandardCharsets.UTF_8.name());
                case MESSAGE_22:
                    return "dingtalk://dingtalkclient/action/open_micro_app?appId="+appId+"&corpId="+corpId+"&page=" +
                            URLEncoder.encode("pages/common-web-view/index?noticeType=xfsg&routerUrl=notice&target=trainerUser&timestamp="+System.currentTimeMillis()+"&userDetailId="+ paramMap.get("userDetailId"), StandardCharsets.UTF_8.name());
                case MESSAGE_24:
                    return "dingtalk://dingtalkclient/action/open_micro_app?appId="+appId+"&corpId="+corpId+"&page=" +
                            URLEncoder.encode("pages/common-web-view/index?noticeType=xfsg&routerUrl=notice&target=threeAcceptance&timestamp="+System.currentTimeMillis(), StandardCharsets.UTF_8.name());
                case MESSAGE_25:
                    return "dingtalk://dingtalkclient/action/open_micro_app?appId="+appId+"&corpId="+corpId+"&page=" +
                            URLEncoder.encode("pages/common-web-view/index?noticeType=xfsg&routerUrl=notice&target=threeAcceptance&timestamp="+System.currentTimeMillis(), StandardCharsets.UTF_8.name());
                case MESSAGE_26:
                    return domainUrl + "/dd-noticemsg?appId=" + appId + "&corpId=" + corpId + "&appUrl=" +
                            URLEncoder.encode("pages/common-web-view/index?noticeType=xfsg&routerUrl=notice&target=openPlan&timestamp=" + System.currentTimeMillis() +"&lineId="+ paramMap.get("lineId")+"&shopId="+ paramMap.get("shopId"), StandardCharsets.UTF_8.name());
                case MESSAGE_27:
                    return domainUrl + "/dd-noticemsg?appId=" + appId + "&corpId=" + corpId + "&appUrl=" +
                            URLEncoder.encode("pages/common-web-view/index?noticeType=xfsg&routerUrl=notice&target=orderList&timestamp=" + System.currentTimeMillis() +"&lineId="+ paramMap.get("lineId"), StandardCharsets.UTF_8.name());
                case MESSAGE_28:
                    return "dingtalk://dingtalkclient/action/open_micro_app?appId="+appId+"&corpId="+corpId+"&page=" +
                            URLEncoder.encode("pages/common-web-view/index?noticeType=xfsg&routerUrl=notice&target=eyeAcceptance&timestamp="+System.currentTimeMillis()+"&shopId="+ paramMap.get("shopId"), StandardCharsets.UTF_8.name());
                case MESSAGE_16:
                    return domainUrl + "/dd-noticemsg?appId=" + appId + "&corpId=" + corpId + "&appUrl=" +
                            URLEncoder.encode("pages/common-web-view/index?noticeType=xfsg&routerUrl=notice&target=sysStoreSchedule&timestamp=" + System.currentTimeMillis() +"&lineId="+ paramMap.get("lineId")+"&shopId="+ paramMap.get("shopId"), StandardCharsets.UTF_8.name());
                case MESSAGE_17:
                    return domainUrl + "/dd-noticemsg?appId=" + appId + "&corpId=" + corpId + "&appUrl=" +
                            URLEncoder.encode("pages/common-web-view/index?noticeType=xfsg&routerUrl=notice&target=licenseSchedule&timestamp=" + System.currentTimeMillis() +"&lineId="+ paramMap.get("lineId")+"&shopId="+ paramMap.get("shopId"), StandardCharsets.UTF_8.name());
                case MESSAGE_18:
                case MESSAGE_23:
                    return domainUrl + "/dd-noticemsg?appId=" + appId + "&corpId=" + corpId + "&appUrl=" +
                            URLEncoder.encode("pages/common-web-view/index?noticeType=xfsg&routerUrl=notice&target=franchiseeSchedule&timestamp=" + System.currentTimeMillis() +"&lineId="+ paramMap.get("lineId")+"&shopId="+ paramMap.get("shopId"), StandardCharsets.UTF_8.name());
                case MESSAGE_19:
                case MESSAGE_20:
                    return domainUrl + "/dd-noticemsg?appId=" + appId + "&corpId=" + corpId + "&appUrl=" +
                            URLEncoder.encode("pages/common-web-view/index?noticeType=xfsg&routerUrl=notice&target=contractSchedule&timestamp=" + System.currentTimeMillis() +"&lineId="+ paramMap.get("lineId")+"&shopId="+ paramMap.get("shopId"), StandardCharsets.UTF_8.name());
                default:
                    return "";
            }
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        return null;
    }

    public String getQWMessageUrl(String qywxUrl2, String corpId, Map<String, String> paramMap,String target,String eid) {
        if (StringUtils.isAnyBlank(qywxUrl2, corpId) ) {
            return "";
        }
        String messageUrl = null;
        try {
            String noticeUrl = String.format(qywxUrl2, corpId,"qw_self_dkf",target,corpId,"qw_self_dkf",eid);
            String finalUrl = buildUrlWithParams(noticeUrl, paramMap);
            log.info("finalUrl:{}", finalUrl);
            messageUrl = URLEncoder.encode(finalUrl, "UTF-8");
            messageUrl = String.format(CommonConstants.WX_SELF_AUTH_URL, corpId, messageUrl);
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        return messageUrl;
    }
    /**
     * 拼接参数
     * @param url
     * @param paramMap
     * @return
     */
    public static  String buildUrlWithParams(String url, Map<String, String> paramMap) {
        // 检查 URL 是否已经包含参数
        StringJoiner urlWithParams = new StringJoiner("&", url.contains("?") ? "&" : "?", "");

        // 遍历 Map，拼接参数
        for (Map.Entry<String, String> entry : paramMap.entrySet()) {
            urlWithParams.add(entry.getKey() + "=" + entry.getValue());
        }

        // 返回拼接后的 URL
        return url + urlWithParams.toString();
    }


}
