-- ============================================================================
-- V13 — Initialisation des rôles standard UnionFlow
-- Codes en MAJUSCULES correspondant aux cases du switch mobile (via toLowerCase())
-- ============================================================================

-- Ajouter les colonnes manquantes à roles (entité Role refactorisée depuis V1)
-- V1 a créé : nom, description, niveau_acces, est_systeme
-- Entité attend : code, libelle, description, niveau_hierarchique, type_role, organisation_id

ALTER TABLE roles ADD COLUMN IF NOT EXISTS code VARCHAR(50);
ALTER TABLE roles ADD COLUMN IF NOT EXISTS libelle VARCHAR(100);
ALTER TABLE roles ADD COLUMN IF NOT EXISTS niveau_hierarchique INTEGER DEFAULT 100;
ALTER TABLE roles ADD COLUMN IF NOT EXISTS type_role VARCHAR(50);
ALTER TABLE roles ADD COLUMN IF NOT EXISTS organisation_id UUID;

-- Contrainte UNIQUE sur code (si pas déjà présente)
DO $$
BEGIN
    IF NOT EXISTS (
        SELECT 1 FROM pg_constraint
        WHERE conname = 'roles_code_key' AND conrelid = 'roles'::regclass
    ) THEN
        ALTER TABLE roles ADD CONSTRAINT roles_code_key UNIQUE (code);
    END IF;
END $$;

CREATE UNIQUE INDEX IF NOT EXISTS idx_role_code ON roles (code);
CREATE INDEX IF NOT EXISTS idx_role_niveau ON roles (niveau_hierarchique);

-- La colonne `nom` de V1 n'est pas dans l'entité Role — rendre nullable
ALTER TABLE roles ALTER COLUMN nom DROP NOT NULL;

INSERT INTO roles (id, nom, code, libelle, description, niveau_hierarchique, type_role, actif, date_creation, date_modification, cree_par, modifie_par, version)
SELECT
    gen_random_uuid(),
    v.libelle,
    v.code,
    v.libelle,
    v.description,
    v.niveau_hierarchique,
    'SYSTEME',
    true,
    NOW(),
    NOW(),
    'system',
    'system',
    0
FROM (VALUES
    ('SUPERADMIN',   'Super Administrateur',        'Accès total à la plateforme',              10),
    ('ORGADMIN',     'Administrateur Organisation', 'Administrateur d''une organisation',        20),
    ('MODERATOR',    'Modérateur',                  'Modérateur des contenus et activités',     30),
    ('ACTIVEMEMBER', 'Membre Actif',                'Membre actif à jour de ses cotisations',   40),
    ('SIMPLEMEMBER', 'Membre Simple',               'Membre standard sans droits étendus',      50),
    ('VISITOR',      'Visiteur',                    'Accès en lecture seule',                   60)
) AS v(code, libelle, description, niveau_hierarchique)
WHERE NOT EXISTS (SELECT 1 FROM roles WHERE roles.code = v.code);
