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

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

/**
 * Réponse contenant les données d'une organisation.
 *
 * <p>
 * Classe Lombok (getters/setters) pour la
 * compatibilité avec les frameworks d'affichage
 * (PrimeFaces, etc.).
 *
 * @author UnionFlow Team
 * @version 3.0
 * @since 2026-02-21
 */
@Getter
@Setter
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class OrganisationResponse extends BaseResponse {

    // ── Identité ───────────────────────────────
    private String nom;
    private String nomCourt;
    private String description;
    private String email;
    private String telephone;
    private String telephoneSecondaire;
    private String emailSecondaire;

    // ── Web ────────────────────────────────────
    private String siteWeb;
    private String logo;
    private String reseauxSociaux;

    // ── Classification ─────────────────────────
    private String typeOrganisation;
    /** Alias pour tri/filtre (type d'organisation) */
    private String typeAssociation;
    private String typeOrganisationLibelle;
    /** Libellé du type pour affichage (alias typeOrganisationLibelle, ex. p:tag) */
    private String typeLibelle;
    private String statut;
    private String statutLibelle;
    private String statutSeverity;
    private LocalDate dateFondation;
    private String numeroEnregistrement;

    /**
     * Alias pour la vue (detail.xhtml, organisation-form.xhtml) : même valeur que numeroEnregistrement.
     */
    public String getNumeroRegistre() {
        return getNumeroEnregistrement();
    }

    public void setNumeroRegistre(String numeroRegistre) {
        setNumeroEnregistrement(numeroRegistre);
    }

    // ── Géographie ─────────────────────────────
    private String adresse;
    private String quartier;
    private String ville;
    private String region;
    private String pays;
    private String codePostal;
    private BigDecimal latitude;
    private BigDecimal longitude;

    // ── Hiérarchie ─────────────────────────────
    private UUID organisationParenteId;
    private String organisationParenteNom;
    /** Alias pour la vue (detail.xhtml) : même valeur que organisationParenteNom. */
    public String getNomOrganisationParente() {
        return getOrganisationParenteNom();
    }
    public void setNomOrganisationParente(String nomOrganisationParente) {
        setOrganisationParenteNom(nomOrganisationParente);
    }
    private Integer niveauHierarchique;
    private Boolean estOrganisationRacine;

    // ── Finances ───────────────────────────────
    private String devise;
    private BigDecimal budgetAnnuel;
    private Boolean cotisationObligatoire;
    private BigDecimal montantCotisationAnnuelle;

    // ── Statistiques ───────────────────────────
    private Integer nombreMembres;
    private Integer nombreAdministrateurs;
    /** Nombre d'événements (actifs) de l'organisation. */
    private Integer nombreEvenements;

    // ── Contenu ────────────────────────────────
    private String objectifs;
    private String activitesPrincipales;
    private String certifications;
    private String partenaires;
    private String notes;

    // ── Paramètres ─────────────────────────────
    private Boolean organisationPublique;
    private Boolean accepteNouveauxMembres;
}
