package dev.lions.unionflow.server.service;

import io.quarkus.mailer.MailTemplate.MailTemplateInstance;
import io.quarkus.qute.CheckedTemplate;
import io.quarkus.qute.TemplateInstance;
import jakarta.enterprise.context.ApplicationScoped;
import jakarta.inject.Inject;
import io.quarkus.mailer.Mail;
import io.quarkus.mailer.Mailer;
import lombok.extern.slf4j.Slf4j;

import java.math.BigDecimal;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;

/**
 * Service d'envoi d'emails HTML via Qute templates (Quarkus Mailer).
 *
 * <p>Templates : {@code src/main/resources/templates/email/}.
 * Variables injectées au moment de l'appel via {@code .data(key, value)}.
 */
@Slf4j
@ApplicationScoped
public class EmailTemplateService {

    private static final DateTimeFormatter DATE_FR = DateTimeFormatter.ofPattern("dd/MM/yyyy");

    @Inject
    Mailer mailer;

    // ── Templates Qute ────────────────────────────────────────────────────────

    @CheckedTemplate(basePath = "email")
    static class Templates {
        static native MailTemplateInstance bienvenue(
                String prenom, String nom, String email,
                String nomOrganisation, String lienConnexion);

        static native MailTemplateInstance cotisationConfirmation(
                String prenom, String nom,
                String nomOrganisation, String periode,
                String numeroReference, String methodePaiement,
                String datePaiement, String montant);

        static native MailTemplateInstance rappelCotisation(
                String prenom, String nom,
                String nomOrganisation, String periode,
                String montant, String dateLimite, String lienPaiement);

        static native MailTemplateInstance souscriptionConfirmation(
                String nomAdministrateur, String nomOrganisation,
                String nomFormule, String montant, String periodicite,
                String dateActivation, String dateExpiration,
                String maxMembres, String maxStockageMo,
                boolean apiAccess, boolean supportPrioritaire);
    }

    // ── Méthodes d'envoi ─────────────────────────────────────────────────────

    public void envoyerBienvenue(String email, String prenom, String nom,
                                  String nomOrganisation, String lienConnexion) {
        try {
            Templates.bienvenue(prenom, nom, email, nomOrganisation, lienConnexion)
                    .to(email)
                    .subject("Bienvenue sur UnionFlow — " + nomOrganisation)
                    .send().await().indefinitely();
            log.info("Email bienvenue envoyé à {}", email);
        } catch (Exception e) {
            log.error("Échec envoi email bienvenue à {}: {}", email, e.getMessage(), e);
        }
    }

    public void envoyerConfirmationCotisation(String email, String prenom, String nom,
                                               String nomOrganisation, String periode,
                                               String numeroReference, String methodePaiement,
                                               LocalDate datePaiement, BigDecimal montant) {
        try {
            Templates.cotisationConfirmation(
                            prenom, nom, nomOrganisation, periode,
                            numeroReference, methodePaiement,
                            datePaiement != null ? DATE_FR.format(datePaiement) : "—",
                            String.format("%,.0f", montant.doubleValue()))
                    .to(email)
                    .subject("Confirmation de cotisation — " + periode)
                    .send().await().indefinitely();
            log.info("Email confirmation cotisation envoyé à {}", email);
        } catch (Exception e) {
            log.error("Échec envoi email cotisation à {}: {}", email, e.getMessage(), e);
        }
    }

    public void envoyerRappelCotisation(String email, String prenom, String nom,
                                         String nomOrganisation, String periode,
                                         BigDecimal montant, LocalDate dateLimite,
                                         String lienPaiement) {
        try {
            Templates.rappelCotisation(
                            prenom, nom, nomOrganisation, periode,
                            String.format("%,.0f", montant.doubleValue()),
                            dateLimite != null ? DATE_FR.format(dateLimite) : "—",
                            lienPaiement)
                    .to(email)
                    .subject("⚠️ Rappel : cotisation " + periode + " en attente")
                    .send().await().indefinitely();
            log.info("Email rappel cotisation envoyé à {}", email);
        } catch (Exception e) {
            log.error("Échec envoi rappel cotisation à {}: {}", email, e.getMessage(), e);
        }
    }

    public void envoyerConfirmationSouscription(String email, String nomAdministrateur,
                                                 String nomOrganisation, String nomFormule,
                                                 BigDecimal montant, String periodicite,
                                                 LocalDate dateActivation, LocalDate dateExpiration,
                                                 Integer maxMembres, Integer maxStockageMo,
                                                 boolean apiAccess, boolean supportPrioritaire) {
        try {
            Templates.souscriptionConfirmation(
                            nomAdministrateur, nomOrganisation, nomFormule,
                            String.format("%,.0f", montant.doubleValue()), periodicite,
                            dateActivation != null ? DATE_FR.format(dateActivation) : "—",
                            dateExpiration != null ? DATE_FR.format(dateExpiration) : "—",
                            maxMembres != null ? String.valueOf(maxMembres) : "Illimité",
                            maxStockageMo != null ? String.valueOf(maxStockageMo) : "1024",
                            apiAccess, supportPrioritaire)
                    .to(email)
                    .subject("✅ Souscription activée — " + nomOrganisation)
                    .send().await().indefinitely();
            log.info("Email confirmation souscription envoyé à {}", email);
        } catch (Exception e) {
            log.error("Échec envoi email souscription à {}: {}", email, e.getMessage(), e);
        }
    }
}
