-- ============================================================================
-- V18 — Colonne categorie_type sur organisations + seed des 17 types officiels
-- Colonnes NOT NULL de TypeReference : domaine, code, libelle,
--   ordre_affichage (default 0), est_defaut (default false), est_systeme (default true pour seed)
-- ============================================================================

-- 1. Ajouter les colonnes sur organisations
ALTER TABLE organisations ADD COLUMN IF NOT EXISTS categorie_type VARCHAR(50);
ALTER TABLE organisations ADD COLUMN IF NOT EXISTS modules_actifs TEXT;

-- 2. Index
CREATE INDEX IF NOT EXISTS idx_organisation_categorie ON organisations (categorie_type);

-- ============================================================================
-- 3. S'assurer que les colonnes nécessaires existent dans types_reference
-- ============================================================================
DO $$
BEGIN
    IF NOT EXISTS (
        SELECT 1 FROM information_schema.columns
        WHERE table_name = 'types_reference' AND column_name = 'categorie'
    ) THEN
        ALTER TABLE types_reference ADD COLUMN categorie VARCHAR(50);
    END IF;

    IF NOT EXISTS (
        SELECT 1 FROM information_schema.columns
        WHERE table_name = 'types_reference' AND column_name = 'modules_requis'
    ) THEN
        ALTER TABLE types_reference ADD COLUMN modules_requis TEXT;
    END IF;

    IF NOT EXISTS (
        SELECT 1 FROM information_schema.columns
        WHERE table_name = 'types_reference' AND column_name = 'ordre_affichage'
    ) THEN
        ALTER TABLE types_reference ADD COLUMN ordre_affichage INTEGER NOT NULL DEFAULT 0;
    END IF;

    IF NOT EXISTS (
        SELECT 1 FROM information_schema.columns
        WHERE table_name = 'types_reference' AND column_name = 'est_defaut'
    ) THEN
        ALTER TABLE types_reference ADD COLUMN est_defaut BOOLEAN NOT NULL DEFAULT false;
    END IF;

    IF NOT EXISTS (
        SELECT 1 FROM information_schema.columns
        WHERE table_name = 'types_reference' AND column_name = 'est_systeme'
    ) THEN
        ALTER TABLE types_reference ADD COLUMN est_systeme BOOLEAN NOT NULL DEFAULT false;
    END IF;
END $$;

-- ============================================================================
-- 4. Seed des types officiels dans types_reference
-- ============================================================================

-- Catégorie ASSOCIATIF
INSERT INTO types_reference (id, domaine, libelle, code, categorie, modules_requis, actif, est_defaut, est_systeme, ordre_affichage, date_creation, date_modification, version)
SELECT gen_random_uuid(), 'TYPE_ORGANISATION', v.libelle, v.code, v.categorie, v.modules_requis, true, false, true, 0, NOW(), NOW(), 0
FROM (VALUES
    ('Association Générale', 'ASSOCIATION',  'ASSOCIATIF', 'MEMBRES,COTISATIONS,EVENEMENTS,COMMUNICATION,DOCUMENTS,VOTES,TONTINE,AIDE'),
    ('Club Service',         'CLUB_SERVICE', 'ASSOCIATIF', 'MEMBRES,COTISATIONS,EVENEMENTS,COMMUNICATION,DOCUMENTS,VOTES,TONTINE,PROJETS_SOLIDAIRES'),
    ('Club Sportif',         'CLUB_SPORTIF', 'ASSOCIATIF', 'MEMBRES,COTISATIONS,EVENEMENTS,COMMUNICATION,DOCUMENTS'),
    ('Club Culturel',        'CLUB_CULTUREL','ASSOCIATIF', 'MEMBRES,COTISATIONS,EVENEMENTS,COMMUNICATION,DOCUMENTS')
) AS v(libelle, code, categorie, modules_requis)
WHERE NOT EXISTS (
    SELECT 1 FROM types_reference WHERE types_reference.code = v.code AND domaine = 'TYPE_ORGANISATION'
);

-- Catégorie FINANCIER_SOLIDAIRE
-- Note : MUTUELLE unifié (pas de séparation épargne/crédit — cadre réglementaire BCEAO/UEMOA)
-- Les MEC/COOPEC font TOUJOURS épargne ET crédit conjointement.
INSERT INTO types_reference (id, domaine, libelle, code, categorie, modules_requis, actif, est_defaut, est_systeme, ordre_affichage, date_creation, date_modification, version)
SELECT gen_random_uuid(), 'TYPE_ORGANISATION', v.libelle, v.code, v.categorie, v.modules_requis, true, false, true, 0, NOW(), NOW(), 0
FROM (VALUES
    ('Tontine',                          'TONTINE',     'FINANCIER_SOLIDAIRE', 'MEMBRES,COTISATIONS,TONTINE,COMMUNICATION,DOCUMENTS,FINANCE'),
    ('Mutuelle d''Épargne et de Crédit', 'MUTUELLE',    'FINANCIER_SOLIDAIRE', 'MEMBRES,COTISATIONS,EPARGNE,CREDIT,COMMUNICATION,DOCUMENTS,FINANCE,LCB_FT'),
    ('Coopérative',                      'COOPERATIVE', 'FINANCIER_SOLIDAIRE', 'MEMBRES,COTISATIONS,AGRICULTURE,EPARGNE,VOTES,COMMUNICATION,DOCUMENTS,FINANCE')
) AS v(libelle, code, categorie, modules_requis)
WHERE NOT EXISTS (
    SELECT 1 FROM types_reference WHERE types_reference.code = v.code AND domaine = 'TYPE_ORGANISATION'
);

-- Catégorie RELIGIEUX
INSERT INTO types_reference (id, domaine, libelle, code, categorie, modules_requis, actif, est_defaut, est_systeme, ordre_affichage, date_creation, date_modification, version)
SELECT gen_random_uuid(), 'TYPE_ORGANISATION', v.libelle, v.code, v.categorie, v.modules_requis, true, false, true, 0, NOW(), NOW(), 0
FROM (VALUES
    ('Église / Communauté Religieuse', 'EGLISE',        'RELIGIEUX', 'MEMBRES,COTISATIONS,CULTE_DONS,EVENEMENTS,COMMUNICATION,DOCUMENTS'),
    ('Groupe de Prière / Cellule',     'GROUPE_PRIERE', 'RELIGIEUX', 'MEMBRES,EVENEMENTS,COMMUNICATION,DOCUMENTS')
) AS v(libelle, code, categorie, modules_requis)
WHERE NOT EXISTS (
    SELECT 1 FROM types_reference WHERE types_reference.code = v.code AND domaine = 'TYPE_ORGANISATION'
);

-- Catégorie PROFESSIONNEL
INSERT INTO types_reference (id, domaine, libelle, code, categorie, modules_requis, actif, est_defaut, est_systeme, ordre_affichage, date_creation, date_modification, version)
SELECT gen_random_uuid(), 'TYPE_ORGANISATION', v.libelle, v.code, v.categorie, v.modules_requis, true, false, true, 0, NOW(), NOW(), 0
FROM (VALUES
    ('ONG',                           'ONG',                 'PROFESSIONNEL', 'MEMBRES,COTISATIONS,PROJETS_ONG,COLLECTE_FONDS,COMMUNICATION,DOCUMENTS,FINANCE'),
    ('Fondation',                     'FONDATION',           'PROFESSIONNEL', 'MEMBRES,COLLECTE_FONDS,PROJETS_ONG,COMMUNICATION,DOCUMENTS,FINANCE'),
    ('Syndicat',                      'SYNDICAT',            'PROFESSIONNEL', 'MEMBRES,COTISATIONS,VOTES,COMMUNICATION,DOCUMENTS,AIDE'),
    ('Ordre Professionnel / Chambre', 'ORDRE_PROFESSIONNEL', 'PROFESSIONNEL', 'MEMBRES,COTISATIONS,REGISTRE_AGREMENT,COMMUNICATION,DOCUMENTS,VOTES'),
    ('GIE',                           'GIE',                 'PROFESSIONNEL', 'MEMBRES,COTISATIONS,FINANCE,COMMUNICATION,DOCUMENTS')
) AS v(libelle, code, categorie, modules_requis)
WHERE NOT EXISTS (
    SELECT 1 FROM types_reference WHERE types_reference.code = v.code AND domaine = 'TYPE_ORGANISATION'
);

-- Catégorie RESEAU_FEDERATION
INSERT INTO types_reference (id, domaine, libelle, code, categorie, modules_requis, actif, est_defaut, est_systeme, ordre_affichage, date_creation, date_modification, version)
SELECT gen_random_uuid(), 'TYPE_ORGANISATION', v.libelle, v.code, v.categorie, v.modules_requis, true, false, true, 0, NOW(), NOW(), 0
FROM (VALUES
    ('Fédération d''Organisations', 'FEDERATION', 'RESEAU_FEDERATION', 'MEMBRES,COTISATIONS,VOTES,COMMUNICATION,DOCUMENTS,FINANCE'),
    ('Réseau / Plateforme',         'RESEAU',     'RESEAU_FEDERATION', 'MEMBRES,EVENEMENTS,COMMUNICATION,DOCUMENTS')
) AS v(libelle, code, categorie, modules_requis)
WHERE NOT EXISTS (
    SELECT 1 FROM types_reference WHERE types_reference.code = v.code AND domaine = 'TYPE_ORGANISATION'
);

-- ============================================================================
-- 5. Migrer les valeurs existantes dans organisations.categorie_type
-- ============================================================================
UPDATE organisations o
SET categorie_type = tr.categorie,
    modules_actifs = tr.modules_requis
FROM types_reference tr
WHERE tr.code = o.type_organisation
  AND tr.domaine = 'TYPE_ORGANISATION'
  AND o.categorie_type IS NULL;

-- Valeur par défaut pour les organisations sans correspondance
UPDATE organisations
SET categorie_type = 'ASSOCIATIF'
WHERE categorie_type IS NULL;
