package dev.lions.unionflow.client.view;

import dev.lions.unionflow.client.dto.MembreDTO;
import dev.lions.unionflow.client.service.MembreService;
import jakarta.enterprise.context.SessionScoped;
import jakarta.inject.Inject;
import jakarta.inject.Named;
import jakarta.annotation.PostConstruct;
import org.eclipse.microprofile.rest.client.inject.RestClient;
import java.io.Serializable;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
import java.util.logging.Logger;
import org.primefaces.event.FileUploadEvent;

@Named("membreProfilBean")
@SessionScoped
public class MembreProfilBean implements Serializable {
    
    private static final long serialVersionUID = 1L;
    private static final Logger LOGGER = Logger.getLogger(MembreProfilBean.class.getName());
    
    @Inject
    @RestClient
    private MembreService membreService;
    
    private Membre membre;
    private Membre membreEdit;
    private Statistiques statistiques;
    private CotisationsData cotisations;
    private EvenementsData evenements;
    private AidesData aides;
    private DemandesData demandes;
    private HistoriqueData historique;
    private ContactData contact;
    private UUID membreId;
    
    @PostConstruct
    public void init() {
        if (membreId == null) {
            LOGGER.warning("Aucun membreId fourni, impossible de charger le profil");
            return;
        }
        chargerMembre();
        chargerStatistiques();
        chargerCotisations();
        chargerEvenements();
        chargerAides();
        chargerDemandes();
        chargerHistorique();
        initContact();
    }
    
    private void chargerMembre() {
        try {
            MembreDTO dto = membreService.obtenirParId(membreId);
            membre = convertToMembre(dto);
            
            // Copie pour l'édition
            membreEdit = new Membre();
            copierMembre(membre, membreEdit);
        } catch (Exception e) {
            LOGGER.severe("Erreur lors du chargement du membre: " + e.getMessage());
            membre = new Membre();
            membre.setId(membreId);
        }
    }
    
    private Membre convertToMembre(MembreDTO dto) {
        Membre membre = new Membre();
        membre.setId(dto.getId());
        membre.setNumeroMembre(dto.getNumeroMembre());
        membre.setPrenom(dto.getPrenom());
        membre.setNom(dto.getNom());
        membre.setEmail(dto.getEmail());
        membre.setTelephone(dto.getTelephone());
        membre.setDateNaissance(dto.getDateNaissance());
        // Note: Genre, situation familiale, ville, pays, type membre ne sont pas disponibles dans MembreDTO client
        // Ces champs seront ajoutés ultérieurement si nécessaire
        membre.setProfession(dto.getProfession());
        membre.setAdresse(dto.getAdresse());
        membre.setStatut(dto.getStatut() != null ? dto.getStatut() : "ACTIF");
        membre.setDateAdhesion(dto.getDateInscription() != null ? dto.getDateInscription().toLocalDate() : null);
        return membre;
    }
    
    private void chargerStatistiques() {
        statistiques = new Statistiques();
        statistiques.setEvenementsParticipes(24);
        statistiques.setCotisationsPayees(12);
        statistiques.setAidesRecues(2);
        statistiques.setScoreEngagement(95);
        statistiques.setTauxParticipation(85);
        statistiques.setEvenementsAnnee(8);
        statistiques.setEvenementsTotal(24);
        statistiques.setEvenementsOrganises(3);
        statistiques.setAbsences(2);
    }
    
    private void chargerCotisations() {
        cotisations = new CotisationsData();
        cotisations.setStatutActuel("À jour");
        cotisations.setStatutSeverity("success");
        cotisations.setDernierPaiement("15/07/2024");
        cotisations.setProchaineEcheance("15/08/2024");
        cotisations.setProchaineEcheanceClass("text-green-500");
        cotisations.setTotalAnnee("120 000 FCFA");
        
        // Historique des paiements
        List<PaiementCotisation> historique = new ArrayList<>();
        for (int i = 1; i <= 6; i++) {
            PaiementCotisation paiement = new PaiementCotisation();
            paiement.setDate(LocalDate.now().minusMonths(i));
            paiement.setMontant(10000.0);
            paiement.setModePaiement(i % 2 == 0 ? "Wave Money" : "Espèces");
            paiement.setModeIcon(i % 2 == 0 ? "pi-mobile" : "pi-money-bill");
            paiement.setStatut("Validé");
            paiement.setStatutSeverity("success");
            historique.add(paiement);
        }
        cotisations.setHistorique(historique);
    }
    
    private void chargerEvenements() {
        evenements = new EvenementsData();
        List<EvenementParticipation> recents = new ArrayList<>();
        
        String[] titres = {"Réunion mensuelle", "Action humanitaire", "Formation leadership", "Collecte de fonds"};
        String[] lieux = {"Hôtel Radisson", "École Primaire", "Centre de formation", "Stade Léopold Sédar Senghor"};
        String[] types = {"REUNION", "ACTION", "FORMATION", "COLLECTE"};
        
        for (int i = 0; i < 4; i++) {
            EvenementParticipation evt = new EvenementParticipation();
            evt.setTitre(titres[i]);
            evt.setDate(LocalDate.now().minusDays(i * 7).toString());
            evt.setLieu(lieux[i]);
            evt.setParticipation(i < 3 ? "Présent" : "Absent");
            evt.setParticipationSeverity(i < 3 ? "success" : "danger");
            evt.setRole(i == 0 ? "Organisateur" : "Participant");
            evt.setTypeIcon("pi-calendar");
            evt.setTypeColorClass("bg-blue-500");
            recents.add(evt);
        }
        evenements.setRecents(recents);
    }
    
    private void chargerAides() {
        aides = new AidesData();
        List<Aide> recues = new ArrayList<>();
        
        Aide aide1 = new Aide();
        aide1.setType("Aide médicale");
        aide1.setMontant(50000.0);
        aide1.setDate(LocalDate.of(2024, 5, 10));
        aide1.setStatut("Validée");
        aide1.setStatutSeverity("success");
        aide1.setTypeIcon("pi-heart");
        aide1.setTypeColor("text-red-500");
        recues.add(aide1);
        
        Aide aide2 = new Aide();
        aide2.setType("Aide scolaire");
        aide2.setMontant(25000.0);
        aide2.setDate(LocalDate.of(2024, 1, 15));
        aide2.setStatut("Validée");
        aide2.setStatutSeverity("success");
        aide2.setTypeIcon("pi-book");
        aide2.setTypeColor("text-blue-500");
        recues.add(aide2);
        
        aides.setRecues(recues);
    }
    
    private void chargerDemandes() {
        demandes = new DemandesData();
        List<Demande> enCours = new ArrayList<>();
        
        Demande demande1 = new Demande();
        demande1.setType("Certificat");
        demande1.setObjet("Certificat d'adhésion");
        demande1.setDateDepot(LocalDate.now().minusDays(3));
        demande1.setStatut("En cours");
        demande1.setStatutSeverity("warning");
        enCours.add(demande1);
        
        demandes.setEnCours(enCours);
    }
    
    private void chargerHistorique() {
        historique = new HistoriqueData();
        List<Activite> activites = new ArrayList<>();
        
        String[] descriptions = {
            "Profil mis à jour",
            "Participation à la réunion mensuelle",
            "Paiement de cotisation validé",
            "Nouvelle adhésion enregistrée"
        };
        
        for (int i = 0; i < 4; i++) {
            Activite activite = new Activite();
            activite.setDescription(descriptions[i]);
            activite.setDate(LocalDateTime.now().minusDays(i * 2).toString());
            activite.setAuteur(i == 0 ? "Jean DIALLO" : "Admin");
            activite.setIcone(i % 2 == 0 ? "pi-user" : "pi-calendar");
            activite.setCouleur(i % 2 == 0 ? "text-blue-500" : "text-green-500");
            if (i == 2) {
                activite.setDetails("Montant: 10 000 FCFA via Wave Money");
            }
            activites.add(activite);
        }
        historique.setActivites(activites);
    }
    
    private void initContact() {
        contact = new ContactData();
        contact.setCanaux(new ArrayList<>());
    }
    
    // Actions
    public void changerPhoto(FileUploadEvent event) {
        // Logique de changement de photo
        LOGGER.info("Photo changée: " + event.getFile().getFileName());
    }
    
    public String gererCotisations() {
        return "/pages/secure/membre/cotisations?id=" + membre.getId() + "&faces-redirect=true";
    }
    
    public void sauvegarderModifications() {
        copierMembre(membreEdit, membre);
        LOGGER.info("Profil mis à jour pour: " + membre.getNomComplet());
    }
    
    public void envoyerMessage() {
        LOGGER.info("Message envoyé: " + contact.getSujet() + " via " + contact.getCanaux());
        contact = new ContactData();
        contact.setCanaux(new ArrayList<>());
    }
    
    public void envoyerRappelCotisation() {
        LOGGER.info("Rappel de cotisation envoyé à: " + membre.getEmail());
    }
    
    public void suspendre() {
        membre.setStatut("SUSPENDU");
        LOGGER.info("Membre suspendu: " + membre.getNomComplet());
    }
    
    public void reactiver() {
        membre.setStatut("ACTIF");
        LOGGER.info("Membre réactivé: " + membre.getNomComplet());
    }
    
    public void exporterDonnees() {
        LOGGER.info("Export des données pour: " + membre.getNomComplet());
    }
    
    public String supprimer() {
        LOGGER.info("Membre supprimé: " + membre.getNomComplet());
        return "/pages/secure/membre/liste?faces-redirect=true";
    }
    
    private void copierMembre(Membre source, Membre destination) {
        destination.setId(source.getId());
        destination.setPrenom(source.getPrenom());
        destination.setNom(source.getNom());
        destination.setEmail(source.getEmail());
        destination.setTelephone(source.getTelephone());
        destination.setDateNaissance(source.getDateNaissance());
        destination.setProfession(source.getProfession());
        destination.setAdresse(source.getAdresse());
    }
    
    // Getters et Setters
    public Membre getMembre() { return membre; }
    public void setMembre(Membre membre) { this.membre = membre; }
    
    public Membre getMembreEdit() { return membreEdit; }
    public void setMembreEdit(Membre membreEdit) { this.membreEdit = membreEdit; }
    
    public Statistiques getStatistiques() { return statistiques; }
    public void setStatistiques(Statistiques statistiques) { this.statistiques = statistiques; }
    
    public CotisationsData getCotisations() { return cotisations; }
    public void setCotisations(CotisationsData cotisations) { this.cotisations = cotisations; }
    
    public EvenementsData getEvenements() { return evenements; }
    public void setEvenements(EvenementsData evenements) { this.evenements = evenements; }
    
    public AidesData getAides() { return aides; }
    public void setAides(AidesData aides) { this.aides = aides; }
    
    public DemandesData getDemandes() { return demandes; }
    public void setDemandes(DemandesData demandes) { this.demandes = demandes; }
    
    public HistoriqueData getHistorique() { return historique; }
    public void setHistorique(HistoriqueData historique) { this.historique = historique; }
    
    public ContactData getContact() { return contact; }
    public void setContact(ContactData contact) { this.contact = contact; }
    
    public UUID getMembreId() { return membreId; }
    public void setMembreId(UUID membreId) { this.membreId = membreId; }
    
    // Classes internes
    public static class Membre {
        private UUID id;
        private String numeroMembre;
        private String prenom;
        private String nom;
        private String email;
        private String telephone;
        private LocalDate dateNaissance;
        private String genre;
        private String situationFamiliale;
        private String profession;
        private String adresse;
        private String ville;
        private String pays;
        private String typeMembre;
        private String statut;
        private String entite;
        private LocalDate dateAdhesion;
        private String cotisationStatut;
        private int tauxParticipation;
        private String photoUrl;
        private List<MembreFamille> famille = new ArrayList<>();
        
        // Getters et setters
        public UUID getId() { return id; }
        public void setId(UUID id) { this.id = id; }
        
        public String getNumeroMembre() { return numeroMembre; }
        public void setNumeroMembre(String numeroMembre) { this.numeroMembre = numeroMembre; }
        
        public String getPrenom() { return prenom; }
        public void setPrenom(String prenom) { this.prenom = prenom; }
        
        public String getNom() { return nom; }
        public void setNom(String nom) { this.nom = nom; }
        
        public String getEmail() { return email; }
        public void setEmail(String email) { this.email = email; }
        
        public String getTelephone() { return telephone; }
        public void setTelephone(String telephone) { this.telephone = telephone; }
        
        public LocalDate getDateNaissance() { return dateNaissance; }
        public void setDateNaissance(LocalDate dateNaissance) { this.dateNaissance = dateNaissance; }
        
        public String getGenre() { return genre; }
        public void setGenre(String genre) { this.genre = genre; }
        
        public String getSituationFamiliale() { return situationFamiliale; }
        public void setSituationFamiliale(String situationFamiliale) { this.situationFamiliale = situationFamiliale; }
        
        public String getProfession() { return profession; }
        public void setProfession(String profession) { this.profession = profession; }
        
        public String getAdresse() { return adresse; }
        public void setAdresse(String adresse) { this.adresse = adresse; }
        
        public String getVille() { return ville; }
        public void setVille(String ville) { this.ville = ville; }
        
        public String getPays() { return pays; }
        public void setPays(String pays) { this.pays = pays; }
        
        public String getTypeMembre() { return typeMembre; }
        public void setTypeMembre(String typeMembre) { this.typeMembre = typeMembre; }
        
        public String getStatut() { return statut; }
        public void setStatut(String statut) { this.statut = statut; }
        
        public String getEntite() { return entite; }
        public void setEntite(String entite) { this.entite = entite; }
        
        public LocalDate getDateAdhesion() { return dateAdhesion; }
        public void setDateAdhesion(LocalDate dateAdhesion) { this.dateAdhesion = dateAdhesion; }
        
        public String getCotisationStatut() { return cotisationStatut; }
        public void setCotisationStatut(String cotisationStatut) { this.cotisationStatut = cotisationStatut; }
        
        public int getTauxParticipation() { return tauxParticipation; }
        public void setTauxParticipation(int tauxParticipation) { this.tauxParticipation = tauxParticipation; }
        
        public String getPhotoUrl() { return photoUrl; }
        public void setPhotoUrl(String photoUrl) { this.photoUrl = photoUrl; }
        
        public List<MembreFamille> getFamille() { return famille; }
        public void setFamille(List<MembreFamille> famille) { this.famille = famille; }
        
        // Propriétés dérivées
        public String getNomComplet() {
            return prenom + " " + nom;
        }
        
        public String getInitiales() {
            return (prenom != null ? prenom.substring(0, 1) : "") + 
                   (nom != null ? nom.substring(0, 1) : "");
        }
        
        public String getStatutSeverity() {
            return switch (statut) {
                case "ACTIF" -> "success";
                case "INACTIF" -> "warning";
                case "SUSPENDU" -> "danger";
                case "RADIE" -> "danger";
                default -> "secondary";
            };
        }
        
        public String getStatutIcon() {
            return switch (statut) {
                case "ACTIF" -> "pi-check";
                case "INACTIF" -> "pi-pause";
                case "SUSPENDU" -> "pi-ban";
                case "RADIE" -> "pi-times";
                default -> "pi-circle";
            };
        }
        
        public String getTypeSeverity() {
            return switch (typeMembre) {
                case "ACTIF" -> "info";
                case "ASSOCIE" -> "success";
                case "BIENFAITEUR" -> "warning";
                case "HONORAIRE" -> "secondary";
                default -> "info";
            };
        }
        
        public String getTypeIcon() {
            return switch (typeMembre) {
                case "ACTIF" -> "pi-user";
                case "ASSOCIE" -> "pi-users";
                case "BIENFAITEUR" -> "pi-star";
                case "HONORAIRE" -> "pi-crown";
                default -> "pi-user";
            };
        }
        
        public String getAnciennete() {
            if (dateAdhesion == null) return "N/A";
            long mois = java.time.temporal.ChronoUnit.MONTHS.between(dateAdhesion, LocalDate.now());
            if (mois < 12) return mois + " mois";
            return (mois / 12) + " an" + (mois / 12 > 1 ? "s" : "");
        }
        
        public String getCotisationColor() {
            return cotisationStatut != null && cotisationStatut.equals("À jour") ? "text-green-500" : "text-red-500";
        }
    }
    
    public static class MembreFamille {
        private String nomComplet;
        private String relation;
        private LocalDate dateNaissance;
        private boolean beneficiaire;
        
        // Getters et setters
        public String getNomComplet() { return nomComplet; }
        public void setNomComplet(String nomComplet) { this.nomComplet = nomComplet; }
        
        public String getRelation() { return relation; }
        public void setRelation(String relation) { this.relation = relation; }
        
        public LocalDate getDateNaissance() { return dateNaissance; }
        public void setDateNaissance(LocalDate dateNaissance) { this.dateNaissance = dateNaissance; }
        
        public boolean isBeneficiaire() { return beneficiaire; }
        public void setBeneficiaire(boolean beneficiaire) { this.beneficiaire = beneficiaire; }
    }
    
    public static class Statistiques {
        private int evenementsParticipes;
        private int cotisationsPayees;
        private int aidesRecues;
        private int scoreEngagement;
        private int tauxParticipation;
        private int evenementsAnnee;
        private int evenementsTotal;
        private int evenementsOrganises;
        private int absences;
        
        // Getters et setters
        public int getEvenementsParticipes() { return evenementsParticipes; }
        public void setEvenementsParticipes(int evenementsParticipes) { this.evenementsParticipes = evenementsParticipes; }
        
        public int getCotisationsPayees() { return cotisationsPayees; }
        public void setCotisationsPayees(int cotisationsPayees) { this.cotisationsPayees = cotisationsPayees; }
        
        public int getAidesRecues() { return aidesRecues; }
        public void setAidesRecues(int aidesRecues) { this.aidesRecues = aidesRecues; }
        
        public int getScoreEngagement() { return scoreEngagement; }
        public void setScoreEngagement(int scoreEngagement) { this.scoreEngagement = scoreEngagement; }
        
        public int getTauxParticipation() { return tauxParticipation; }
        public void setTauxParticipation(int tauxParticipation) { this.tauxParticipation = tauxParticipation; }
        
        public int getEvenementsAnnee() { return evenementsAnnee; }
        public void setEvenementsAnnee(int evenementsAnnee) { this.evenementsAnnee = evenementsAnnee; }
        
        public int getEvenementsTotal() { return evenementsTotal; }
        public void setEvenementsTotal(int evenementsTotal) { this.evenementsTotal = evenementsTotal; }
        
        public int getEvenementsOrganises() { return evenementsOrganises; }
        public void setEvenementsOrganises(int evenementsOrganises) { this.evenementsOrganises = evenementsOrganises; }
        
        public int getAbsences() { return absences; }
        public void setAbsences(int absences) { this.absences = absences; }
    }
    
    public static class CotisationsData {
        private String statutActuel;
        private String statutSeverity;
        private String dernierPaiement;
        private String prochaineEcheance;
        private String prochaineEcheanceClass;
        private String totalAnnee;
        private List<PaiementCotisation> historique = new ArrayList<>();
        
        // Getters et setters
        public String getStatutActuel() { return statutActuel; }
        public void setStatutActuel(String statutActuel) { this.statutActuel = statutActuel; }
        
        public String getStatutSeverity() { return statutSeverity; }
        public void setStatutSeverity(String statutSeverity) { this.statutSeverity = statutSeverity; }
        
        public String getDernierPaiement() { return dernierPaiement; }
        public void setDernierPaiement(String dernierPaiement) { this.dernierPaiement = dernierPaiement; }
        
        public String getProchaineEcheance() { return prochaineEcheance; }
        public void setProchaineEcheance(String prochaineEcheance) { this.prochaineEcheance = prochaineEcheance; }
        
        public String getProchaineEcheanceClass() { return prochaineEcheanceClass; }
        public void setProchaineEcheanceClass(String prochaineEcheanceClass) { this.prochaineEcheanceClass = prochaineEcheanceClass; }
        
        public String getTotalAnnee() { return totalAnnee; }
        public void setTotalAnnee(String totalAnnee) { this.totalAnnee = totalAnnee; }
        
        public List<PaiementCotisation> getHistorique() { return historique; }
        public void setHistorique(List<PaiementCotisation> historique) { this.historique = historique; }
    }
    
    public static class PaiementCotisation {
        private LocalDate date;
        private Double montant;
        private String modePaiement;
        private String modeIcon;
        private String statut;
        private String statutSeverity;
        
        // Getters et setters
        public LocalDate getDate() { return date; }
        public void setDate(LocalDate date) { this.date = date; }
        
        public Double getMontant() { return montant; }
        public void setMontant(Double montant) { this.montant = montant; }
        
        public String getModePaiement() { return modePaiement; }
        public void setModePaiement(String modePaiement) { this.modePaiement = modePaiement; }
        
        public String getModeIcon() { return modeIcon; }
        public void setModeIcon(String modeIcon) { this.modeIcon = modeIcon; }
        
        public String getStatut() { return statut; }
        public void setStatut(String statut) { this.statut = statut; }
        
        public String getStatutSeverity() { return statutSeverity; }
        public void setStatutSeverity(String statutSeverity) { this.statutSeverity = statutSeverity; }
    }
    
    public static class EvenementsData {
        private List<EvenementParticipation> recents = new ArrayList<>();
        
        public List<EvenementParticipation> getRecents() { return recents; }
        public void setRecents(List<EvenementParticipation> recents) { this.recents = recents; }
    }
    
    public static class EvenementParticipation {
        private String titre;
        private String date;
        private String lieu;
        private String participation;
        private String participationSeverity;
        private String role;
        private String typeIcon;
        private String typeColorClass;
        
        // Getters et setters
        public String getTitre() { return titre; }
        public void setTitre(String titre) { this.titre = titre; }
        
        public String getDate() { return date; }
        public void setDate(String date) { this.date = date; }
        
        public String getLieu() { return lieu; }
        public void setLieu(String lieu) { this.lieu = lieu; }
        
        public String getParticipation() { return participation; }
        public void setParticipation(String participation) { this.participation = participation; }
        
        public String getParticipationSeverity() { return participationSeverity; }
        public void setParticipationSeverity(String participationSeverity) { this.participationSeverity = participationSeverity; }
        
        public String getRole() { return role; }
        public void setRole(String role) { this.role = role; }
        
        public String getTypeIcon() { return typeIcon; }
        public void setTypeIcon(String typeIcon) { this.typeIcon = typeIcon; }
        
        public String getTypeColorClass() { return typeColorClass; }
        public void setTypeColorClass(String typeColorClass) { this.typeColorClass = typeColorClass; }
    }
    
    public static class AidesData {
        private List<Aide> recues = new ArrayList<>();
        
        public List<Aide> getRecues() { return recues; }
        public void setRecues(List<Aide> recues) { this.recues = recues; }
    }
    
    public static class Aide {
        private String type;
        private Double montant;
        private LocalDate date;
        private String statut;
        private String statutSeverity;
        private String typeIcon;
        private String typeColor;
        
        // Getters et setters
        public String getType() { return type; }
        public void setType(String type) { this.type = type; }
        
        public Double getMontant() { return montant; }
        public void setMontant(Double montant) { this.montant = montant; }
        
        public LocalDate getDate() { return date; }
        public void setDate(LocalDate date) { this.date = date; }
        
        public String getStatut() { return statut; }
        public void setStatut(String statut) { this.statut = statut; }
        
        public String getStatutSeverity() { return statutSeverity; }
        public void setStatutSeverity(String statutSeverity) { this.statutSeverity = statutSeverity; }
        
        public String getTypeIcon() { return typeIcon; }
        public void setTypeIcon(String typeIcon) { this.typeIcon = typeIcon; }
        
        public String getTypeColor() { return typeColor; }
        public void setTypeColor(String typeColor) { this.typeColor = typeColor; }
    }
    
    public static class DemandesData {
        private List<Demande> enCours = new ArrayList<>();
        
        public List<Demande> getEnCours() { return enCours; }
        public void setEnCours(List<Demande> enCours) { this.enCours = enCours; }
    }
    
    public static class Demande {
        private String type;
        private String objet;
        private LocalDate dateDepot;
        private String statut;
        private String statutSeverity;
        
        // Getters et setters
        public String getType() { return type; }
        public void setType(String type) { this.type = type; }
        
        public String getObjet() { return objet; }
        public void setObjet(String objet) { this.objet = objet; }
        
        public LocalDate getDateDepot() { return dateDepot; }
        public void setDateDepot(LocalDate dateDepot) { this.dateDepot = dateDepot; }
        
        public String getStatut() { return statut; }
        public void setStatut(String statut) { this.statut = statut; }
        
        public String getStatutSeverity() { return statutSeverity; }
        public void setStatutSeverity(String statutSeverity) { this.statutSeverity = statutSeverity; }
    }
    
    public static class HistoriqueData {
        private List<Activite> activites = new ArrayList<>();
        
        public List<Activite> getActivites() { return activites; }
        public void setActivites(List<Activite> activites) { this.activites = activites; }
    }
    
    public static class Activite {
        private String description;
        private String date;
        private String auteur;
        private String icone;
        private String couleur;
        private String details;
        
        // Getters et setters
        public String getDescription() { return description; }
        public void setDescription(String description) { this.description = description; }
        
        public String getDate() { return date; }
        public void setDate(String date) { this.date = date; }
        
        public String getAuteur() { return auteur; }
        public void setAuteur(String auteur) { this.auteur = auteur; }
        
        public String getIcone() { return icone; }
        public void setIcone(String icone) { this.icone = icone; }
        
        public String getCouleur() { return couleur; }
        public void setCouleur(String couleur) { this.couleur = couleur; }
        
        public String getDetails() { return details; }
        public void setDetails(String details) { this.details = details; }
    }
    
    public static class ContactData {
        private String sujet;
        private String message;
        private List<String> canaux = new ArrayList<>();
        
        // Getters et setters
        public String getSujet() { return sujet; }
        public void setSujet(String sujet) { this.sujet = sujet; }
        
        public String getMessage() { return message; }
        public void setMessage(String message) { this.message = message; }
        
        public List<String> getCanaux() { return canaux; }
        public void setCanaux(List<String> canaux) { this.canaux = canaux; }
    }
}