-- ============================================================
-- V2.0 — Refactoring: membres → utilisateurs
-- Sépare l'identité globale (utilisateurs) du lien organisationnel
-- Auteur: UnionFlow Team | BCEAO/OHADA compliant
-- ============================================================

-- Renommer la table membres → utilisateurs
ALTER TABLE membres RENAME TO utilisateurs;

-- Supprimer l'ancien lien unique membre↔organisation (maintenant dans membres_organisations)
ALTER TABLE utilisateurs DROP COLUMN IF EXISTS organisation_id;
ALTER TABLE utilisateurs DROP COLUMN IF EXISTS date_adhesion;
ALTER TABLE utilisateurs DROP COLUMN IF EXISTS mot_de_passe;
ALTER TABLE utilisateurs DROP COLUMN IF EXISTS roles;

-- Ajouter les nouveaux champs identité globale
ALTER TABLE utilisateurs ADD COLUMN IF NOT EXISTS keycloak_id UUID UNIQUE;
ALTER TABLE utilisateurs ADD COLUMN IF NOT EXISTS photo_url VARCHAR(500);
ALTER TABLE utilisateurs ADD COLUMN IF NOT EXISTS statut_compte VARCHAR(30) NOT NULL DEFAULT 'ACTIF';
ALTER TABLE utilisateurs ADD COLUMN IF NOT EXISTS telephone_wave VARCHAR(13);

-- Mettre à jour la contrainte de statut compte
ALTER TABLE utilisateurs
    ADD CONSTRAINT chk_utilisateur_statut_compte
    CHECK (statut_compte IN ('ACTIF', 'SUSPENDU', 'DESACTIVE'));

-- Mettre à jour les index
DROP INDEX IF EXISTS idx_membre_organisation;
DROP INDEX IF EXISTS idx_membre_email;
DROP INDEX IF EXISTS idx_membre_numero;
DROP INDEX IF EXISTS idx_membre_actif;

CREATE UNIQUE INDEX IF NOT EXISTS idx_utilisateur_email      ON utilisateurs(email);
CREATE UNIQUE INDEX IF NOT EXISTS idx_utilisateur_numero     ON utilisateurs(numero_membre);
CREATE INDEX IF NOT EXISTS idx_utilisateur_actif             ON utilisateurs(actif);
CREATE UNIQUE INDEX IF NOT EXISTS idx_utilisateur_keycloak   ON utilisateurs(keycloak_id);
CREATE INDEX IF NOT EXISTS idx_utilisateur_statut_compte     ON utilisateurs(statut_compte);

-- ============================================================
-- Table membres_organisations : lien utilisateur ↔ organisation
-- ============================================================
CREATE TABLE IF NOT EXISTS membres_organisations (
    id UUID PRIMARY KEY DEFAULT gen_random_uuid(),

    utilisateur_id   UUID NOT NULL,
    organisation_id  UUID NOT NULL,
    unite_id         UUID,               -- agence/bureau d'affectation (null = siège)

    statut_membre    VARCHAR(30) NOT NULL DEFAULT 'EN_ATTENTE_VALIDATION',
    date_adhesion    DATE,
    date_changement_statut DATE,
    motif_statut     VARCHAR(500),
    approuve_par_id  UUID,

    -- Métadonnées BaseEntity
    actif            BOOLEAN NOT NULL DEFAULT TRUE,
    date_creation    TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
    date_modification TIMESTAMP,
    cree_par         VARCHAR(255),
    modifie_par      VARCHAR(255),
    version          BIGINT NOT NULL DEFAULT 0,

    CONSTRAINT fk_mo_utilisateur   FOREIGN KEY (utilisateur_id)  REFERENCES utilisateurs(id)   ON DELETE CASCADE,
    CONSTRAINT fk_mo_organisation  FOREIGN KEY (organisation_id) REFERENCES organisations(id)  ON DELETE CASCADE,
    CONSTRAINT fk_mo_unite         FOREIGN KEY (unite_id)        REFERENCES organisations(id)  ON DELETE SET NULL,
    CONSTRAINT fk_mo_approuve_par  FOREIGN KEY (approuve_par_id) REFERENCES utilisateurs(id)   ON DELETE SET NULL,
    CONSTRAINT uk_mo_utilisateur_organisation UNIQUE (utilisateur_id, organisation_id),
    CONSTRAINT chk_mo_statut CHECK (statut_membre IN (
        'EN_ATTENTE_VALIDATION','ACTIF','INACTIF',
        'SUSPENDU','DEMISSIONNAIRE','RADIE','HONORAIRE','DECEDE'
    ))
);

CREATE INDEX idx_mo_utilisateur   ON membres_organisations(utilisateur_id);
CREATE INDEX idx_mo_organisation  ON membres_organisations(organisation_id);
CREATE INDEX idx_mo_statut        ON membres_organisations(statut_membre);
CREATE INDEX idx_mo_unite         ON membres_organisations(unite_id);

-- Mettre à jour les FK des tables existantes qui pointaient sur membres(id)
ALTER TABLE cotisations
    DROP CONSTRAINT IF EXISTS fk_cotisation_membre,
    ADD  CONSTRAINT fk_cotisation_membre FOREIGN KEY (membre_id) REFERENCES utilisateurs(id);

ALTER TABLE inscriptions_evenement
    DROP CONSTRAINT IF EXISTS fk_inscription_membre,
    ADD  CONSTRAINT fk_inscription_membre FOREIGN KEY (membre_id) REFERENCES utilisateurs(id);

ALTER TABLE demandes_aide
    DROP CONSTRAINT IF EXISTS fk_demande_demandeur,
    DROP CONSTRAINT IF EXISTS fk_demande_evaluateur,
    ADD  CONSTRAINT fk_demande_demandeur  FOREIGN KEY (demandeur_id)  REFERENCES utilisateurs(id),
    ADD  CONSTRAINT fk_demande_evaluateur FOREIGN KEY (evaluateur_id) REFERENCES utilisateurs(id) ON DELETE SET NULL;

COMMENT ON TABLE utilisateurs IS 'Identité globale unique de chaque utilisateur UnionFlow (1 compte = 1 profil)';
COMMENT ON TABLE membres_organisations IS 'Lien utilisateur ↔ organisation avec statut de membership';
COMMENT ON COLUMN membres_organisations.unite_id IS 'Agence/bureau d''affectation au sein de la hiérarchie. NULL = siège';
