package dev.lions.unionflow.server.api.dto.adresse;

import dev.lions.unionflow.server.api.dto.base.BaseDTO;
import dev.lions.unionflow.server.api.enums.adresse.TypeAdresse;
import jakarta.validation.constraints.DecimalMax;
import jakarta.validation.constraints.DecimalMin;
import jakarta.validation.constraints.Digits;
import jakarta.validation.constraints.NotNull;
import java.math.BigDecimal;
import java.util.UUID;
import lombok.Getter;
import lombok.Setter;

/**
 * DTO pour la gestion des adresses
 *
 * @author UnionFlow Team
 * @version 3.0
 * @since 2025-01-29
 */
@Getter
@Setter
public class AdresseDTO extends BaseDTO {

  private static final long serialVersionUID = 1L;

  /** Type d'adresse */
  @NotNull(message = "Le type d'adresse est obligatoire")
  private TypeAdresse typeAdresse;

  /** Adresse complète */
  private String adresse;

  /** Complément d'adresse */
  private String complementAdresse;

  /** Code postal */
  private String codePostal;

  /** Ville */
  private String ville;

  /** Région */
  private String region;

  /** Pays */
  private String pays;

  /** Latitude */
  @DecimalMin(value = "-90.0", message = "La latitude doit être comprise entre -90 et 90")
  @DecimalMax(value = "90.0", message = "La latitude doit être comprise entre -90 et 90")
  @Digits(integer = 3, fraction = 6)
  private BigDecimal latitude;

  /** Longitude */
  @DecimalMin(value = "-180.0", message = "La longitude doit être comprise entre -180 et 180")
  @DecimalMax(value = "180.0", message = "La longitude doit être comprise entre -180 et 180")
  @Digits(integer = 3, fraction = 6)
  private BigDecimal longitude;

  /** Adresse principale */
  private Boolean principale;

  /** Libellé personnalisé */
  private String libelle;

  /** Notes et commentaires */
  private String notes;

  /** ID de l'organisation (si adresse d'organisation) */
  private UUID organisationId;

  /** ID du membre (si adresse de membre) */
  private UUID membreId;

  /** ID de l'événement (si adresse d'événement) */
  private UUID evenementId;

  /** Adresse complète formatée (calculée) */
  private String adresseComplete;
}

