-- ============================================================
-- V2.6 — Système de modules activables par type d'organisation
-- Auteur: UnionFlow Team | BCEAO/OHADA compliant
-- ============================================================

CREATE TABLE IF NOT EXISTS modules_disponibles (
    id UUID PRIMARY KEY DEFAULT gen_random_uuid(),

    code                      VARCHAR(50) UNIQUE NOT NULL,
    libelle                   VARCHAR(150) NOT NULL,
    description               TEXT,
    types_org_compatibles     TEXT,     -- JSON array: ["MUTUELLE_SANTE","ONG",...]
    actif                     BOOLEAN NOT NULL DEFAULT TRUE,
    ordre_affichage           INTEGER DEFAULT 0,

    -- Métadonnées BaseEntity
    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
);

-- Catalogue initial des modules métier
INSERT INTO modules_disponibles (id, code, libelle, description, types_org_compatibles, actif, ordre_affichage)
VALUES
    (gen_random_uuid(), 'COTISATIONS',           'Gestion des cotisations',       'Suivi cotisations, relances, statistiques',                              '["ALL"]', true, 1),
    (gen_random_uuid(), 'EVENEMENTS',            'Gestion des événements',        'Création, inscriptions, présences, paiements',                           '["ALL"]', true, 2),
    (gen_random_uuid(), 'SOLIDARITE',            'Fonds de solidarité',           'Demandes d''aide avec workflow de validation',                            '["ALL"]', true, 3),
    (gen_random_uuid(), 'COMPTABILITE',          'Comptabilité simplifiée',       'Journal, écritures, comptes — conforme OHADA',                           '["ALL"]', true, 4),
    (gen_random_uuid(), 'DOCUMENTS',             'Gestion documentaire',          'Upload, versioning, intégrité hash — 1Go max',                           '["ALL"]', true, 5),
    (gen_random_uuid(), 'NOTIFICATIONS',         'Notifications multi-canal',     'Email, WhatsApp, push mobile',                                           '["ALL"]', true, 6),
    (gen_random_uuid(), 'CREDIT_EPARGNE',        'Épargne & crédit MEC',         'Prêts, échéanciers, impayés, multi-caisses',                              '["MUTUELLE_EPARGNE_CREDIT"]', true, 10),
    (gen_random_uuid(), 'AYANTS_DROIT',          'Gestion des ayants droit',      'Couverture santé, plafonds, conventions centres de santé',               '["MUTUELLE_SANTE"]', true, 11),
    (gen_random_uuid(), 'TONTINE',               'Tontine / épargne rotative',    'Cycles rotatifs, tirage, enchères, pénalités',                           '["TONTINE"]', true, 12),
    (gen_random_uuid(), 'ONG_PROJETS',           'Projets humanitaires',          'Logframe, budget bailleurs, indicateurs d''impact, rapports',             '["ONG"]', true, 13),
    (gen_random_uuid(), 'COOP_AGRICOLE',         'Coopérative agricole',          'Parcelles, rendements, intrants, vente groupée, ristournes',              '["COOPERATIVE_AGRICOLE"]', true, 14),
    (gen_random_uuid(), 'VOTE_INTERNE',          'Vote interne électronique',     'Assemblées générales, votes, quorums',                                   '["FEDERATION","ASSOCIATION","SYNDICAT"]', true, 15),
    (gen_random_uuid(), 'COLLECTE_FONDS',        'Collecte de fonds',             'Campagnes de don, suivi, rapports',                                      '["ONG","ORGANISATION_RELIGIEUSE","ASSOCIATION"]', true, 16),
    (gen_random_uuid(), 'REGISTRE_PROFESSIONNEL','Registre officiel membres',     'Agrément, diplômes, sanctions disciplinaires, annuaire certifié',         '["ASSOCIATION_PROFESSIONNELLE"]', true, 17),
    (gen_random_uuid(), 'CULTES_RELIGIEUX',      'Gestion cultes & dîmes',        'Dîmes, promesses de don, planification cultes, cellules, offrandes anon.','["ORGANISATION_RELIGIEUSE"]', true, 18),
    (gen_random_uuid(), 'GOUVERNANCE_MULTI',     'Gouvernance multi-niveaux',     'Cotisation par section, reporting consolidé, redistribution subventions', '["FEDERATION"]', true, 19)
ON CONFLICT (code) DO NOTHING;

-- ============================================================
-- Modules activés pour chaque organisation
-- ============================================================
CREATE TABLE IF NOT EXISTS modules_organisation_actifs (
    id UUID PRIMARY KEY DEFAULT gen_random_uuid(),

    organisation_id  UUID NOT NULL,
    module_code      VARCHAR(50) NOT NULL,
    actif            BOOLEAN NOT NULL DEFAULT TRUE,
    parametres       TEXT,             -- JSON de configuration spécifique
    date_activation  TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,

    -- Métadonnées BaseEntity
    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_moa_organisation FOREIGN KEY (organisation_id) REFERENCES organisations(id) ON DELETE CASCADE,
    CONSTRAINT uk_moa_org_module   UNIQUE (organisation_id, module_code)
);

CREATE INDEX idx_moa_organisation ON modules_organisation_actifs(organisation_id);
CREATE INDEX idx_moa_module       ON modules_organisation_actifs(module_code);

COMMENT ON TABLE modules_disponibles IS 'Catalogue des modules métier UnionFlow activables selon le type d''organisation';
COMMENT ON TABLE modules_organisation_actifs IS 'Modules activés pour une organisation donnée avec paramètres spécifiques';
