package dev.lions.unionflow.server.api.dto.formuleabonnement.request;

import dev.lions.unionflow.server.api.enums.formuleabonnement.StatutFormule;
import dev.lions.unionflow.server.api.enums.formuleabonnement.TypeFormule;
import jakarta.validation.constraints.DecimalMin;
import jakarta.validation.constraints.Digits;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Pattern;
import jakarta.validation.constraints.Size;
import java.math.BigDecimal;
import java.time.LocalDate;
import lombok.Builder;

/**
 * Requête de création d'une formule d'abonnement.
 */
@Builder
public record CreateFormuleAbonnementRequest(
                @NotBlank(message = "Le nom de la formule est obligatoire") @Size(min = 2, max = 100, message = "Le nom de la formule doit contenir entre 2 et 100 caractères") String nom,
                @NotBlank(message = "Le code de la formule est obligatoire") @Pattern(regexp = "^[A-Z_]{2,20}$", message = "Le code doit contenir uniquement des lettres majuscules et underscores") String code,
                @Size(max = 1000, message = "La description ne peut pas dépasser 1000 caractères") String description,
                @NotNull(message = "Le type de formule est obligatoire") TypeFormule type,
                @NotNull(message = "Le statut est obligatoire") StatutFormule statut,
                @NotNull(message = "Le prix mensuel est obligatoire") @DecimalMin(value = "0.0", inclusive = false) @Digits(integer = 10, fraction = 2) BigDecimal prixMensuel,
                @DecimalMin(value = "0.0", inclusive = false) @Digits(integer = 10, fraction = 2) BigDecimal prixAnnuel,
                @NotBlank(message = "La devise est obligatoire") @Pattern(regexp = "^[A-Z]{3}$") String devise,
                @NotNull(message = "Le nombre maximum de membres est obligatoire") Integer maxMembres,
                @NotNull(message = "Le nombre maximum d'administrateurs est obligatoire") Integer maxAdministrateurs,
                @NotNull(message = "L'espace de stockage est obligatoire") @DecimalMin(value = "0.1", message = "L'espace de stockage doit être d'au moins 0.1 GB") BigDecimal espaceStockageGB,
                @NotNull(message = "Le support technique doit être spécifié") Boolean supportTechnique,
                @Pattern(regexp = "^(EMAIL|CHAT|TELEPHONE|PREMIUM)$", message = "Le niveau de support doit être EMAIL, CHAT, TELEPHONE ou PREMIUM") String niveauSupport,
                Boolean fonctionnalitesAvancees,
                Boolean apiAccess,
                Boolean rapportsPersonnalises,
                Boolean integrationsTierces,
                Boolean sauvegardeAutomatique,
                Boolean multiLangues,
                Boolean personnalisationInterface,
                Boolean formationIncluse,
                Integer heuresFormation,
                Boolean populaire,
                Boolean recommandee,
                Integer periodeEssaiJours,
                LocalDate dateDebutValidite,
                LocalDate dateFinValidite,
                Integer ordreAffichage,
                @Pattern(regexp = "^#[0-9A-Fa-f]{6}$", message = "La couleur doit être un code hexadécimal valide") String couleur,
                @Size(max = 50, message = "Le nom de l'icône ne peut pas dépasser 50 caractères") String icone,
                @Size(max = 500, message = "Les notes ne peuvent pas dépasser 500 caractères") String notes) {
}
