package com.cool.store.builder;

import com.cool.store.config.weixin.WechatMiniappProperties;
import com.cool.store.dto.wechat.WechatTemplateMessageDTO;
import com.cool.store.enums.wechat.WechatTemplateEnum;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.HashMap;
import java.util.Map;

/**
 * @Author suzhuhong
 * @Date 2025/10/10 14:34
 * @Version 1.0
 */
@Component
public class TemplateMessageBuilder {

    @Autowired
    private WechatMiniappProperties wechatMiniappProperties;

    /**
     * 构建普通模板消息
     */
    public WechatTemplateMessageDTO buildNormalTemplate(String openId,
                                                        WechatTemplateEnum template,
                                                        Map<String, Object> data) {
        WechatTemplateMessageDTO messageDTO = new WechatTemplateMessageDTO();
        messageDTO.setToUser(openId);
        messageDTO.setTemplateId(template.getTemplateId());

        // 设置URL（如果data中包含url）
        if (data.containsKey("url")) {
            messageDTO.setUrl((String) data.get("url"));
        }

        // 构建模板数据
        messageDTO.setData(buildTemplateData(data));

        return messageDTO;
    }

    /**
     * 构建小程序跳转模板消息
     */
    public WechatTemplateMessageDTO buildMiniappTemplate(String openId,
                                                         WechatTemplateEnum template,
                                                         Map<String, Object> data,
                                                         String miniAppPagePath) {
        WechatTemplateMessageDTO messageDTO = new WechatTemplateMessageDTO();
        messageDTO.setToUser(openId);
        messageDTO.setTemplateId(template.getTemplateId());

        // 设置小程序跳转
        WechatTemplateMessageDTO.MiniprogramDTO miniProgram = new WechatTemplateMessageDTO.MiniprogramDTO();
        miniProgram.setAppid(wechatMiniappProperties.getAppId());
        miniProgram.setPagepath(miniAppPagePath != null ? miniAppPagePath : wechatMiniappProperties.getDefaultPagePath());
        messageDTO.setMiniprogram(miniProgram);

        // 设置备用URL（如果data中包含url）
        if (data.containsKey("url")) {
            messageDTO.setUrl((String) data.get("url"));
        }

        // 构建模板数据
        messageDTO.setData(buildTemplateData(data));

        return messageDTO;
    }

    /**
     * 构建小程序跳转模板消息（带备用URL）
     */
    public WechatTemplateMessageDTO buildMiniAppTemplateWithUrl(String openId,
                                                                WechatTemplateEnum template,
                                                                Map<String, Object> data,
                                                                String miniAppPagePath,
                                                                String backupUrl) {
        WechatTemplateMessageDTO messageDTO = buildMiniappTemplate(openId, template, data, miniAppPagePath);

        // 设置备用URL
        if (backupUrl != null && !backupUrl.trim().isEmpty()) {
            messageDTO.setUrl(backupUrl);
        }

        return messageDTO;
    }

    /**
     * 构建模板数据
     */
    private Map<String, WechatTemplateMessageDTO.TemplateDataItemDTO> buildTemplateData(Map<String, Object> data) {
        Map<String, WechatTemplateMessageDTO.TemplateDataItemDTO> templateData = new HashMap<>();

        data.forEach((key, value) -> {
            if (!"url".equals(key) && value != null) {
                WechatTemplateMessageDTO.TemplateDataItemDTO item =
                        new WechatTemplateMessageDTO.TemplateDataItemDTO(
                                value.toString(),
                                getColorByField(key)
                        );
                templateData.put(key, item);
            }
        });

        return templateData;
    }

    /**
     * 根据字段名获取颜色
     */
    private String getColorByField(String fieldName) {
        switch (fieldName) {
            case "amount":
            case "refundAmount":
            case "couponValue":
            case "character_string2":
                return "#FF0000"; // 金额类字段用红色
            case "orderNo":
            case "expressNo":
                return "#173177"; // 编号类字段用蓝色
            default:
                return "#333333"; // 默认用深灰色
        }
    }
}
