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

import dev.lions.unionflow.server.api.dto.base.BaseResponse;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.UUID;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

/**
 * Réponse détaillée pour une cotisation.
 *
 * @author UnionFlow Team
 * @version 1.0
 * @since 2026-02-22
 */
@Getter
@Setter
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class CotisationResponse extends BaseResponse {

    private String numeroReference;
    private UUID membreId;
    private String nomMembre;
    /** Nom complet (prénom + nom) pour affichage */
    private String nomCompletMembre;
    private String numeroMembre;
    /** Initiales du membre (ex: JD pour Jean Dupont) */
    private String initialesMembre;
    /** Type / statut du membre (ex: Actif, En attente) */
    private String typeMembre;
    private UUID organisationId;
    private String nomOrganisation;
    /** Région de l'organisation (affichage liste) */
    private String regionOrganisation;
    /** Classe CSS icône PrimeFaces pour l'organisation (ex: pi-building) */
    private String iconeOrganisation;
    private String typeCotisation;
    /** Alias pour tri/filtre (type de cotisation) */
    private String type;
    private String typeCotisationLibelle;
    /** Libellé du type pour affichage (alias typeCotisationLibelle) */
    private String typeLibelle;
    /** Sévérité PrimeFaces pour le tag type (info, success, warn, error, secondary) */
    private String typeSeverity;
    /** Classe icône PrimeFaces pour le type (ex: pi-calendar) */
    private String typeIcon;
    private String libelle;
    private String description;
    private BigDecimal montantDu;
    /** Alias pour tri/filtre (montant du) */
    private BigDecimal montant;
    /** Montant formaté pour affichage (ex: "5 000") */
    private String montantFormatte;
    private BigDecimal montantPaye;
    private BigDecimal montantRestant;
    private String codeDevise;
    private String statut;
    private String statutLibelle;
    /** Sévérité PrimeFaces pour le tag statut */
    private String statutSeverity;
    /** Classe icône PrimeFaces pour le statut (ex: pi-check) */
    private String statutIcon;
    private LocalDate dateEcheance;
    /** Date d'échéance formatée pour affichage */
    private String dateEcheanceFormattee;
    /** Classe CSS couleur pour le retard (ex: text-red-500) */
    private String retardCouleur;
    /** Texte affiché pour le retard (ex: "X jours de retard") */
    private String retardTexte;
    /** Date de paiement formatée pour affichage */
    private String datePaiementFormattee;
    /** Icône PrimeFaces pour le mode de paiement */
    private String modePaiementIcon;
    /** Libellé du mode de paiement */
    private String modePaiementLibelle;
    private LocalDateTime datePaiement;
    private String periode;
    private Integer annee;
    private Integer mois;
    private String observations;
    private Boolean recurrente;
    private Integer nombreRappels;
    private LocalDateTime dateDernierRappel;
    private UUID valideParId;
    private String nomValidateur;
    private LocalDateTime dateValidation;
    private Integer pourcentagePaiement;
    private Long joursRetard;
    private Boolean enRetard;

    // Informations de paiement
    private String methodePaiement; // WAVE_MONEY, VIREMENT, ESPECES, CARTE, MOBILE_MONEY
    private String referencePaiement; // Référence externe du paiement
    private String waveSessionId; // ID de session Wave Money pour prélèvements
}
