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

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

/**
 * DTO pour les informations de contact du proposant d'aide
 *
 * @author UnionFlow Team
 * @version 1.0
 * @since 2025-01-16
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class ContactProposantDTO {

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

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

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

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

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

  /** Identifiant Telegram */
  @Size(max = 50, message = "L'identifiant Telegram ne peut pas dépasser 50 caractères")
  private String telegram;

  /** Autres moyens de contact (réseaux sociaux, etc.) */
  private java.util.Map<String, String> autresContacts;

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

  /** Indique si les rencontres physiques sont possibles */
  @Builder.Default private Boolean rencontresPhysiquesPossibles = false;

  /** Indique si les appels téléphoniques sont acceptés */
  @Builder.Default private Boolean appelsAcceptes = true;

  /** Indique si les SMS sont acceptés */
  @Builder.Default private Boolean smsAcceptes = true;

  /** Indique si les emails sont acceptés */
  @Builder.Default private Boolean emailsAcceptes = true;

  /** Horaires de disponibilité pour contact */
  @Size(max = 200, message = "Les horaires ne peuvent pas dépasser 200 caractères")
  private String horairesDisponibilite;

  /** Langue(s) de communication préférée(s) */
  private java.util.List<String> languesPreferees;

  /** Instructions spéciales pour le contact */
  @Size(max = 300, message = "Les instructions ne peuvent pas dépasser 300 caractères")
  private String instructionsSpeciales;
}
