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

import dev.lions.unionflow.server.api.enums.abonnement.StatutAbonnement;
import dev.lions.unionflow.server.api.enums.abonnement.TypePeriodeAbonnement;
import dev.lions.unionflow.server.api.enums.formuleabonnement.TypeFormule;
import jakarta.validation.constraints.DecimalMin;
import jakarta.validation.constraints.Digits;
import jakarta.validation.constraints.Future;
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 java.util.UUID;
import lombok.Builder;

/**
 * Requête de création d'un abonnement.
 */
@Builder
public record CreateAbonnementRequest(
                @NotBlank(message = "Le numéro de référence est obligatoire") @Pattern(regexp = "^ABO-\\d{4}-[A-Z0-9]{8}$", message = "Format de référence invalide (ABO-YYYY-XXXXXXXX)") String numeroReference,

                @NotNull(message = "L'identifiant de l'organisation est obligatoire") UUID organisationId,

                String nomOrganisation,

                @NotNull(message = "L'identifiant de la formule est obligatoire") UUID formulaireId,

                String codeFormule,
                String nomFormule,
                TypeFormule typeFormule,

                @NotNull(message = "Le statut est obligatoire") StatutAbonnement statut,

                @NotNull(message = "Le type d'abonnement est obligatoire") TypePeriodeAbonnement typeAbonnement,

                @NotNull(message = "La date de début est obligatoire") LocalDate dateDebut,

                @Future(message = "La date de fin doit être dans le futur") LocalDate dateFin,

                LocalDate dateProchainePeriode,

                @NotNull(message = "Le montant est obligatoire") @DecimalMin(value = "0.0", inclusive = false, message = "Le montant doit être positif") @Digits(integer = 10, fraction = 2, message = "Le montant ne peut avoir plus de 10 chiffres entiers et 2 décimales") BigDecimal montant,

                @NotBlank(message = "La devise est obligatoire") @Pattern(regexp = "^[A-Z]{3}$", message = "La devise doit être un code ISO à 3 lettres") String devise,

                @DecimalMin(value = "0.0", message = "La remise doit être positive") @DecimalMin(value = "100.0", message = "La remise ne peut pas dépasser 100%") BigDecimal remise,

                @DecimalMin(value = "0.0", message = "Le montant final doit être positif") @Digits(integer = 10, fraction = 2, message = "Le montant ne peut avoir plus de 10 chiffres entiers et 2 décimales") BigDecimal montantFinal,

                Boolean renouvellementAutomatique,
                Boolean periodeEssaiUtilisee,
                LocalDate dateFinEssai,
                Integer maxMembres,
                Integer nombreMembresActuels,
                BigDecimal espaceStockageGB,
                BigDecimal espaceStockageUtilise,
                Boolean supportTechnique,
                String niveauSupport,
                Boolean fonctionnalitesAvancees,
                Boolean apiAccess,
                Boolean rapportsPersonnalises,
                Boolean integrationsTierces,
                UUID responsableId,
                String nomResponsable,
                String emailResponsable,
                String telephoneResponsable,

                @Pattern(regexp = "^(WAVE_MONEY|ORANGE_MONEY|FREE_MONEY|VIREMENT|CHEQUE|AUTRE)$", message = "Mode de paiement invalide") String modePaiementPrefere,

                @Pattern(regexp = "^\\+?[0-9]{8,15}$", message = "Format de numéro de téléphone invalide") String numeroPaiementMobile,

                @Size(max = 5000, message = "L'historique ne peut pas dépasser 5000 caractères") String historiquePaiements,

                @Size(max = 1000, message = "Les notes ne peuvent pas dépasser 1000 caractères") String notes,

                Boolean alertesActivees,
                Boolean notificationsEmail,
                Boolean notificationsSMS) {
}
