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

import dev.lions.unionflow.server.api.enums.evenement.PrioriteEvenement;
import dev.lions.unionflow.server.api.enums.evenement.StatutEvenement;
import dev.lions.unionflow.server.api.enums.evenement.TypeEvenementMetier;
import dev.lions.unionflow.server.api.validation.ValidationConstants;
import jakarta.validation.constraints.DecimalMax;

import jakarta.validation.constraints.DecimalMin;
import jakarta.validation.constraints.Digits;
import jakarta.validation.constraints.Email;
import jakarta.validation.constraints.Max;
import jakarta.validation.constraints.Min;
import jakarta.validation.constraints.NotBlank;

import jakarta.validation.constraints.Pattern;
import jakarta.validation.constraints.Size;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.time.LocalTime;
import lombok.Builder;

/**
 * Requête de mise à jour d'un événement.
 */
@Builder
public record UpdateEvenementRequest(
                @Size(min = ValidationConstants.TITRE_MIN_LENGTH, max = ValidationConstants.TITRE_MAX_LENGTH, message = ValidationConstants.TITRE_SIZE_MESSAGE) String titre,

                @Size(max = ValidationConstants.DESCRIPTION_COURTE_MAX_LENGTH, message = ValidationConstants.DESCRIPTION_COURTE_SIZE_MESSAGE) String description,

                TypeEvenementMetier typeEvenement,
                StatutEvenement statut,
                PrioriteEvenement priorite,

                LocalDate dateDebut,
                LocalDate dateFin,
                LocalTime heureDebut,
                LocalTime heureFin,
                @NotBlank(message = "Le lieu est obligatoire") @Size(max = 100) String lieu,
                @Size(max = 200) String adresse,
                @Size(max = 50) String ville,
                @Size(max = 50) String region,
                @DecimalMin(value = "-90.0") @DecimalMax(value = "90.0") BigDecimal latitude,
                @DecimalMin(value = "-180.0") @DecimalMax(value = "180.0") BigDecimal longitude,
                @Size(max = 100) String organisateur,
                @Email(message = "Format d'email invalide") @Size(max = 100) String emailOrganisateur,
                @Pattern(regexp = "^\\+?[0-9\\s\\-\\(\\)]{8,20}$") String telephoneOrganisateur,
                @Min(value = 1) @Max(value = 10000) Integer capaciteMax,
                @DecimalMin(value = ValidationConstants.MONTANT_MIN_VALUE, message = ValidationConstants.MONTANT_POSITIF_MESSAGE) @Digits(integer = ValidationConstants.MONTANT_INTEGER_DIGITS, fraction = ValidationConstants.MONTANT_FRACTION_DIGITS, message = ValidationConstants.MONTANT_DIGITS_MESSAGE) BigDecimal budget,

                @DecimalMin(value = ValidationConstants.MONTANT_MIN_VALUE, message = ValidationConstants.MONTANT_POSITIF_MESSAGE) @Digits(integer = ValidationConstants.MONTANT_INTEGER_DIGITS, fraction = ValidationConstants.MONTANT_FRACTION_DIGITS, message = ValidationConstants.MONTANT_DIGITS_MESSAGE) BigDecimal coutReel,

                @Pattern(regexp = ValidationConstants.DEVISE_PATTERN, message = ValidationConstants.DEVISE_MESSAGE) String codeDevise,
                Boolean inscriptionObligatoire,
                LocalDate dateLimiteInscription,
                Boolean evenementPublic,
                Boolean recurrent,
                String frequenceRecurrence,
                @Size(max = 500) String instructions,
                @Size(max = 500) String materielNecessaire,
                @Size(max = 100) String conditionsMeteo,
                @Size(max = 255) String imageUrl,
                @Pattern(regexp = "^#[0-9A-Fa-f]{6}$") String couleurTheme) {
}
