package dev.lions.models;

import jakarta.validation.constraints.Email;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.Size;
import java.util.Map;
import java.util.Collections;
import lombok.Builder;
import lombok.Data;
import lombok.Setter;

/**
 * Représente un modèle de email à utiliser pour l'envoi de communications.
 * Cette classe encapsule les informations nécessaires pour générer et envoyer un email.
 */
@Data
@Builder
public class EmailTemplate {

  @NotBlank(message = "L'identifiant du modèle de courriel est obligatoire")
  private Long id;

  @NotBlank(message = "Le nom du modèle de courriel est obligatoire")
  @Size(max = 100, message = "Le nom du modèle ne peut pas dépasser 100 caractères")
  private String templateName;

  @NotBlank(message = "L'objet du courriel est obligatoire")
  @Size(max = 100, message = "L'objet ne peut pas dépasser 100 caractères")
  private String subject;

  @NotBlank(message = "Le destinataire du courriel est obligatoire")
  @Email(message = "Le destinataire doit être une adresse email valide")
  private String recipient;

  private Map<String, String> parameters;

  @Builder.Default
  private boolean isActive = true;

  /**
   * -- SETTER --
   *  Met à jour la version du modèle de courriel.
   *
   * @param version Nouvelle version
   */
  @Setter
  @Builder.Default
  private long version = 0;

  @NotBlank(message = "Le contenu du courriel est obligatoire")
  @Size(max = 10000, message = "Le contenu ne peut pas dépasser 10 000 caractères")
  private String content;

  /**
   * Récupère une copie immuable des paramètres.
   *
   * @return Paramètres du modèle de courriel
   */
  public Map<String, String> getParameters() {
    return Collections.unmodifiableMap(parameters);
  }

  /**
   * Met à jour l'état d'activation du modèle de courriel.
   *
   * @param active Nouvel état d'activation
   */
  public void setActive(boolean active) {
    this.isActive = active;
  }


  /**
   * Vérifie si le modèle de courriel est valide et prêt à l'emploi.
   *
   * @return true si le modèle est valide
   */
  public boolean isValid() {
    return id != null &&
           templateName != null && !templateName.isBlank() &&
           subject != null && !subject.isBlank() &&
           recipient != null && !recipient.isBlank() &&
           content != null && !content.isBlank();
  }
}