-- ============================================================
-- V3.4 — LCB-FT / Anti-blanchiment (mutuelles)
-- Spec: specs/001-mutuelles-anti-blanchiment/spec.md
-- Traçabilité origine des fonds, KYC, seuils
-- ============================================================

-- 1. Utilisateurs (identité) — vigilance KYC
ALTER TABLE utilisateurs
    ADD COLUMN IF NOT EXISTS niveau_vigilance_kyc VARCHAR(20) DEFAULT 'SIMPLIFIE',
    ADD COLUMN IF NOT EXISTS statut_kyc VARCHAR(20) DEFAULT 'NON_VERIFIE',
    ADD COLUMN IF NOT EXISTS date_verification_identite DATE;

ALTER TABLE utilisateurs
    ADD CONSTRAINT chk_utilisateur_niveau_kyc
        CHECK (niveau_vigilance_kyc IS NULL OR niveau_vigilance_kyc IN ('SIMPLIFIE', 'RENFORCE'));
ALTER TABLE utilisateurs
    ADD CONSTRAINT chk_utilisateur_statut_kyc
        CHECK (statut_kyc IS NULL OR statut_kyc IN ('NON_VERIFIE', 'EN_COURS', 'VERIFIE', 'REFUSE'));

CREATE INDEX IF NOT EXISTS idx_utilisateur_statut_kyc ON utilisateurs(statut_kyc);

COMMENT ON COLUMN utilisateurs.niveau_vigilance_kyc IS 'Niveau de vigilance KYC LCB-FT';
COMMENT ON COLUMN utilisateurs.statut_kyc IS 'Statut vérification identité';
COMMENT ON COLUMN utilisateurs.date_verification_identite IS 'Date de dernière vérification d''identité';

-- 2. Intentions de paiement — origine des fonds / justification LCB-FT
ALTER TABLE intentions_paiement
    ADD COLUMN IF NOT EXISTS origine_fonds VARCHAR(200),
    ADD COLUMN IF NOT EXISTS justification_lcb_ft TEXT;

COMMENT ON COLUMN intentions_paiement.origine_fonds IS 'Origine des fonds déclarée (obligatoire au-dessus du seuil)';
COMMENT ON COLUMN intentions_paiement.justification_lcb_ft IS 'Justification LCB-FT optionnelle';

-- 3. Transactions épargne — origine des fonds, pièce justificative (si la table existe)
DO $$
BEGIN
  IF EXISTS (SELECT 1 FROM information_schema.tables WHERE table_schema = 'public' AND table_name = 'transactions_epargne') THEN
    ALTER TABLE transactions_epargne
        ADD COLUMN IF NOT EXISTS origine_fonds VARCHAR(200),
        ADD COLUMN IF NOT EXISTS piece_justificative_id UUID;
    EXECUTE 'COMMENT ON COLUMN transactions_epargne.origine_fonds IS ''Origine des fonds (obligatoire au-dessus du seuil LCB-FT)''';
    EXECUTE 'COMMENT ON COLUMN transactions_epargne.piece_justificative_id IS ''Référence pièce jointe justificative''';
  END IF;
END $$;

-- 4. Paramètres LCB-FT (seuils par organisation ou globaux)
CREATE TABLE IF NOT EXISTS parametres_lcb_ft (
    id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
    organisation_id UUID,
    code_devise VARCHAR(3) NOT NULL DEFAULT 'XOF',
    montant_seuil_justification DECIMAL(18,4) NOT NULL,
    montant_seuil_validation_manuelle DECIMAL(18,4),
    actif BOOLEAN NOT NULL DEFAULT TRUE,
    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_param_lcb_ft_org FOREIGN KEY (organisation_id) REFERENCES organisations(id) ON DELETE CASCADE,
    CONSTRAINT chk_param_devise CHECK (code_devise ~ '^[A-Z]{3}$')
);

CREATE UNIQUE INDEX IF NOT EXISTS idx_param_lcb_ft_org_devise
    ON parametres_lcb_ft(COALESCE(organisation_id, '00000000-0000-0000-0000-000000000000'::uuid), code_devise);
CREATE INDEX IF NOT EXISTS idx_param_lcb_ft_org ON parametres_lcb_ft(organisation_id);

COMMENT ON TABLE parametres_lcb_ft IS 'Seuils LCB-FT : au-dessus de montant_seuil_justification, origine des fonds obligatoire';
COMMENT ON COLUMN parametres_lcb_ft.organisation_id IS 'NULL = paramètres plateforme par défaut';

-- Valeur par défaut plateforme (XOF) — une seule ligne org NULL + XOF (toutes colonnes NOT NULL fournies)
INSERT INTO parametres_lcb_ft (id, organisation_id, code_devise, montant_seuil_justification, montant_seuil_validation_manuelle, cree_par, actif, date_creation, version)
SELECT gen_random_uuid(), NULL, 'XOF', 500000, 1000000, 'system', TRUE, NOW(), 0
WHERE NOT EXISTS (SELECT 1 FROM parametres_lcb_ft WHERE organisation_id IS NULL AND code_devise = 'XOF');
