package com.unicorn.hgzero.notification.service;

import jakarta.mail.MessagingException;
import jakarta.mail.internet.MimeMessage;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.retry.annotation.Backoff;
import org.springframework.retry.annotation.Retryable;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component;

/**
 * 이메일 발송 클라이언트
 *
 * SMTP를 통한 이메일 발송 처리
 * HTML 템플릿 기반 이메일 전송 지원
 *
 * @author 준호 (Backend Developer)
 * @version 1.0
 * @since 2025-10-23
 */
@Slf4j
@Component
@RequiredArgsConstructor
public class EmailClient {

    private final JavaMailSender mailSender;

    /**
     * HTML 이메일 발송 (비동기 + 재시도 지원)
     *
     * 발송 실패 시 최대 3번까지 재시도
     * Exponential Backoff: 초기 1초, 최대 10초, 배수 2.0
     *
     * @param to 수신자 이메일 주소
     * @param subject 이메일 제목
     * @param htmlContent HTML 이메일 본문
     * @throws MessagingException 이메일 발송 실패 시
     */
    @Async("emailTaskExecutor")
    @Retryable(
        retryFor = {MessagingException.class},
        maxAttempts = 3,
        backoff = @Backoff(
            delay = 1000,      // 1초
            maxDelay = 10000,  // 10초
            multiplier = 2.0
        )
    )
    public void sendHtmlEmail(String to, String subject, String htmlContent) throws MessagingException {
        try {
            log.info("이메일 발송 시작 - To: {}, Subject: {}", to, subject);

            MimeMessage message = mailSender.createMimeMessage();
            MimeMessageHelper helper = new MimeMessageHelper(message, true, "UTF-8");

            helper.setTo(to);
            helper.setSubject(subject);
            helper.setText(htmlContent, true);  // true = HTML 모드
//            helper.setFrom("du0928@gmail.com");

            mailSender.send(message);

            log.info("이메일 발송 완료 - To: {}", to);

        } catch (MessagingException e) {
            log.error("이메일 발송 실패 - To: {}, Subject: {}", to, subject, e);
            throw e;
        }
    }

    /**
     * 텍스트 이메일 발송 (비동기 + 재시도 지원)
     *
     * @param to 수신자 이메일 주소
     * @param subject 이메일 제목
     * @param textContent 텍스트 이메일 본문
     * @throws MessagingException 이메일 발송 실패 시
     */
    @Async("emailTaskExecutor")
    @Retryable(
        retryFor = {MessagingException.class},
        maxAttempts = 3,
        backoff = @Backoff(
            delay = 1000,      // 1초
            maxDelay = 10000,  // 10초
            multiplier = 2.0
        )
    )
    public void sendTextEmail(String to, String subject, String textContent) throws MessagingException {
        try {
            log.info("텍스트 이메일 발송 시작 - To: {}, Subject: {}", to, subject);

            MimeMessage message = mailSender.createMimeMessage();
            MimeMessageHelper helper = new MimeMessageHelper(message, true, "UTF-8");

            helper.setTo(to);
            helper.setSubject(subject);
            helper.setText(textContent, false);  // false = 텍스트 모드

            mailSender.send(message);

            log.info("텍스트 이메일 발송 완료 - To: {}", to);

        } catch (MessagingException e) {
            log.error("텍스트 이메일 발송 실패 - To: {}, Subject: {}", to, subject, e);
            throw e;
        }
    }
}
