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.Pattern;
import jakarta.validation.constraints.Size;
import java.math.BigDecimal;
import java.time.LocalDate;
import lombok.Builder;

/**
 * Requête de mise à jour d'une formule d'abonnement.
 */
@Builder
public record UpdateFormuleAbonnementRequest(
                @Size(min = 2, max = 100, message = "Le nom de la formule doit contenir entre 2 et 100 caractères") String nom,
                @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,
                TypeFormule type,
                StatutFormule statut,
                @DecimalMin(value = "0.0", inclusive = false, message = "Le prix mensuel doit être positif") @Digits(integer = 10, fraction = 2) BigDecimal prixMensuel,
                @DecimalMin(value = "0.0", inclusive = false, message = "Le prix annuel doit être positif") @Digits(integer = 10, fraction = 2) BigDecimal prixAnnuel,
                @Pattern(regexp = "^[A-Z]{3}$") String devise,
                Integer maxMembres,
                Integer maxAdministrateurs,
                @DecimalMin(value = "0.1", message = "L'espace de stockage doit être d'au moins 0.1 GB") BigDecimal espaceStockageGB,
                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) {
}
