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

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.BulksmsHttp;
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 lombok.extern.slf4j.Slf4j;

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

/**
 * Bulk客户端
 *
 * @author jayden
 */
@Slf4j
public class BulkSmsClient extends AbstractSmsClient {

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

    public BulkSmsClient(SmsChannelProperties properties) {
        super(properties, new BulkSmsCodeMapping());
        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;
        // 获取并处理短信模板内容
        String content = StrUtils.processTemplateContent(smsTemplateDTO, templateParams);

        try {

            // 设置发送短信所需的参数
            Map<String, Object> param = bulksmsHttp.setParams(mobile, content, "ECLogistics", properties.getApiKey(), properties.getApiSecret());

            // 发送POST请求
            Response response = bulksmsHttp.sendReq(param);
            // 解析响应结果
            Map<?, ?> result = JSON.parseObject(response.getBody(), Map.class);

            smsCommonResult = SmsCommonResult.build((String) result.get("status"), null, null, null, codeMapping);
        } 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，并默认接收成功，因为没有提供对应的api获取状态
        SmsLogDTO smsLogDTO = new SmsLogDTO();
        smsLogDTO.setReceiveStatus(ReceiveStatusEnum.Receive_STATUS_10.getValue());
        return smsLogDTO;
    }

    @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("OK", "", null, data, codeMapping);
    }

}
