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

import jakarta.validation.constraints.*;
import java.time.LocalDate;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

/**
 * DTO pour les bénéficiaires d'une aide
 *
 * @author UnionFlow Team
 * @version 1.0
 * @since 2025-01-16
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class BeneficiaireAideDTO {

  /** Identifiant unique du bénéficiaire */
  private String id;

  /** Nom complet du bénéficiaire */
  @NotBlank(message = "Le nom du bénéficiaire est obligatoire")
  @Size(max = 100, message = "Le nom ne peut pas dépasser 100 caractères")
  private String nomComplet;

  /** Relation avec le demandeur */
  @NotBlank(message = "La relation avec le demandeur est obligatoire")
  private String relationDemandeur;

  /** Date de naissance */
  private LocalDate dateNaissance;

  /** Âge calculé */
  private Integer age;

  /** Genre */
  private String genre;

  /** Numéro de téléphone */
  @Pattern(regexp = "^\\+?[0-9]{8,15}$", message = "Le numéro de téléphone n'est pas valide")
  private String telephone;

  /** Adresse email */
  @Email(message = "L'adresse email n'est pas valide")
  private String email;

  /** Adresse physique */
  @Size(max = 200, message = "L'adresse ne peut pas dépasser 200 caractères")
  private String adresse;

  /** Situation particulière (handicap, maladie, etc.) */
  @Size(max = 500, message = "La situation particulière ne peut pas dépasser 500 caractères")
  private String situationParticuliere;

  /** Indique si le bénéficiaire est le demandeur principal */
  @Builder.Default private Boolean estDemandeurPrincipal = false;

  /** Pourcentage de l'aide destiné à ce bénéficiaire */
  @DecimalMin(value = "0.0", message = "Le pourcentage doit être positif")
  @DecimalMax(value = "100.0", message = "Le pourcentage ne peut pas dépasser 100%")
  private Double pourcentageAide;

  /** Montant spécifique pour ce bénéficiaire */
  @DecimalMin(value = "0.0", message = "Le montant doit être positif")
  private Double montantSpecifique;
}
