-- ====================================================================
-- V45 — Sprint 1 P0 (consolidation 2026-04-25)
-- ====================================================================
-- P0-NEW-17 : Rôle PRESIDENT (distinct d'ADMIN_ORGANISATION)
-- P0-NEW-18 : Rôle CONTROLEUR_INTERNE (BCEAO Circulaire 03-2017/CB/C)
-- P0-NEW-19 : Audit trail enrichi (table audit_trail_operations)
-- ====================================================================

-- 1. Rôles standards manquants pour gouvernance OHADA / SoD
-- Insertion dans roles existant (V13__Seed_Standard_Roles.sql avait posé la base)
INSERT INTO roles (id, nom, code, libelle, description, categorie, niveau_hierarchique, type_role, actif, date_creation, date_modification, cree_par, modifie_par, version)
VALUES
  (gen_random_uuid(), 'PRESIDENT', 'PRESIDENT', 'Président',
   'Président de l''organisation : représentant légal, signataire PV AG/CA, convoque les instances. Distinct d''ADMIN_ORGANISATION (rôle technique).',
   'GOUVERNANCE', 1, 'SYSTEME', TRUE, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, 'system', 'system', 0),
  (gen_random_uuid(), 'VICE_PRESIDENT', 'VICE_PRESIDENT', 'Vice-Président',
   'Vice-président : suppléance statutaire du président (OHADA AUDSCGIE).',
   'GOUVERNANCE', 2, 'SYSTEME', TRUE, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, 'system', 'system', 0),
  (gen_random_uuid(), 'CONTROLEUR_INTERNE', 'CONTROLEUR_INTERNE', 'Contrôleur Interne',
   'Contrôleur interne : obligatoire SFD UMOA (BCEAO Circulaire 03-2017/CB/C). Supervise risques, conformité, audit interne.',
   'CONTROLE', 3, 'SYSTEME', TRUE, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, 'system', 'system', 0),
  (gen_random_uuid(), 'ANIMATEUR_ZONE', 'ANIMATEUR_ZONE', 'Animateur de Zone',
   'Animateur de zone / délégué régional : enquête sociale demandes d''aide, lien terrain.',
   'OPERATIONNEL', 4, 'SYSTEME', TRUE, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, 'system', 'system', 0),
  (gen_random_uuid(), 'SECRETAIRE_ADJOINT', 'SECRETAIRE_ADJOINT', 'Secrétaire Adjoint',
   'Secrétaire adjoint : suppléance secrétaire général.',
   'GOUVERNANCE', 5, 'SYSTEME', TRUE, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, 'system', 'system', 0),
  (gen_random_uuid(), 'TRESORIER_ADJOINT', 'TRESORIER_ADJOINT', 'Trésorier Adjoint',
   'Trésorier adjoint : suppléance trésorier (séparation des pouvoirs maintenue).',
   'GOUVERNANCE', 5, 'SYSTEME', TRUE, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, 'system', 'system', 0)
ON CONFLICT (nom) DO NOTHING;

-- 2. Audit trail enrichi (P0-NEW-19) — SYSCOHADA + AUDSCGIE OHADA
CREATE TABLE IF NOT EXISTS audit_trail_operations (
    id UUID PRIMARY KEY DEFAULT gen_random_uuid(),

    -- Acteur
    user_id UUID NOT NULL,
    user_email VARCHAR(255),
    role_actif VARCHAR(50),                  -- valeur du header X-Active-Role au moment de l'action
    organisation_active_id UUID,             -- valeur du header X-Active-Organisation-Id

    -- Action
    action_type VARCHAR(50) NOT NULL,        -- CREATE, UPDATE, DELETE, APPROVE, REJECT, EXPORT, LOGIN, LOGOUT, SoD_OVERRIDE
    entity_type VARCHAR(100) NOT NULL,       -- ex: Cotisation, DemandeAide, Membre, EcritureComptable
    entity_id UUID,                          -- UUID de l'entité ciblée (null pour actions globales)
    description VARCHAR(500),

    -- Contexte
    ip_address VARCHAR(45),                  -- IPv4 ou IPv6
    user_agent VARCHAR(500),
    request_id UUID,                         -- corrélation avec logs HTTP

    -- Données
    payload_avant JSONB,                     -- snapshot avant (UPDATE/DELETE)
    payload_apres JSONB,                     -- snapshot après (CREATE/UPDATE)
    metadata JSONB,                          -- métadonnées libres (ex: motif rejet, montant, etc.)

    -- Vérifications de sécurité (SoD)
    sod_check_passed BOOLEAN,
    sod_violations VARCHAR(500),

    -- Timestamps
    operation_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,

    CONSTRAINT chk_audit_action_type CHECK (action_type IN (
        'CREATE', 'UPDATE', 'DELETE', 'APPROVE', 'REJECT', 'EXPORT',
        'LOGIN', 'LOGOUT', 'SOD_OVERRIDE', 'KYC_VALIDE', 'KYC_REFUSE',
        'PAYMENT_INITIATED', 'PAYMENT_CONFIRMED', 'PAYMENT_FAILED',
        'BUDGET_APPROVED', 'AID_REQUEST_APPROVED', 'CONFIG_CHANGED'
    ))
);

-- Index pour recherches fréquentes
CREATE INDEX IF NOT EXISTS idx_audit_trail_user ON audit_trail_operations (user_id);
CREATE INDEX IF NOT EXISTS idx_audit_trail_org_active ON audit_trail_operations (organisation_active_id) WHERE organisation_active_id IS NOT NULL;
CREATE INDEX IF NOT EXISTS idx_audit_trail_entity ON audit_trail_operations (entity_type, entity_id) WHERE entity_id IS NOT NULL;
CREATE INDEX IF NOT EXISTS idx_audit_trail_action ON audit_trail_operations (action_type);
CREATE INDEX IF NOT EXISTS idx_audit_trail_operation_at ON audit_trail_operations (operation_at DESC);
CREATE INDEX IF NOT EXISTS idx_audit_trail_sod_violations ON audit_trail_operations (sod_check_passed) WHERE sod_check_passed = FALSE;

COMMENT ON TABLE audit_trail_operations IS
    'Audit trail enrichi conforme SYSCOHADA + AUDSCGIE OHADA. '
    'Trace toutes les opérations financières, lifecycle membres, et changements de configuration. '
    'Inclut le contexte multi-org (rôle actif + organisation active) + vérifications SoD. '
    'Conservation : durée légale OHADA (10 ans minimum pour pièces comptables).';

COMMENT ON COLUMN audit_trail_operations.sod_check_passed IS
    'Indique si le check Separation of Duties a passé pour cette opération. '
    'FALSE = violation SoD détectée (ex: même user a validé création + paiement).';
