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

import jakarta.validation.constraints.DecimalMin;
import jakarta.validation.constraints.Digits;
import jakarta.validation.constraints.Max;
import jakarta.validation.constraints.Min;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
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'une nouvelle cotisation.
 *
 * @param membreId       Identifiant du membre concerné.
 * @param typeCotisation Type de cotisation (MENSUELLE, etc.).
 * @param libelle        Libellé de la cotisation.
 * @param description    Description détaillée.
 * @param montantDu      Montant total à payer.
 * @param codeDevise     Code ISO de la devise (par défaut XOF).
 * @param dateEcheance   Date limite de paiement.
 * @param periode        Période concernée (ex: Janvier 2025).
 * @param annee          Année de référence.
 * @param mois           Mois de référence (1-12, optionnel).
 * @param recurrente     Indique si la cotisation est récurrente.
 * @param observations   Commentaires libres.
 * @author UnionFlow Team
 * @version 1.0
 * @since 2026-02-22
 */
@Builder
public record CreateCotisationRequest(
                @NotNull(message = "L'identifiant du membre est obligatoire") UUID membreId,

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

                @NotBlank(message = "Le type de cotisation est obligatoire") String typeCotisation,

                @NotBlank(message = "Le libellé est obligatoire") @Size(max = 100) String libelle,

                @Size(max = 500) String description,

                @NotNull(message = "Le montant dû est obligatoire") @DecimalMin(value = "0.0", inclusive = false) @Digits(integer = 10, fraction = 2) BigDecimal montantDu,

                @Size(min = 3, max = 3) String codeDevise,

                @NotNull(message = "La date d'échéance est obligatoire") LocalDate dateEcheance,

                @Size(max = 50) String periode,

                @Min(2020) @Max(2100) Integer annee,

                @Min(1) @Max(12) Integer mois,

                Boolean recurrente,

                @Size(max = 1000) String observations) {
}
