package com.example.demo.service;

import java.util.HashMap;
import java.util.Map;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.tencentcloudapi.common.Credential;
import com.tencentcloudapi.common.exception.TencentCloudSDKException;
import com.tencentcloudapi.common.profile.ClientProfile;
import com.tencentcloudapi.common.profile.HttpProfile;
import com.tencentcloudapi.ses.v20201002.SesClient;
import com.tencentcloudapi.ses.v20201002.models.SendEmailRequest;
import com.tencentcloudapi.ses.v20201002.models.SendEmailResponse;
import com.tencentcloudapi.ses.v20201002.models.Template;

/**
 * 腾讯云SES邮件推送服务
 * 基于 mails-over-tencent-cloud 模块实现
 * 参考：https://github.com/starter-go/mails-over-tencent-cloud
 */
@Service
public class TencentSesMailService {

    private static final Logger logger = LoggerFactory.getLogger(TencentSesMailService.class);

    @Autowired
    private ObjectMapper objectMapper;

    @Value("${tencent.ses.secret-id}")
    private String secretId;

    @Value("${tencent.ses.secret-key}")
    private String secretKey;

    @Value("${tencent.ses.region:ap-hongkong}")
    private String region;

    @Value("${tencent.ses.from-email}")
    private String fromEmail;

    @Value("${tencent.ses.from-name:AIGC平台}")
    private String fromName;

    /**
     * 获取腾讯云SES客户端
     */
    private SesClient getClient() {
        Credential cred = new Credential(secretId, secretKey);
        
        HttpProfile httpProfile = new HttpProfile();
        httpProfile.setEndpoint("ses.tencentcloudapi.com");
        
        ClientProfile clientProfile = new ClientProfile();
        clientProfile.setHttpProfile(httpProfile);
        
        return new SesClient(cred, region, clientProfile);
    }

    /**
     * 发送邮件（使用模板）
     * 
     * @param toEmail 收件人邮箱
     * @param subject 邮件主题
     * @param templateId 模板ID（在腾讯云SES控制台创建）
     * @param templateData 模板数据（JSON格式的Map）
     * @return 是否发送成功
     */
    public boolean sendEmailWithTemplate(String toEmail, String subject, Long templateId, Map<String, Object> templateData) {
        try {
            logger.info("开始发送邮件，收件人: {}, 主题: {}, 模板ID: {}", toEmail, subject, templateId);

            SesClient client = getClient();
            SendEmailRequest req = new SendEmailRequest();

            // 设置发件人
            req.setFromEmailAddress(fromEmail);

            // 设置收件人（仅支持单个收件人）
            req.setDestination(new String[]{toEmail});

            // 设置邮件主题
            req.setSubject(subject);

            // 设置模板
            Template template = new Template();
            template.setTemplateID(templateId);
            
            // 将模板数据转换为JSON字符串
            String templateDataJson = objectMapper.writeValueAsString(templateData);
            template.setTemplateData(templateDataJson);
            
            req.setTemplate(template);

            // 设置触发类型：1-批量触发（模板邮件）
            req.setTriggerType(1L);

            // 调用API发送邮件
            SendEmailResponse resp = client.SendEmail(req);
            
            String messageId = resp.getMessageId();
            logger.info("邮件发送成功，收件人: {}, 消息ID: {}", toEmail, messageId);
            
            return true;

        } catch (TencentCloudSDKException e) {
            String errorCode = e.getErrorCode();
            String errorMessage = e.getMessage();
            
            // 检查是否为权限错误
            if ("AuthFailure.UnauthorizedOperation".equals(errorCode) || 
                (errorMessage != null && errorMessage.contains("no permission"))) {
                logger.error("=== 腾讯云SES权限错误 ===");
                logger.error("收件人: {}", toEmail);
                logger.error("错误码: {}", errorCode);
                logger.error("错误信息: {}", errorMessage);
                logger.error("解决方案:");
                logger.error("1. 在腾讯云CAM中为访问密钥添加SES发送邮件权限");
                logger.error("2. 或临时使用开发模式：设置 tencent.ses.template-id=0");
                logger.error("详细配置指南请参考: TENCENT_SES_PERMISSION_FIX.md");
            } 
            // 检查是否为区域不支持错误
            else if ("UnsupportedRegion".equals(errorCode) || 
                     (errorMessage != null && errorMessage.contains("does not support this region"))) {
                logger.error("=== 腾讯云SES区域错误 ===");
                logger.error("收件人: {}", toEmail);
                logger.error("错误码: {}", errorCode);
                logger.error("错误信息: {}", errorMessage);
                logger.error("当前配置的区域: {}", region);
                logger.error("解决方案:");
                logger.error("1. 腾讯云SES通常支持以下区域：");
                logger.error("   - ap-hongkong (中国香港)");
                logger.error("   - ap-guangzhou (广州)");
                logger.error("   - ap-shanghai (上海)");
                logger.error("   - ap-nanjing (南京)");
                logger.error("2. 修改配置文件中的 tencent.ses.region 为支持的区域");
                logger.error("3. 当前配置：tencent.ses.region={}", region);
            }
            // 检查是否为发送失败错误
            else if ("FailedOperation.SendEmailErr".equals(errorCode) || 
                     (errorMessage != null && errorMessage.contains("发送遇到问题"))) {
                logger.error("=== 腾讯云SES发送失败错误 ===");
                logger.error("收件人: {}", toEmail);
                logger.error("错误码: {}", errorCode);
                logger.error("错误信息: {}", errorMessage);
                logger.error("当前配置:");
                logger.error("  区域: {}", region);
                logger.error("  发信地址: {}", fromEmail);
                logger.error("  模板ID: {}", templateId);
                logger.error("可能的原因:");
                logger.error("1. 发信地址 {} 未在腾讯云SES控制台的 {} 区域验证", fromEmail, region);
                logger.error("2. 模板ID {} 不存在于 {} 区域，或模板状态异常", templateId, region);
                logger.error("3. 发信地址已验证但未通过审核");
                logger.error("4. 账户可能未开通SES服务或服务受限");
                logger.error("解决方案:");
                logger.error("1. 登录腾讯云SES控制台: https://console.cloud.tencent.com/ses");
                logger.error("2. 确认选择的地域为: {}", region);
                logger.error("3. 检查发信地址 {} 是否已在该区域验证通过", fromEmail);
                logger.error("4. 检查模板ID {} 是否存在于该区域且状态为已审核", templateId);
                logger.error("5. 如未验证，请先验证发信地址或域名");
            } else {
                logger.error("腾讯云SES API调用失败，收件人: {}, 错误码: {}, 错误信息: {}", 
                    toEmail, errorCode, errorMessage, e);
            }
            return false;
        } catch (Exception e) {
            logger.error("发送邮件异常，收件人: {}", toEmail, e);
            return false;
        }
    }

    /**
     * 发送验证码邮件（使用默认模板）
     * 
     * @param toEmail 收件人邮箱
     * @param code 验证码
     * @param templateId 验证码邮件模板ID（从配置读取）
     * @return 是否发送成功
     */
    public boolean sendVerificationCodeEmail(String toEmail, String code, Long templateId) {
        Map<String, Object> templateData = new HashMap<>();
        templateData.put("code", code);
        
        return sendEmailWithTemplate(toEmail, "验证码", templateId, templateData);
    }

    /**
     * 发送通用模板邮件
     * 
     * @param toEmail 收件人邮箱
     * @param subject 邮件主题
     * @param templateId 模板ID
     * @param params 模板参数（键值对）
     * @return 是否发送成功
     */
    public boolean sendTemplateEmail(String toEmail, String subject, Long templateId, Map<String, Object> params) {
        return sendEmailWithTemplate(toEmail, subject, templateId, params);
    }

    /**
     * 发送JSON格式模板数据的邮件
     * 
     * @param toEmail 收件人邮箱
     * @param subject 邮件主题
     * @param templateId 模板ID
     * @param jsonData JSON格式的模板数据字符串
     * @return 是否发送成功
     */
    public boolean sendEmailWithJsonData(String toEmail, String subject, Long templateId, String jsonData) {
        try {
            @SuppressWarnings("unchecked")
            Map<String, Object> templateData = objectMapper.readValue(jsonData, Map.class);
            return sendEmailWithTemplate(toEmail, subject, templateId, templateData);
        } catch (Exception e) {
            logger.error("解析JSON模板数据失败: {}", jsonData, e);
            return false;
        }
    }
}


