-- ============================================================================
-- V20 — Enrichissement StatutMembre + Seed permissions atomiques
-- Les permissions suivent le format : MODULE > RESSOURCE > ACTION
-- ============================================================================

-- ============================================================================
-- 1. Statut INVITE sur membres_organisations
-- La colonne statut_membre est VARCHAR(30), pas d'enum SQL → simple check de longueur
-- Aucune modification DDL nécessaire, le type Java StatutMembre.INVITE est suffisant
-- ============================================================================

-- Vérifier que la colonne statut_membre est assez large pour les nouveaux statuts
DO $$
BEGIN
    IF EXISTS (
        SELECT 1 FROM information_schema.columns
        WHERE table_name = 'membres_organisations'
          AND column_name = 'statut_membre'
          AND character_maximum_length < 30
    ) THEN
        ALTER TABLE membres_organisations ALTER COLUMN statut_membre TYPE VARCHAR(30);
    END IF;
END $$;

-- Ajouter les colonnes de cycle de vie enrichies
ALTER TABLE membres_organisations ADD COLUMN IF NOT EXISTS date_invitation TIMESTAMP WITH TIME ZONE;
ALTER TABLE membres_organisations ADD COLUMN IF NOT EXISTS date_expiration_invitation TIMESTAMP WITH TIME ZONE;
ALTER TABLE membres_organisations ADD COLUMN IF NOT EXISTS token_invitation VARCHAR(255);
ALTER TABLE membres_organisations ADD COLUMN IF NOT EXISTS invite_par UUID;
ALTER TABLE membres_organisations ADD COLUMN IF NOT EXISTS motif_archivage TEXT;

-- ============================================================================
-- 2. Seed permissions atomiques
-- Modules : ORGANISATION, MEMBRE, COTISATION, FINANCE, TONTINE, EPARGNE,
--           CREDIT, NOTIFICATION, AUDIT, RAPPORT, CONFIGURATION, AGRICULTURE,
--           ONG, CULTE, VOTE, COLLECTE, REGISTRE
-- Actions  : CREATE, READ, UPDATE, DELETE, VALIDATE, EXPORT, IMPORT, SEND
-- ============================================================================

INSERT INTO permissions (id, code, module, ressource, action, libelle, description, actif, date_creation, date_modification, cree_par, modifie_par, version)
SELECT gen_random_uuid(), v.code, v.module, v.ressource, v.action, v.libelle, v.description, true, NOW(), NOW(), 'system', 'system', 0
FROM (VALUES

    -- ── ORGANISATION ──────────────────────────────────────────────────────────
    ('ORGANISATION > ORGANISATION > CREATE', 'ORGANISATION', 'ORGANISATION', 'CREATE', 'Créer une organisation',           'Créer une nouvelle organisation sur la plateforme'),
    ('ORGANISATION > ORGANISATION > READ',   'ORGANISATION', 'ORGANISATION', 'READ',   'Consulter une organisation',       'Voir les détails d''une organisation'),
    ('ORGANISATION > ORGANISATION > UPDATE', 'ORGANISATION', 'ORGANISATION', 'UPDATE', 'Modifier une organisation',        'Modifier les informations d''une organisation'),
    ('ORGANISATION > ORGANISATION > DELETE', 'ORGANISATION', 'ORGANISATION', 'DELETE', 'Supprimer une organisation',       'Archiver ou supprimer une organisation'),
    ('ORGANISATION > ORGANISATION > EXPORT', 'ORGANISATION', 'ORGANISATION', 'EXPORT', 'Exporter les données organisation','Exporter les données de l''organisation'),

    -- ── MEMBRE ────────────────────────────────────────────────────────────────
    ('MEMBRE > MEMBRE > CREATE',   'MEMBRE', 'MEMBRE', 'CREATE',   'Créer un membre',            'Ajouter un nouveau membre'),
    ('MEMBRE > MEMBRE > READ',     'MEMBRE', 'MEMBRE', 'READ',     'Consulter un membre',        'Voir la fiche d''un membre'),
    ('MEMBRE > MEMBRE > UPDATE',   'MEMBRE', 'MEMBRE', 'UPDATE',   'Modifier un membre',         'Modifier les informations d''un membre'),
    ('MEMBRE > MEMBRE > DELETE',   'MEMBRE', 'MEMBRE', 'DELETE',   'Désactiver un membre',       'Désactiver ou archiver un membre'),
    ('MEMBRE > MEMBRE > EXPORT',   'MEMBRE', 'MEMBRE', 'EXPORT',   'Exporter les membres',       'Exporter la liste des membres'),
    ('MEMBRE > MEMBRE > IMPORT',   'MEMBRE', 'MEMBRE', 'IMPORT',   'Importer des membres',       'Importer une liste de membres'),
    ('MEMBRE > INVITATION > SEND', 'MEMBRE', 'INVITATION', 'SEND', 'Inviter un membre',          'Envoyer une invitation à rejoindre l''organisation'),
    ('MEMBRE > STATUT > UPDATE',   'MEMBRE', 'STATUT', 'UPDATE',   'Changer le statut d''un membre', 'Activer, suspendre, archiver un membre'),

    -- ── COTISATION ────────────────────────────────────────────────────────────
    ('COTISATION > COTISATION > CREATE',   'COTISATION', 'COTISATION', 'CREATE',   'Créer une cotisation',           'Enregistrer une cotisation'),
    ('COTISATION > COTISATION > READ',     'COTISATION', 'COTISATION', 'READ',     'Consulter les cotisations',      'Voir les cotisations'),
    ('COTISATION > COTISATION > UPDATE',   'COTISATION', 'COTISATION', 'UPDATE',   'Modifier une cotisation',        'Modifier une cotisation'),
    ('COTISATION > COTISATION > DELETE',   'COTISATION', 'COTISATION', 'DELETE',   'Supprimer une cotisation',       'Supprimer une cotisation'),
    ('COTISATION > COTISATION > VALIDATE', 'COTISATION', 'COTISATION', 'VALIDATE', 'Valider une cotisation',         'Valider le paiement d''une cotisation'),
    ('COTISATION > COTISATION > EXPORT',   'COTISATION', 'COTISATION', 'EXPORT',   'Exporter les cotisations',       'Exporter le registre des cotisations'),

    -- ── FINANCE ───────────────────────────────────────────────────────────────
    ('FINANCE > TRANSACTION > CREATE',   'FINANCE', 'TRANSACTION', 'CREATE',   'Créer une transaction',          'Enregistrer une transaction financière'),
    ('FINANCE > TRANSACTION > READ',     'FINANCE', 'TRANSACTION', 'READ',     'Consulter les transactions',     'Voir les transactions financières'),
    ('FINANCE > TRANSACTION > VALIDATE', 'FINANCE', 'TRANSACTION', 'VALIDATE', 'Valider une transaction',        'Approuver une transaction en attente'),
    ('FINANCE > BUDGET > READ',          'FINANCE', 'BUDGET',      'READ',     'Consulter le budget',            'Voir le budget de l''organisation'),
    ('FINANCE > BUDGET > UPDATE',        'FINANCE', 'BUDGET',      'UPDATE',   'Modifier le budget',             'Modifier les lignes budgétaires'),
    ('FINANCE > RAPPORT > READ',         'FINANCE', 'RAPPORT',     'READ',     'Consulter les rapports financiers','Voir les rapports et bilans financiers'),
    ('FINANCE > RAPPORT > EXPORT',       'FINANCE', 'RAPPORT',     'EXPORT',   'Exporter les rapports financiers','Télécharger les rapports financiers'),

    -- ── TONTINE ───────────────────────────────────────────────────────────────
    ('TONTINE > TONTINE > CREATE',   'TONTINE', 'TONTINE', 'CREATE',   'Créer une tontine',              'Créer un nouveau cycle de tontine'),
    ('TONTINE > TONTINE > READ',     'TONTINE', 'TONTINE', 'READ',     'Consulter une tontine',          'Voir les détails d''une tontine'),
    ('TONTINE > TONTINE > UPDATE',   'TONTINE', 'TONTINE', 'UPDATE',   'Modifier une tontine',           'Modifier un cycle de tontine'),
    ('TONTINE > ROTATION > MANAGE',  'TONTINE', 'ROTATION', 'MANAGE',  'Gérer les rotations',            'Gérer l''ordre de rotation des membres'),
    ('TONTINE > COTISATION > CREATE','TONTINE', 'COTISATION', 'CREATE', 'Enregistrer une cotisation tontine', 'Enregistrer le paiement d''une cotisation de tontine'),

    -- ── EPARGNE ───────────────────────────────────────────────────────────────
    ('EPARGNE > COMPTE > CREATE',      'EPARGNE', 'COMPTE',      'CREATE',   'Ouvrir un compte épargne',       'Créer un compte épargne pour un membre'),
    ('EPARGNE > COMPTE > READ',        'EPARGNE', 'COMPTE',      'READ',     'Consulter un compte épargne',    'Voir un compte épargne'),
    ('EPARGNE > TRANSACTION > CREATE', 'EPARGNE', 'TRANSACTION', 'CREATE',   'Effectuer une transaction épargne','Dépôt ou retrait sur compte épargne'),
    ('EPARGNE > TRANSACTION > READ',   'EPARGNE', 'TRANSACTION', 'READ',     'Consulter les transactions épargne','Voir l''historique des transactions'),

    -- ── CREDIT ────────────────────────────────────────────────────────────────
    ('CREDIT > DEMANDE > CREATE',   'CREDIT', 'DEMANDE', 'CREATE',   'Soumettre une demande de crédit',  'Déposer un dossier de crédit'),
    ('CREDIT > DEMANDE > READ',     'CREDIT', 'DEMANDE', 'READ',     'Consulter une demande de crédit',  'Voir un dossier de crédit'),
    ('CREDIT > DEMANDE > VALIDATE', 'CREDIT', 'DEMANDE', 'VALIDATE', 'Approuver/Rejeter un crédit',      'Instruire et décider sur un dossier de crédit'),
    ('CREDIT > DECAISSEMENT > CREATE','CREDIT','DECAISSEMENT','CREATE','Décaisser un crédit',            'Exécuter le décaissement d''un crédit approuvé'),

    -- ── NOTIFICATION ─────────────────────────────────────────────────────────
    ('NOTIFICATION > NOTIFICATION > CREATE', 'NOTIFICATION', 'NOTIFICATION', 'CREATE', 'Créer une notification',    'Envoyer une notification'),
    ('NOTIFICATION > NOTIFICATION > READ',   'NOTIFICATION', 'NOTIFICATION', 'READ',   'Lire ses notifications',    'Voir ses propres notifications'),
    ('NOTIFICATION > TEMPLATE > CREATE',     'NOTIFICATION', 'TEMPLATE',     'CREATE', 'Créer un template',         'Créer un template de notification'),
    ('NOTIFICATION > GROUPE > SEND',         'NOTIFICATION', 'GROUPE',       'SEND',   'Envoyer en masse',          'Envoyer des notifications groupées'),

    -- ── AUDIT ─────────────────────────────────────────────────────────────────
    ('AUDIT > LOG > READ',           'AUDIT', 'LOG',           'READ',   'Consulter les logs d''audit',    'Voir les logs et traces d''activité'),
    ('AUDIT > LOG > EXPORT',         'AUDIT', 'LOG',           'EXPORT', 'Exporter les logs',              'Télécharger les logs d''audit'),
    ('AUDIT > STATISTIQUES > READ',  'AUDIT', 'STATISTIQUES',  'READ',   'Voir les statistiques d''audit', 'Analyser les métriques d''activité'),

    -- ── RAPPORT ───────────────────────────────────────────────────────────────
    ('RAPPORT > RAPPORT > READ',   'RAPPORT', 'RAPPORT', 'READ',   'Consulter un rapport',         'Voir les rapports de l''organisation'),
    ('RAPPORT > RAPPORT > EXPORT', 'RAPPORT', 'RAPPORT', 'EXPORT', 'Exporter un rapport',          'Télécharger un rapport PDF/Excel'),
    ('RAPPORT > RAPPORT > CREATE', 'RAPPORT', 'RAPPORT', 'CREATE', 'Générer un rapport',           'Générer un nouveau rapport'),

    -- ── CONFIGURATION ─────────────────────────────────────────────────────────
    ('CONFIGURATION > ORGANISATION > UPDATE', 'CONFIGURATION', 'ORGANISATION', 'UPDATE', 'Configurer l''organisation', 'Modifier les paramètres de l''organisation'),
    ('CONFIGURATION > ROLE > MANAGE',         'CONFIGURATION', 'ROLE',         'MANAGE', 'Gérer les rôles',            'Assigner ou révoquer des rôles aux membres'),
    ('CONFIGURATION > MODULE > MANAGE',       'CONFIGURATION', 'MODULE',       'MANAGE', 'Gérer les modules actifs',   'Activer ou désactiver des modules'),

    -- ── AGRICULTURE / COOPERATIVE ─────────────────────────────────────────────
    ('AGRICULTURE > CAMPAGNE > CREATE', 'AGRICULTURE', 'CAMPAGNE', 'CREATE', 'Créer une campagne agricole',     'Créer et planifier une campagne'),
    ('AGRICULTURE > CAMPAGNE > READ',   'AGRICULTURE', 'CAMPAGNE', 'READ',   'Consulter une campagne agricole', 'Voir les détails d''une campagne'),
    ('AGRICULTURE > CAMPAGNE > UPDATE', 'AGRICULTURE', 'CAMPAGNE', 'UPDATE', 'Modifier une campagne agricole',  'Modifier une campagne en cours'),

    -- ── ONG / PROJETS ─────────────────────────────────────────────────────────
    ('ONG > PROJET > CREATE',   'ONG', 'PROJET', 'CREATE',   'Créer un projet ONG',            'Créer et planifier un projet'),
    ('ONG > PROJET > READ',     'ONG', 'PROJET', 'READ',     'Consulter un projet ONG',        'Voir les détails d''un projet'),
    ('ONG > PROJET > UPDATE',   'ONG', 'PROJET', 'UPDATE',   'Modifier un projet ONG',         'Modifier un projet en cours'),
    ('ONG > COLLECTE > CREATE', 'ONG', 'COLLECTE', 'CREATE', 'Lancer une collecte de fonds',   'Créer une campagne de collecte'),

    -- ── CULTE / DONS ──────────────────────────────────────────────────────────
    ('CULTE > DON > CREATE', 'CULTE', 'DON', 'CREATE', 'Enregistrer un don religieux', 'Enregistrer un don cultuel'),
    ('CULTE > DON > READ',   'CULTE', 'DON', 'READ',   'Consulter les dons religieux', 'Voir les dons et contributions cultuels'),

    -- ── VOTE ─────────────────────────────────────────────────────────────────
    ('VOTE > CAMPAGNE > CREATE',   'VOTE', 'CAMPAGNE', 'CREATE',   'Créer une campagne de vote',  'Lancer une élection ou un référendum'),
    ('VOTE > CAMPAGNE > READ',     'VOTE', 'CAMPAGNE', 'READ',     'Consulter une campagne vote', 'Voir une campagne de vote'),
    ('VOTE > BULLETIN > CREATE',   'VOTE', 'BULLETIN',  'CREATE',  'Voter',                       'Déposer son bulletin de vote'),

    -- ── REGISTRE / AGREMENT ───────────────────────────────────────────────────
    ('REGISTRE > AGREMENT > CREATE', 'REGISTRE', 'AGREMENT', 'CREATE', 'Enregistrer un agrément',   'Créer une accréditation professionnelle'),
    ('REGISTRE > AGREMENT > READ',   'REGISTRE', 'AGREMENT', 'READ',   'Consulter les agréments',   'Voir les agréments et accréditations')

) AS v(code, module, ressource, action, libelle, description)
WHERE NOT EXISTS (SELECT 1 FROM permissions WHERE permissions.code = v.code);

-- ============================================================================
-- 3. Index sur les colonnes d'invitation
-- ============================================================================
CREATE INDEX IF NOT EXISTS idx_mo_token_invitation ON membres_organisations (token_invitation);
CREATE INDEX IF NOT EXISTS idx_mo_date_invitation  ON membres_organisations (date_invitation);
