package cn.iocoder.yudao.framework.sms.core.client.impl.sendchamp;

import cn.hutool.core.lang.Assert;
import cn.iocoder.yudao.framework.common.util.json.core.KeyValue;
import cn.iocoder.yudao.framework.http.core.Response;
import cn.iocoder.yudao.framework.http.sms.SendChampHttp;
import cn.iocoder.yudao.framework.http.util.StrUtils;
import cn.iocoder.yudao.framework.sms.core.client.SmsCommonResult;
import cn.iocoder.yudao.framework.sms.core.client.dto.*;
import cn.iocoder.yudao.framework.sms.core.client.impl.AbstractSmsClient;
import cn.iocoder.yudao.framework.sms.core.enums.ReceiveStatusEnum;
import cn.iocoder.yudao.framework.sms.core.enums.SmsTemplateAuditStatusEnum;
import cn.iocoder.yudao.framework.sms.core.property.SmsChannelProperties;
import com.alibaba.fastjson.JSON;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

/**
 * SendChamp客户端
 *
 * @author jayden
 */
@Slf4j
public class SendChampSmsClient extends AbstractSmsClient {

    // 创建HTTP客户端实例，用于发送短信
    private final SendChampHttp sendchampHttp = new SendChampHttp();

    public SendChampSmsClient(SmsChannelProperties properties) {
        super(properties, new SendChampSmsCodeMapping());
        Assert.notEmpty(properties.getApiKey(), "apiKey 不能为空");
        Assert.notEmpty(properties.getApiSecret(), "apiSecret 不能为空");
    }

    @Override
    protected void doInit() {

    }

    @Override
    protected SmsCommonResult<SmsSendRespDTO> doSendSms(Long sendLogId, String mobile, String apiTemplateId, List<KeyValue<String, Object>> templateParams) {
        return null;
    }

    /**
     * 发送短信服务（版本2）
     * 该方法用于发送短信，会根据模板内容和参数动态生成短信内容，并处理发送过程
     *
     * @param logId          日志ID，用于追踪和记录
     * @param mobile         手机号码，短信接收方
     * @param smsTemplateDTO 短信模板信息，包括模板内容等
     * @param templateParams 模板参数，用于替换模板中的占位符
     * @return 返回短信发送结果，包括状态码、消息ID等信息
     */
    @Override
    public SmsCommonResult<SmsSendRespDTO> sendSmsV2(Long logId, String mobile, SmsTemplateDTO smsTemplateDTO, List<KeyValue<String, Object>> templateParams) {
        SmsCommonResult<SmsSendRespDTO> smsCommonResult = SmsCommonResult.build("400", "Bad Request", null, null, codeMapping);
        // 获取并处理短信模板内容
        String content = StrUtils.processTemplateContent(smsTemplateDTO, templateParams);

        try {
            // 如果信息超过200字符，需要拆分成多条短信发送
            List<String> messages = splitContent(content);
            for (String message : messages) {
                // 设置发送短信所需的参数
                Map<String, Object> param = sendchampHttp.setParams(mobile, message, "Sendchamp");
                // 设置请求头，包含认证信息
                Map<String, String> header = sendchampHttp.setHeader("Bearer " + properties.getApiSecret());
                // 发送POST请求
                Response response = sendchampHttp.postReq(param, header);
                // 解析响应结果

                SendChampResult sendChampResult = JSON.parseObject(response.getBody(), SendChampResult.class);
                SendChampResult.Data data = sendChampResult.getData();
                // 构建发送结果
                String id = data.getBusinessId();
                if (StringUtils.isBlank(id)) {
                    id = data.getId();
                }
                smsCommonResult = SmsCommonResult.build(sendChampResult.getMessage(), sendChampResult.getMessage(), id, null, codeMapping);
                smsCommonResult.setData(new SmsSendRespDTO().setSerialNo(id));
            }
        } catch (Exception e) {
            // 记录发送短信时发生的错误
            log.error("Error sending SMS: ", e);
            // 返回内部服务器错误结果
            return SmsCommonResult.build("500", "Internal Server Error", null, null, codeMapping);
        }
        // 返回请求结果
        return smsCommonResult;
    }

    @Override
    public SmsLogDTO getReceiveStatus(SmsLogDTO smsLogDO) {
        // 初始化短信日志DTO，并默认设置接收状态为未接收到
        SmsLogDTO smsLogDTO = new SmsLogDTO();
        smsLogDTO.setReceiveStatus(ReceiveStatusEnum.Receive_STATUS_20.getValue());
        return smsLogDTO;
    }


    /**
     * 拆分内容
     * 将内容拆分成多个部分，每个部分不超过 maxLength 字符
     *
     * @param content 待拆分的内容
     * @return 拆分后的内容列表
     */
    private List<String> splitContent(String content) {
        List<String> messages = new ArrayList<>();
        int start = 0;
        while (start < content.length()) {
            int end = Math.min(start + 200, content.length());
            messages.add(content.substring(start, end));
            start = end;
        }
        return messages;
    }

    @Override
    protected List<SmsReceiveRespDTO> doParseSmsReceiveStatus(String text) {
        return null;
    }

    @Override
    protected SmsCommonResult<SmsTemplateRespDTO> doGetSmsTemplate(String apiTemplateId) {
        SmsTemplateRespDTO data = new SmsTemplateRespDTO().setId(apiTemplateId).setContent("")
                .setAuditStatus(SmsTemplateAuditStatusEnum.SUCCESS.getStatus()).setAuditReason("");
        return SmsCommonResult.build("accepted", "accepted", null, data, codeMapping);
    }

    /**
     * 短信接收状态
     * <p>
     *
     * @author 捷道源码
     */
    @Data
    public static class SmsReceiveStatus {

        /**
         * module
         */
        @JsonProperty("module")
        private String module;

        /**
         * reference
         */
        @JsonProperty("reference")
        private String reference;

        /**
         * 状态
         */
        @JsonProperty("status")
        private String status;

    }

}
