package dev.lions.unionflow.client.view;

import dev.lions.unionflow.server.api.dto.souscription.SouscriptionStatutResponse;
import dev.lions.unionflow.client.service.SouscriptionService;
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.util.ArrayList;
import java.util.List;
import java.util.UUID;
import java.util.logging.Logger;

@Named("souscriptionBean")
@SessionScoped
public class SouscriptionBean implements Serializable {

    private static final long serialVersionUID = 1L;
    private static final Logger LOGGER = Logger.getLogger(SouscriptionBean.class.getName());

    private static final String OUTCOME_SOUSCRIPTION_UPGRADE = "souscriptionUpgradePage";
    private static final String OUTCOME_SOUSCRIPTION_CHANGE_PLAN = "souscriptionChangePlanPage";
    private static final String OUTCOME_SOUSCRIPTION_RENEW = "souscriptionRenewPage";

    @Inject
    @RestClient
    private SouscriptionService souscriptionService;

    private UUID organisationId;

    private List<SouscriptionStatutResponse> souscriptionsOrganisation;
    private SouscriptionStatutResponse souscriptionActive;
    private SouscriptionStatutResponse souscriptionSelectionnee;

    // Statistiques quota
    private int membresActuels = 0;
    private int quotaMaximum = 0;
    private boolean quotaAtteint = false;
    private int membresRestants = 0;

    // Alertes
    private boolean alerteExpirationProche = false;
    private boolean alerteQuotaProche = false;
    private int joursAvantExpiration = 0;

    @PostConstruct
    public void init() {
        if (organisationId != null) {
            initializeData();
        } else {
            LOGGER.warning("Aucun organisationId fourni, impossible de charger les souscriptions");
            souscriptionsOrganisation = new ArrayList<>();
        }
    }

    private void initializeData() {
        try {
            souscriptionsOrganisation = souscriptionService.listerToutes(organisationId, 0, 100);
            souscriptionActive = souscriptionService.obtenirActive(organisationId);
            if (souscriptionActive == null && souscriptionsOrganisation != null && !souscriptionsOrganisation.isEmpty()) {
                souscriptionActive = souscriptionsOrganisation.stream()
                    .filter(s -> "ACTIVE".equals(s.getStatut()))
                    .findFirst()
                    .orElse(null);
            }
            updateStatistiques();
        } catch (Exception e) {
            LOGGER.severe("Erreur lors du chargement des souscriptions: " + e.getMessage());
            souscriptionsOrganisation = new ArrayList<>();
        }
    }

    private void updateStatistiques() {
        if (souscriptionActive != null) {
            membresActuels = souscriptionActive.getQuotaUtilise() != null ? souscriptionActive.getQuotaUtilise() : 0;
            quotaMaximum = souscriptionActive.getQuotaMax() != null ? souscriptionActive.getQuotaMax() : 0;
            membresRestants = souscriptionActive.getQuotaRestant() != null ? souscriptionActive.getQuotaRestant() : 0;
            quotaAtteint = souscriptionActive.isQuotaDepasse();
            joursAvantExpiration = (int) souscriptionActive.getJoursAvantExpiration();
            alerteExpirationProche = joursAvantExpiration >= 0 && joursAvantExpiration <= 30;
            int pourcentage = quotaMaximum > 0 ? membresActuels * 100 / quotaMaximum : 0;
            alerteQuotaProche = pourcentage >= 85;
        }
    }

    public boolean peutAccepterNouveauMembre() {
        return souscriptionActive != null
                && "ACTIVE".equals(souscriptionActive.getStatut())
                && !souscriptionActive.isQuotaDepasse();
    }

    public String getMessageQuota() {
        if (souscriptionActive == null) {
            return "Aucune souscription active";
        }
        if (quotaAtteint) {
            return "Quota maximum atteint (" + quotaMaximum + " membres)";
        }
        if (alerteQuotaProche) {
            return "Attention: quota bientôt atteint (" + membresActuels + "/" + quotaMaximum + ")";
        }
        return membresRestants + " membre(s) restant(s) sur " + quotaMaximum;
    }

    public String getCouleurJaugeQuota() {
        int pourcentage = quotaMaximum > 0 ? membresActuels * 100 / quotaMaximum : 0;
        if (pourcentage >= 100) return "danger";
        if (pourcentage >= 85) return "warning";
        if (pourcentage >= 70) return "info";
        return "success";
    }

    public String upgraderFormulaire() {
        return OUTCOME_SOUSCRIPTION_UPGRADE + "?faces-redirect=true";
    }

    public String changerFormulaire() {
        return OUTCOME_SOUSCRIPTION_CHANGE_PLAN + "?faces-redirect=true";
    }

    public String renouvelerSouscription() {
        return OUTCOME_SOUSCRIPTION_RENEW + "?faces-redirect=true";
    }

    public List<AlerteQuota> getAlertesQuota() {
        List<AlerteQuota> alertes = new ArrayList<>();

        if (alerteExpirationProche) {
            AlerteQuota alerte = new AlerteQuota();
            alerte.setType("EXPIRATION");
            alerte.setSeverite("warning");
            alerte.setIcone("pi-clock");
            alerte.setTitre("Souscription expire bientôt");
            alerte.setMessage("Votre souscription expire dans " + joursAvantExpiration + " jour(s)");
            alerte.setAction("Renouveler maintenant");
            alerte.setActionUrl("/pages/secure/souscription/renew");
            alertes.add(alerte);
        }

        if (alerteQuotaProche && !quotaAtteint) {
            AlerteQuota alerte = new AlerteQuota();
            alerte.setType("QUOTA_PROCHE");
            alerte.setSeverite("info");
            alerte.setIcone("pi-users");
            alerte.setTitre("Quota bientôt atteint");
            alerte.setMessage("Vous approchez de votre limite (" + membresActuels + "/" + quotaMaximum + ")");
            alerte.setAction("Upgrader le plan");
            alerte.setActionUrl("/pages/secure/souscription/upgrade");
            alertes.add(alerte);
        }

        if (quotaAtteint) {
            AlerteQuota alerte = new AlerteQuota();
            alerte.setType("QUOTA_ATTEINT");
            alerte.setSeverite("danger");
            alerte.setIcone("pi-exclamation-triangle");
            alerte.setTitre("Quota maximum atteint");
            alerte.setMessage("Vous ne pouvez plus accepter de nouveaux membres");
            alerte.setAction("Upgrader maintenant");
            alerte.setActionUrl("/pages/secure/souscription/upgrade");
            alertes.add(alerte);
        }

        return alertes;
    }

    public String getSeveriteQuota() {
        if (quotaAtteint) return "danger";
        if (alerteQuotaProche) return "warning";
        return "info";
    }

    public String getIconeStatut() {
        if (souscriptionActive == null) return "pi-times-circle text-red-500";
        String statut = souscriptionActive.getStatut();
        if ("ACTIVE".equals(statut)) return "pi-check-circle text-green-500";
        if ("EXPIREE".equals(statut)) return "pi-clock text-red-500";
        if ("SUSPENDUE".equals(statut)) return "pi-pause text-orange-500";
        return "pi-info-circle text-blue-500";
    }

    // Getters et Setters
    public List<SouscriptionStatutResponse> getSouscriptionsOrganisation() { return souscriptionsOrganisation; }
    public void setSouscriptionsOrganisation(List<SouscriptionStatutResponse> souscriptionsOrganisation) { this.souscriptionsOrganisation = souscriptionsOrganisation; }

    public SouscriptionStatutResponse getSouscriptionActive() { return souscriptionActive; }
    public void setSouscriptionActive(SouscriptionStatutResponse souscriptionActive) { this.souscriptionActive = souscriptionActive; }

    public SouscriptionStatutResponse getSouscriptionSelectionnee() { return souscriptionSelectionnee; }
    public void setSouscriptionSelectionnee(SouscriptionStatutResponse souscriptionSelectionnee) { this.souscriptionSelectionnee = souscriptionSelectionnee; }

    public UUID getOrganisationId() { return organisationId; }
    public void setOrganisationId(UUID organisationId) { this.organisationId = organisationId; }

    public int getMembresActuels() { return membresActuels; }
    public void setMembresActuels(int membresActuels) { this.membresActuels = membresActuels; }

    public int getQuotaMaximum() { return quotaMaximum; }
    public void setQuotaMaximum(int quotaMaximum) { this.quotaMaximum = quotaMaximum; }

    public boolean isQuotaAtteint() { return quotaAtteint; }
    public void setQuotaAtteint(boolean quotaAtteint) { this.quotaAtteint = quotaAtteint; }

    public int getMembresRestants() { return membresRestants; }
    public void setMembresRestants(int membresRestants) { this.membresRestants = membresRestants; }

    public boolean isAlerteExpirationProche() { return alerteExpirationProche; }
    public void setAlerteExpirationProche(boolean alerteExpirationProche) { this.alerteExpirationProche = alerteExpirationProche; }

    public boolean isAlerteQuotaProche() { return alerteQuotaProche; }
    public void setAlerteQuotaProche(boolean alerteQuotaProche) { this.alerteQuotaProche = alerteQuotaProche; }

    public int getJoursAvantExpiration() { return joursAvantExpiration; }
    public void setJoursAvantExpiration(int joursAvantExpiration) { this.joursAvantExpiration = joursAvantExpiration; }

    // Classe interne pour les alertes
    public static class AlerteQuota implements Serializable {
        private String type;
        private String severite;
        private String icone;
        private String titre;
        private String message;
        private String action;
        private String actionUrl;

        public String getType() { return type; }
        public void setType(String type) { this.type = type; }

        public String getSeverite() { return severite; }
        public void setSeverite(String severite) { this.severite = severite; }

        public String getIcone() { return icone; }
        public void setIcone(String icone) { this.icone = icone; }

        public String getTitre() { return titre; }
        public void setTitre(String titre) { this.titre = titre; }

        public String getMessage() { return message; }
        public void setMessage(String message) { this.message = message; }

        public String getAction() { return action; }
        public void setAction(String action) { this.action = action; }

        public String getActionUrl() { return actionUrl; }
        public void setActionUrl(String actionUrl) { this.actionUrl = actionUrl; }
    }
}
