package com.devjob.email;

import jakarta.mail.MessagingException;
import jakarta.mail.internet.MimeMessage;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;

/**
 * EP26/EP32: 지원 완료 알림 메일 발송.
 * - @Async로 별도 스레드에서 실행되어 API 응답 속도에 영향을 주지 않는다.
 * - mail.enabled=false(기본값, 로컬 개발용)일 때는 실제 발송 대신 로그만 남긴다.
 * - EP32: 단순 텍스트 대신 HTML 템플릿(MimeMessageHelper의 html=true)으로 발송한다.
 *   Gmail SMTP 사용 시 계정 비밀번호가 아닌 "앱 비밀번호"를 MAIL_PASSWORD에 설정해야 한다
 *   (Google 계정 → 보안 → 2단계 인증 → 앱 비밀번호).
 */
@Slf4j
@Service
@RequiredArgsConstructor
public class EmailService {

    private final JavaMailSender mailSender;

    @Value("${mail.enabled:false}")
    private boolean mailEnabled;

    @Async
    public void sendApplicationCompletedEmail(String to, String jobTitle, String companyName) {
        if (!mailEnabled) {
            log.info("[메일 발송 생략] to={}, job={}({})", to, jobTitle, companyName);
            return;
        }

        try {
            MimeMessage message = mailSender.createMimeMessage();
            MimeMessageHelper helper = new MimeMessageHelper(message, true, "UTF-8");
            helper.setTo(to);
            helper.setSubject("[DevJob] 지원 완료: " + jobTitle);
            helper.setText(buildApplicationCompletedHtml(jobTitle, companyName), true);

            mailSender.send(message);
            log.info("지원 완료 메일 발송: to={}", to);
        } catch (MessagingException e) {
            log.error("지원 완료 메일 발송 실패: to={}", to, e);
        }
    }

    private String buildApplicationCompletedHtml(String jobTitle, String companyName) {
        return """
                <div style="font-family: 'Apple SD Gothic Neo', sans-serif; line-height: 1.6;">
                  <h2>지원이 완료됐습니다 🎉</h2>
                  <p>지원하신 공고: <strong>%s</strong> (%s)</p>
                  <p>전형 결과는 등록하신 이메일로 안내드리겠습니다.</p>
                  <hr/>
                  <p style="color:#888; font-size:12px;">본 메일은 발신 전용입니다.</p>
                </div>
                """.formatted(jobTitle, companyName);
    }
}
