-- ====================================================================
-- V47 — Sprint 3 P1 (2026-04-25)
-- ====================================================================
-- P1-NEW-12 : Module formation LBC/FT obligatoire annuelle
--             (Instruction BCEAO 001-03-2025 art. compliance officer rattaché DG)
-- P1-NEW-11 : Persistance complémentaire screening PEP
-- ====================================================================

-- 1. Sessions de formation LBC/FT (organisées par l'organisation pour ses membres/dirigeants)
CREATE TABLE IF NOT EXISTS formations_lbcft (
    id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
    organisation_id UUID NOT NULL,

    titre VARCHAR(255) NOT NULL,
    type_formation VARCHAR(30) NOT NULL DEFAULT 'STANDARD'
        CHECK (type_formation IN ('STANDARD', 'AVANCE', 'COMPLIANCE_OFFICER', 'DIRIGEANT')),
    contenu TEXT,
    intervenant VARCHAR(255),
    duree_heures NUMERIC(4,1) NOT NULL DEFAULT 4.0,

    date_session TIMESTAMP NOT NULL,
    lieu VARCHAR(255),
    annee_reference INTEGER NOT NULL,         -- année de référence (l'obligation est annuelle)

    statut VARCHAR(20) NOT NULL DEFAULT 'PLANIFIEE'
        CHECK (statut IN ('PLANIFIEE', 'EN_COURS', 'TERMINEE', 'ANNULEE')),

    -- BaseEntity
    cree_le TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
    cree_par UUID,
    modifie_le TIMESTAMP,
    modifie_par UUID,
    version BIGINT NOT NULL DEFAULT 0,
    actif BOOLEAN NOT NULL DEFAULT TRUE
);

CREATE INDEX IF NOT EXISTS idx_formation_org_annee ON formations_lbcft (organisation_id, annee_reference);
CREATE INDEX IF NOT EXISTS idx_formation_date ON formations_lbcft (date_session DESC);

-- 2. Participations aux formations
CREATE TABLE IF NOT EXISTS participations_formation_lbcft (
    id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
    formation_id UUID NOT NULL REFERENCES formations_lbcft(id) ON DELETE CASCADE,
    membre_id UUID NOT NULL,

    statut_participation VARCHAR(20) NOT NULL DEFAULT 'INSCRIT'
        CHECK (statut_participation IN ('INSCRIT', 'PRESENT', 'ABSENT', 'CERTIFIE')),

    date_certification TIMESTAMP,
    numero_certificat VARCHAR(100),
    score_quiz NUMERIC(5,2),                  -- score sur 100 si quiz d'évaluation

    cree_le TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
    cree_par UUID,
    modifie_le TIMESTAMP,
    modifie_par UUID,
    version BIGINT NOT NULL DEFAULT 0,
    actif BOOLEAN NOT NULL DEFAULT TRUE,

    UNIQUE (formation_id, membre_id)
);

CREATE INDEX IF NOT EXISTS idx_participation_membre ON participations_formation_lbcft (membre_id);
CREATE INDEX IF NOT EXISTS idx_participation_statut ON participations_formation_lbcft (statut_participation);

COMMENT ON TABLE formations_lbcft IS
    'Sessions de formation LBC/FT organisées (Instruction BCEAO 001-03-2025). '
    'Obligation annuelle pour compliance officer + dirigeants + membres exposés.';

COMMENT ON TABLE participations_formation_lbcft IS
    'Participations individuelles. Statut CERTIFIE prouve la conformité de l''année de référence.';

-- 3. Cache PEP screening (persistant inter-redémarrages, vs cache mémoire 24 h volatile)
CREATE TABLE IF NOT EXISTS pep_screening_cache (
    id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
    cache_key VARCHAR(500) NOT NULL UNIQUE,    -- nom|prenoms|date|nationalite
    provider VARCHAR(50) NOT NULL,
    est_pep BOOLEAN NOT NULL,
    matches_json JSONB,
    expires_at TIMESTAMP NOT NULL,
    cree_le TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
);

CREATE INDEX IF NOT EXISTS idx_pep_cache_expires ON pep_screening_cache (expires_at);

COMMENT ON TABLE pep_screening_cache IS
    'Cache de screening PEP — TTL 24 h pour limiter coûts API Youverify/ComplyAdvantage.';
