-- ============================================================================
-- V35 — Recalibrage nombre_membres + trigger auto-maintien
--
-- DATA-01 : Le compteur organisations.nombre_membres est désynchronisé quand
-- des membres sont importés directement en DB (hors service Java).
-- Fix :
--   1. Recalibrage immédiat depuis membres_organisations réels (actifs)
--   2. Trigger PostgreSQL pour maintenir le compteur à jour automatiquement
-- ============================================================================

-- 1. Recalibrage ponctuel : recalculer depuis la table membres_organisations
UPDATE organisations o
SET nombre_membres = (
    SELECT COUNT(*)
    FROM membres_organisations mo
    WHERE mo.organisation_id = o.id
      AND mo.actif = true
      AND mo.statut IN ('ACTIF', 'ACTIF_PREMIUM')
);

-- 2. Fonction trigger : incrémente/décrémente selon INSERT/UPDATE/DELETE
CREATE OR REPLACE FUNCTION update_organisation_nombre_membres()
RETURNS TRIGGER AS $$
BEGIN
    IF TG_OP = 'INSERT' THEN
        -- Nouveau membre actif → incrémenter
        IF NEW.actif = true AND NEW.statut IN ('ACTIF', 'ACTIF_PREMIUM') THEN
            UPDATE organisations
            SET nombre_membres = GREATEST(0, nombre_membres + 1)
            WHERE id = NEW.organisation_id;
        END IF;

    ELSIF TG_OP = 'UPDATE' THEN
        -- Transition actif/inactif ou statut
        DECLARE
            was_counted BOOLEAN := OLD.actif = true AND OLD.statut IN ('ACTIF', 'ACTIF_PREMIUM');
            is_counted  BOOLEAN := NEW.actif = true AND NEW.statut IN ('ACTIF', 'ACTIF_PREMIUM');
        BEGIN
            IF NOT was_counted AND is_counted THEN
                UPDATE organisations
                SET nombre_membres = GREATEST(0, nombre_membres + 1)
                WHERE id = NEW.organisation_id;
            ELSIF was_counted AND NOT is_counted THEN
                UPDATE organisations
                SET nombre_membres = GREATEST(0, nombre_membres - 1)
                WHERE id = OLD.organisation_id;
            END IF;
        END;

    ELSIF TG_OP = 'DELETE' THEN
        -- Suppression physique (rare)
        IF OLD.actif = true AND OLD.statut IN ('ACTIF', 'ACTIF_PREMIUM') THEN
            UPDATE organisations
            SET nombre_membres = GREATEST(0, nombre_membres - 1)
            WHERE id = OLD.organisation_id;
        END IF;
    END IF;

    RETURN COALESCE(NEW, OLD);
END;
$$ LANGUAGE plpgsql;

-- 3. Attacher le trigger à membres_organisations
DO $$
BEGIN
    IF NOT EXISTS (
        SELECT 1 FROM pg_trigger
        WHERE tgname = 'trg_update_nombre_membres'
          AND tgrelid = 'membres_organisations'::regclass
    ) THEN
        CREATE TRIGGER trg_update_nombre_membres
        AFTER INSERT OR UPDATE OF actif, statut OR DELETE
        ON membres_organisations
        FOR EACH ROW
        EXECUTE FUNCTION update_organisation_nombre_membres();
    END IF;
END $$;
