package com.evseminar.service;

import com.evseminar.dto.SeminarDTO;
import jakarta.mail.MessagingException;
import java.io.UnsupportedEncodingException;
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;
import org.thymeleaf.TemplateEngine;
import org.thymeleaf.context.Context;

@Service
@RequiredArgsConstructor
@Slf4j
public class EmailService {

    private final JavaMailSender mailSender;
    private final TemplateEngine templateEngine;

    @Value("${spring.mail.username}")
    private String fromEmail;

    @Async
    public void sendVerificationCode(String toEmail, String code) {
        Context ctx = new Context();
        ctx.setVariable("code", code);
        String html = templateEngine.process("verification-email", ctx);
        sendHtmlEmail(toEmail, "Email Verification - EV Seminar System", html);
    }

    @Async
    public void sendWelcome(String toEmail, String name) {
        Context ctx = new Context();
        ctx.setVariable("name", name);
        String html = templateEngine.process("welcome-email", ctx);
        sendHtmlEmail(toEmail, "Welcome to EV Seminar Registration System", html);
    }

    @Async
    public void sendRegistrationSuccess(String toEmail, String name, SeminarDTO seminar, int numSeats) {
        Context ctx = new Context();
        ctx.setVariable("name", name);
        ctx.setVariable("seminar", seminar);
        ctx.setVariable("numSeats", numSeats);
        String html = templateEngine.process("registration-success-email", ctx);
        sendHtmlEmail(toEmail, "Seminar Registration Confirmed - " + seminar.getVehicleName(), html);
    }

    @Async
    public void sendRegistrationCancelled(String toEmail, String name, SeminarDTO seminar) {
        Context ctx = new Context();
        ctx.setVariable("name", name);
        ctx.setVariable("seminar", seminar);
        String html = templateEngine.process("registration-cancel-email", ctx);
        sendHtmlEmail(toEmail, "Seminar Registration Cancelled - " + seminar.getVehicleName(), html);
    }

    @Async
    public void sendWaitlistPromoted(String toEmail, String name, SeminarDTO seminar, int numSeats) {
        Context ctx = new Context();
        ctx.setVariable("name", name);
        ctx.setVariable("seminar", seminar);
        ctx.setVariable("numSeats", numSeats);
        String html = templateEngine.process("waitlist-promoted-email", ctx);
        sendHtmlEmail(toEmail, "Good News! Your Seminar Registration is Confirmed - " + seminar.getVehicleName(), html);
    }

    private void sendHtmlEmail(String to, String subject, String htmlContent) {
        try {
            MimeMessage message = mailSender.createMimeMessage();
            MimeMessageHelper helper = new MimeMessageHelper(message, true, "UTF-8");
            helper.setFrom(fromEmail, "KINETIC PRECISION");
            helper.setTo(to);
            helper.setSubject(subject);
            helper.setText(htmlContent, true);
            mailSender.send(message);
            log.info("Email sent to {} with subject: {}", to, subject);
        } catch (MessagingException | UnsupportedEncodingException e) {
            log.error("Failed to send email to {}: {}", to, e.getMessage());
        }
    }
}
