-- ============================================================================
-- V2.0 : Création de toutes les tables manquantes pour UnionFlow
-- Toutes les tables héritent de BaseEntity (id UUID PK, date_creation,
-- date_modification, cree_par, modifie_par, version, actif)
-- ============================================================================

-- Colonnes communes BaseEntity (à inclure dans chaque table)
-- id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
-- date_creation TIMESTAMP NOT NULL DEFAULT NOW(),
-- date_modification TIMESTAMP,
-- cree_par VARCHAR(255),
-- modifie_par VARCHAR(255),
-- version BIGINT DEFAULT 0,
-- actif BOOLEAN NOT NULL DEFAULT TRUE

-- ============================================================================
-- 1. TABLES PRINCIPALES (sans FK vers d'autres tables métier)
-- ============================================================================

-- Table membres (principale, référencée par beaucoup d'autres)
CREATE TABLE IF NOT EXISTS membres (
    id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
    nom VARCHAR(100) NOT NULL,
    prenom VARCHAR(100) NOT NULL,
    email VARCHAR(255),
    telephone VARCHAR(30),
    numero_membre VARCHAR(50),
    date_naissance DATE,
    lieu_naissance VARCHAR(255),
    sexe VARCHAR(10),
    nationalite VARCHAR(100),
    profession VARCHAR(255),
    photo_url VARCHAR(500),
    statut VARCHAR(30) DEFAULT 'ACTIF',
    date_adhesion DATE,
    keycloak_user_id VARCHAR(255),
    keycloak_realm VARCHAR(255),
    organisation_id UUID,
    date_creation TIMESTAMP NOT NULL DEFAULT NOW(),
    date_modification TIMESTAMP,
    cree_par VARCHAR(255),
    modifie_par VARCHAR(255),
    version BIGINT DEFAULT 0,
    actif BOOLEAN NOT NULL DEFAULT TRUE
);

-- Table organisations (déjà créée en V1.2, mais IF NOT EXISTS pour sécurité)
CREATE TABLE IF NOT EXISTS organisations (
    id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
    nom VARCHAR(255) NOT NULL,
    sigle VARCHAR(50),
    description TEXT,
    type_organisation VARCHAR(50),
    statut VARCHAR(30) DEFAULT 'ACTIVE',
    email VARCHAR(255),
    telephone VARCHAR(30),
    site_web VARCHAR(500),
    adresse_siege TEXT,
    logo_url VARCHAR(500),
    date_fondation DATE,
    pays VARCHAR(100),
    ville VARCHAR(100),
    organisation_parente_id UUID,
    date_creation TIMESTAMP NOT NULL DEFAULT NOW(),
    date_modification TIMESTAMP,
    cree_par VARCHAR(255),
    modifie_par VARCHAR(255),
    version BIGINT DEFAULT 0,
    actif BOOLEAN NOT NULL DEFAULT TRUE
);

-- ============================================================================
-- 2. TABLES SÉCURITÉ (Rôles et Permissions)
-- ============================================================================

CREATE TABLE IF NOT EXISTS roles (
    id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
    nom VARCHAR(100) NOT NULL UNIQUE,
    description VARCHAR(500),
    code VARCHAR(50) NOT NULL UNIQUE,
    niveau INTEGER DEFAULT 0,
    date_creation TIMESTAMP NOT NULL DEFAULT NOW(),
    date_modification TIMESTAMP,
    cree_par VARCHAR(255),
    modifie_par VARCHAR(255),
    version BIGINT DEFAULT 0,
    actif BOOLEAN NOT NULL DEFAULT TRUE
);

CREATE TABLE IF NOT EXISTS permissions (
    id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
    nom VARCHAR(100) NOT NULL UNIQUE,
    description VARCHAR(500),
    code VARCHAR(100) NOT NULL UNIQUE,
    module VARCHAR(100),
    date_creation TIMESTAMP NOT NULL DEFAULT NOW(),
    date_modification TIMESTAMP,
    cree_par VARCHAR(255),
    modifie_par VARCHAR(255),
    version BIGINT DEFAULT 0,
    actif BOOLEAN NOT NULL DEFAULT TRUE
);

CREATE TABLE IF NOT EXISTS roles_permissions (
    id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
    role_id UUID NOT NULL REFERENCES roles(id),
    permission_id UUID NOT NULL REFERENCES permissions(id),
    date_creation TIMESTAMP NOT NULL DEFAULT NOW(),
    date_modification TIMESTAMP,
    cree_par VARCHAR(255),
    modifie_par VARCHAR(255),
    version BIGINT DEFAULT 0,
    actif BOOLEAN NOT NULL DEFAULT TRUE,
    UNIQUE(role_id, permission_id)
);

CREATE TABLE IF NOT EXISTS membres_roles (
    id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
    membre_id UUID NOT NULL REFERENCES membres(id),
    role_id UUID NOT NULL REFERENCES roles(id),
    organisation_id UUID REFERENCES organisations(id),
    date_creation TIMESTAMP NOT NULL DEFAULT NOW(),
    date_modification TIMESTAMP,
    cree_par VARCHAR(255),
    modifie_par VARCHAR(255),
    version BIGINT DEFAULT 0,
    actif BOOLEAN NOT NULL DEFAULT TRUE,
    UNIQUE(membre_id, role_id, organisation_id)
);

-- ============================================================================
-- 3. TABLES FINANCE
-- ============================================================================

CREATE TABLE IF NOT EXISTS adhesions (
    id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
    numero_adhesion VARCHAR(50),
    membre_id UUID REFERENCES membres(id),
    organisation_id UUID REFERENCES organisations(id),
    statut VARCHAR(30) DEFAULT 'EN_ATTENTE',
    date_demande TIMESTAMP,
    date_approbation TIMESTAMP,
    date_rejet TIMESTAMP,
    motif_rejet TEXT,
    frais_adhesion DECIMAL(15,2) DEFAULT 0,
    devise VARCHAR(10) DEFAULT 'XOF',
    montant_paye DECIMAL(15,2) DEFAULT 0,
    approuve_par VARCHAR(255),
    commentaire TEXT,
    date_creation TIMESTAMP NOT NULL DEFAULT NOW(),
    date_modification TIMESTAMP,
    cree_par VARCHAR(255),
    modifie_par VARCHAR(255),
    version BIGINT DEFAULT 0,
    actif BOOLEAN NOT NULL DEFAULT TRUE
);

CREATE TABLE IF NOT EXISTS cotisations (
    id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
    numero_reference VARCHAR(50),
    membre_id UUID REFERENCES membres(id),
    organisation_id UUID REFERENCES organisations(id),
    type_cotisation VARCHAR(50),
    periode VARCHAR(50),
    montant_du DECIMAL(15,2),
    montant_paye DECIMAL(15,2) DEFAULT 0,
    statut VARCHAR(30) DEFAULT 'EN_ATTENTE',
    date_echeance DATE,
    date_paiement TIMESTAMP,
    methode_paiement VARCHAR(50),
    reference_paiement VARCHAR(100),
    date_creation TIMESTAMP NOT NULL DEFAULT NOW(),
    date_modification TIMESTAMP,
    cree_par VARCHAR(255),
    modifie_par VARCHAR(255),
    version BIGINT DEFAULT 0,
    actif BOOLEAN NOT NULL DEFAULT TRUE
);

CREATE TABLE IF NOT EXISTS paiements (
    id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
    reference VARCHAR(100),
    montant DECIMAL(15,2) NOT NULL,
    devise VARCHAR(10) DEFAULT 'XOF',
    methode_paiement VARCHAR(50),
    statut VARCHAR(30) DEFAULT 'EN_ATTENTE',
    type_paiement VARCHAR(50),
    description TEXT,
    membre_id UUID REFERENCES membres(id),
    organisation_id UUID REFERENCES organisations(id),
    date_paiement TIMESTAMP,
    date_creation TIMESTAMP NOT NULL DEFAULT NOW(),
    date_modification TIMESTAMP,
    cree_par VARCHAR(255),
    modifie_par VARCHAR(255),
    version BIGINT DEFAULT 0,
    actif BOOLEAN NOT NULL DEFAULT TRUE
);

CREATE TABLE IF NOT EXISTS paiements_adhesions (
    id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
    adhesion_id UUID REFERENCES adhesions(id),
    paiement_id UUID REFERENCES paiements(id),
    date_creation TIMESTAMP NOT NULL DEFAULT NOW(),
    date_modification TIMESTAMP,
    cree_par VARCHAR(255),
    modifie_par VARCHAR(255),
    version BIGINT DEFAULT 0,
    actif BOOLEAN NOT NULL DEFAULT TRUE
);

CREATE TABLE IF NOT EXISTS paiements_cotisations (
    id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
    cotisation_id UUID REFERENCES cotisations(id),
    paiement_id UUID REFERENCES paiements(id),
    date_creation TIMESTAMP NOT NULL DEFAULT NOW(),
    date_modification TIMESTAMP,
    cree_par VARCHAR(255),
    modifie_par VARCHAR(255),
    version BIGINT DEFAULT 0,
    actif BOOLEAN NOT NULL DEFAULT TRUE
);

CREATE TABLE IF NOT EXISTS paiements_evenements (
    id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
    evenement_id UUID,
    paiement_id UUID REFERENCES paiements(id),
    date_creation TIMESTAMP NOT NULL DEFAULT NOW(),
    date_modification TIMESTAMP,
    cree_par VARCHAR(255),
    modifie_par VARCHAR(255),
    version BIGINT DEFAULT 0,
    actif BOOLEAN NOT NULL DEFAULT TRUE
);

CREATE TABLE IF NOT EXISTS paiements_aides (
    id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
    demande_aide_id UUID,
    paiement_id UUID REFERENCES paiements(id),
    date_creation TIMESTAMP NOT NULL DEFAULT NOW(),
    date_modification TIMESTAMP,
    cree_par VARCHAR(255),
    modifie_par VARCHAR(255),
    version BIGINT DEFAULT 0,
    actif BOOLEAN NOT NULL DEFAULT TRUE
);

-- ============================================================================
-- 4. TABLES COMPTABILITÉ
-- ============================================================================

CREATE TABLE IF NOT EXISTS comptes_comptables (
    id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
    numero_compte VARCHAR(20) NOT NULL,
    libelle VARCHAR(255) NOT NULL,
    type_compte VARCHAR(50),
    solde DECIMAL(15,2) DEFAULT 0,
    description TEXT,
    compte_parent_id UUID,
    organisation_id UUID REFERENCES organisations(id),
    date_creation TIMESTAMP NOT NULL DEFAULT NOW(),
    date_modification TIMESTAMP,
    cree_par VARCHAR(255),
    modifie_par VARCHAR(255),
    version BIGINT DEFAULT 0,
    actif BOOLEAN NOT NULL DEFAULT TRUE
);

CREATE TABLE IF NOT EXISTS journaux_comptables (
    id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
    code VARCHAR(20) NOT NULL,
    libelle VARCHAR(255) NOT NULL,
    type_journal VARCHAR(50),
    description TEXT,
    organisation_id UUID REFERENCES organisations(id),
    date_creation TIMESTAMP NOT NULL DEFAULT NOW(),
    date_modification TIMESTAMP,
    cree_par VARCHAR(255),
    modifie_par VARCHAR(255),
    version BIGINT DEFAULT 0,
    actif BOOLEAN NOT NULL DEFAULT TRUE
);

CREATE TABLE IF NOT EXISTS ecritures_comptables (
    id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
    numero_piece VARCHAR(50),
    date_ecriture DATE NOT NULL,
    libelle VARCHAR(500),
    montant_total DECIMAL(15,2),
    statut VARCHAR(30) DEFAULT 'BROUILLON',
    journal_id UUID REFERENCES journaux_comptables(id),
    organisation_id UUID REFERENCES organisations(id),
    date_creation TIMESTAMP NOT NULL DEFAULT NOW(),
    date_modification TIMESTAMP,
    cree_par VARCHAR(255),
    modifie_par VARCHAR(255),
    version BIGINT DEFAULT 0,
    actif BOOLEAN NOT NULL DEFAULT TRUE
);

CREATE TABLE IF NOT EXISTS lignes_ecriture (
    id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
    ecriture_id UUID NOT NULL REFERENCES ecritures_comptables(id),
    compte_id UUID NOT NULL REFERENCES comptes_comptables(id),
    libelle VARCHAR(500),
    montant_debit DECIMAL(15,2) DEFAULT 0,
    montant_credit DECIMAL(15,2) DEFAULT 0,
    date_creation TIMESTAMP NOT NULL DEFAULT NOW(),
    date_modification TIMESTAMP,
    cree_par VARCHAR(255),
    modifie_par VARCHAR(255),
    version BIGINT DEFAULT 0,
    actif BOOLEAN NOT NULL DEFAULT TRUE
);

-- ============================================================================
-- 5. TABLES ÉVÉNEMENTS
-- ============================================================================

CREATE TABLE IF NOT EXISTS evenements (
    id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
    titre VARCHAR(255) NOT NULL,
    description TEXT,
    type_evenement VARCHAR(50),
    statut VARCHAR(30) DEFAULT 'PLANIFIE',
    priorite VARCHAR(20) DEFAULT 'NORMALE',
    date_debut TIMESTAMP,
    date_fin TIMESTAMP,
    lieu VARCHAR(500),
    capacite_max INTEGER,
    prix DECIMAL(15,2) DEFAULT 0,
    devise VARCHAR(10) DEFAULT 'XOF',
    organisateur_id UUID REFERENCES membres(id),
    organisation_id UUID REFERENCES organisations(id),
    date_creation TIMESTAMP NOT NULL DEFAULT NOW(),
    date_modification TIMESTAMP,
    cree_par VARCHAR(255),
    modifie_par VARCHAR(255),
    version BIGINT DEFAULT 0,
    actif BOOLEAN NOT NULL DEFAULT TRUE
);

CREATE TABLE IF NOT EXISTS inscriptions_evenement (
    id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
    evenement_id UUID NOT NULL REFERENCES evenements(id),
    membre_id UUID NOT NULL REFERENCES membres(id),
    statut VARCHAR(30) DEFAULT 'EN_ATTENTE',
    date_inscription TIMESTAMP DEFAULT NOW(),
    commentaire TEXT,
    date_creation TIMESTAMP NOT NULL DEFAULT NOW(),
    date_modification TIMESTAMP,
    cree_par VARCHAR(255),
    modifie_par VARCHAR(255),
    version BIGINT DEFAULT 0,
    actif BOOLEAN NOT NULL DEFAULT TRUE,
    UNIQUE(evenement_id, membre_id)
);

-- ============================================================================
-- 6. TABLES SOLIDARITÉ
-- ============================================================================

CREATE TABLE IF NOT EXISTS demandes_aide (
    id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
    numero_demande VARCHAR(50),
    type_aide VARCHAR(50),
    priorite VARCHAR(20) DEFAULT 'NORMALE',
    statut VARCHAR(50) DEFAULT 'BROUILLON',
    titre VARCHAR(255),
    description TEXT,
    montant_demande DECIMAL(15,2),
    montant_approuve DECIMAL(15,2),
    devise VARCHAR(10) DEFAULT 'XOF',
    justification TEXT,
    membre_id UUID REFERENCES membres(id),
    organisation_id UUID REFERENCES organisations(id),
    date_creation TIMESTAMP NOT NULL DEFAULT NOW(),
    date_modification TIMESTAMP,
    cree_par VARCHAR(255),
    modifie_par VARCHAR(255),
    version BIGINT DEFAULT 0,
    actif BOOLEAN NOT NULL DEFAULT TRUE
);

-- ============================================================================
-- 7. TABLES DOCUMENTS
-- ============================================================================

CREATE TABLE IF NOT EXISTS documents (
    id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
    nom VARCHAR(255) NOT NULL,
    description TEXT,
    type_document VARCHAR(50),
    chemin_fichier VARCHAR(1000),
    taille_fichier BIGINT,
    type_mime VARCHAR(100),
    membre_id UUID REFERENCES membres(id),
    organisation_id UUID REFERENCES organisations(id),
    date_creation TIMESTAMP NOT NULL DEFAULT NOW(),
    date_modification TIMESTAMP,
    cree_par VARCHAR(255),
    modifie_par VARCHAR(255),
    version BIGINT DEFAULT 0,
    actif BOOLEAN NOT NULL DEFAULT TRUE
);

CREATE TABLE IF NOT EXISTS pieces_jointes (
    id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
    nom_fichier VARCHAR(255) NOT NULL,
    chemin_fichier VARCHAR(1000),
    type_mime VARCHAR(100),
    taille BIGINT,
    entite_type VARCHAR(100),
    entite_id UUID,
    date_creation TIMESTAMP NOT NULL DEFAULT NOW(),
    date_modification TIMESTAMP,
    cree_par VARCHAR(255),
    modifie_par VARCHAR(255),
    version BIGINT DEFAULT 0,
    actif BOOLEAN NOT NULL DEFAULT TRUE
);

-- ============================================================================
-- 8. TABLES NOTIFICATIONS
-- ============================================================================

CREATE TABLE IF NOT EXISTS templates_notifications (
    id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
    code VARCHAR(100) NOT NULL UNIQUE,
    sujet VARCHAR(500),
    corps_texte TEXT,
    corps_html TEXT,
    variables_disponibles TEXT,
    canaux_supportes VARCHAR(500),
    langue VARCHAR(10) DEFAULT 'fr',
    description TEXT,
    date_creation TIMESTAMP NOT NULL DEFAULT NOW(),
    date_modification TIMESTAMP,
    cree_par VARCHAR(255),
    modifie_par VARCHAR(255),
    version BIGINT DEFAULT 0,
    actif BOOLEAN NOT NULL DEFAULT TRUE
);

CREATE TABLE IF NOT EXISTS notifications (
    id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
    type_notification VARCHAR(30) NOT NULL,
    priorite VARCHAR(20) DEFAULT 'NORMALE',
    statut VARCHAR(30) DEFAULT 'EN_ATTENTE',
    sujet VARCHAR(500),
    corps TEXT,
    date_envoi_prevue TIMESTAMP,
    date_envoi TIMESTAMP,
    date_lecture TIMESTAMP,
    nombre_tentatives INTEGER DEFAULT 0,
    message_erreur VARCHAR(1000),
    donnees_additionnelles TEXT,
    membre_id UUID REFERENCES membres(id),
    organisation_id UUID REFERENCES organisations(id),
    template_id UUID REFERENCES templates_notifications(id),
    date_creation TIMESTAMP NOT NULL DEFAULT NOW(),
    date_modification TIMESTAMP,
    cree_par VARCHAR(255),
    modifie_par VARCHAR(255),
    version BIGINT DEFAULT 0,
    actif BOOLEAN NOT NULL DEFAULT TRUE
);

-- ============================================================================
-- 9. TABLES ADRESSES
-- ============================================================================

CREATE TABLE IF NOT EXISTS adresses (
    id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
    type_adresse VARCHAR(30),
    rue VARCHAR(500),
    complement VARCHAR(500),
    code_postal VARCHAR(20),
    ville VARCHAR(100),
    region VARCHAR(100),
    pays VARCHAR(100) DEFAULT 'Côte d''Ivoire',
    latitude DOUBLE PRECISION,
    longitude DOUBLE PRECISION,
    principale BOOLEAN DEFAULT FALSE,
    membre_id UUID REFERENCES membres(id),
    organisation_id UUID REFERENCES organisations(id),
    date_creation TIMESTAMP NOT NULL DEFAULT NOW(),
    date_modification TIMESTAMP,
    cree_par VARCHAR(255),
    modifie_par VARCHAR(255),
    version BIGINT DEFAULT 0,
    actif BOOLEAN NOT NULL DEFAULT TRUE
);

-- ============================================================================
-- 10. TABLES AUDIT
-- ============================================================================

CREATE TABLE IF NOT EXISTS audit_logs (
    id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
    action VARCHAR(100) NOT NULL,
    entite_type VARCHAR(100),
    entite_id VARCHAR(100),
    utilisateur VARCHAR(255),
    details TEXT,
    adresse_ip VARCHAR(50),
    date_heure TIMESTAMP NOT NULL DEFAULT NOW(),
    date_creation TIMESTAMP NOT NULL DEFAULT NOW(),
    date_modification TIMESTAMP,
    cree_par VARCHAR(255),
    modifie_par VARCHAR(255),
    version BIGINT DEFAULT 0,
    actif BOOLEAN NOT NULL DEFAULT TRUE
);

-- ============================================================================
-- 11. TABLES WAVE MONEY
-- ============================================================================

CREATE TABLE IF NOT EXISTS comptes_wave (
    id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
    numero_telephone VARCHAR(30) NOT NULL,
    nom_titulaire VARCHAR(255),
    statut VARCHAR(30) DEFAULT 'ACTIF',
    solde DECIMAL(15,2) DEFAULT 0,
    devise VARCHAR(10) DEFAULT 'XOF',
    organisation_id UUID REFERENCES organisations(id),
    date_creation TIMESTAMP NOT NULL DEFAULT NOW(),
    date_modification TIMESTAMP,
    cree_par VARCHAR(255),
    modifie_par VARCHAR(255),
    version BIGINT DEFAULT 0,
    actif BOOLEAN NOT NULL DEFAULT TRUE
);

CREATE TABLE IF NOT EXISTS configurations_wave (
    id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
    cle_api VARCHAR(500),
    secret_api VARCHAR(500),
    environnement VARCHAR(30) DEFAULT 'sandbox',
    url_webhook VARCHAR(500),
    organisation_id UUID REFERENCES organisations(id),
    date_creation TIMESTAMP NOT NULL DEFAULT NOW(),
    date_modification TIMESTAMP,
    cree_par VARCHAR(255),
    modifie_par VARCHAR(255),
    version BIGINT DEFAULT 0,
    actif BOOLEAN NOT NULL DEFAULT TRUE
);

CREATE TABLE IF NOT EXISTS transactions_wave (
    id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
    reference_wave VARCHAR(100),
    reference_interne VARCHAR(100),
    type_transaction VARCHAR(50),
    montant DECIMAL(15,2) NOT NULL,
    devise VARCHAR(10) DEFAULT 'XOF',
    statut VARCHAR(30) DEFAULT 'EN_ATTENTE',
    numero_expediteur VARCHAR(30),
    numero_destinataire VARCHAR(30),
    description TEXT,
    erreur TEXT,
    compte_wave_id UUID REFERENCES comptes_wave(id),
    date_creation TIMESTAMP NOT NULL DEFAULT NOW(),
    date_modification TIMESTAMP,
    cree_par VARCHAR(255),
    modifie_par VARCHAR(255),
    version BIGINT DEFAULT 0,
    actif BOOLEAN NOT NULL DEFAULT TRUE
);

CREATE TABLE IF NOT EXISTS webhooks_wave (
    id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
    type_evenement VARCHAR(100),
    statut VARCHAR(30) DEFAULT 'RECU',
    payload TEXT,
    signature VARCHAR(500),
    traite BOOLEAN DEFAULT FALSE,
    erreur TEXT,
    transaction_id UUID REFERENCES transactions_wave(id),
    date_creation TIMESTAMP NOT NULL DEFAULT NOW(),
    date_modification TIMESTAMP,
    cree_par VARCHAR(255),
    modifie_par VARCHAR(255),
    version BIGINT DEFAULT 0,
    actif BOOLEAN NOT NULL DEFAULT TRUE
);

-- ============================================================================
-- 12. TABLES SUPPORT (tickets, suggestions, favoris, config - déjà en V1.4)
-- ============================================================================

CREATE TABLE IF NOT EXISTS tickets (
    id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
    numero_ticket VARCHAR(50),
    sujet VARCHAR(255) NOT NULL,
    description TEXT,
    categorie VARCHAR(50),
    priorite VARCHAR(20) DEFAULT 'NORMALE',
    statut VARCHAR(30) DEFAULT 'OUVERT',
    membre_id UUID REFERENCES membres(id),
    organisation_id UUID REFERENCES organisations(id),
    assigne_a VARCHAR(255),
    date_resolution TIMESTAMP,
    date_creation TIMESTAMP NOT NULL DEFAULT NOW(),
    date_modification TIMESTAMP,
    cree_par VARCHAR(255),
    modifie_par VARCHAR(255),
    version BIGINT DEFAULT 0,
    actif BOOLEAN NOT NULL DEFAULT TRUE
);

CREATE TABLE IF NOT EXISTS suggestions (
    id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
    titre VARCHAR(255) NOT NULL,
    description TEXT,
    categorie VARCHAR(50),
    statut VARCHAR(30) DEFAULT 'NOUVELLE',
    votes_pour INTEGER DEFAULT 0,
    votes_contre INTEGER DEFAULT 0,
    membre_id UUID REFERENCES membres(id),
    organisation_id UUID REFERENCES organisations(id),
    date_creation TIMESTAMP NOT NULL DEFAULT NOW(),
    date_modification TIMESTAMP,
    cree_par VARCHAR(255),
    modifie_par VARCHAR(255),
    version BIGINT DEFAULT 0,
    actif BOOLEAN NOT NULL DEFAULT TRUE
);

CREATE TABLE IF NOT EXISTS suggestion_votes (
    id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
    suggestion_id UUID NOT NULL REFERENCES suggestions(id),
    membre_id UUID NOT NULL REFERENCES membres(id),
    type_vote VARCHAR(20) NOT NULL,
    date_creation TIMESTAMP NOT NULL DEFAULT NOW(),
    date_modification TIMESTAMP,
    cree_par VARCHAR(255),
    modifie_par VARCHAR(255),
    version BIGINT DEFAULT 0,
    actif BOOLEAN NOT NULL DEFAULT TRUE,
    UNIQUE(suggestion_id, membre_id)
);

CREATE TABLE IF NOT EXISTS favoris (
    id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
    type_entite VARCHAR(100) NOT NULL,
    entite_id UUID NOT NULL,
    membre_id UUID NOT NULL REFERENCES membres(id),
    date_creation TIMESTAMP NOT NULL DEFAULT NOW(),
    date_modification TIMESTAMP,
    cree_par VARCHAR(255),
    modifie_par VARCHAR(255),
    version BIGINT DEFAULT 0,
    actif BOOLEAN NOT NULL DEFAULT TRUE
);

CREATE TABLE IF NOT EXISTS configurations (
    id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
    cle VARCHAR(255) NOT NULL UNIQUE,
    valeur TEXT,
    description TEXT,
    categorie VARCHAR(100),
    organisation_id UUID REFERENCES organisations(id),
    date_creation TIMESTAMP NOT NULL DEFAULT NOW(),
    date_modification TIMESTAMP,
    cree_par VARCHAR(255),
    modifie_par VARCHAR(255),
    version BIGINT DEFAULT 0,
    actif BOOLEAN NOT NULL DEFAULT TRUE
);

-- ============================================================================
-- 13. TABLE TYPES ORGANISATION
-- ============================================================================

CREATE TABLE IF NOT EXISTS uf_type_organisation (
    id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
    code VARCHAR(50) NOT NULL UNIQUE,
    libelle VARCHAR(255) NOT NULL,
    description TEXT,
    icone VARCHAR(100),
    couleur VARCHAR(20),
    ordre INTEGER DEFAULT 0,
    date_creation TIMESTAMP NOT NULL DEFAULT NOW(),
    date_modification TIMESTAMP,
    cree_par VARCHAR(255),
    modifie_par VARCHAR(255),
    version BIGINT DEFAULT 0,
    actif BOOLEAN NOT NULL DEFAULT TRUE
);

-- ============================================================================
-- 14. INDEX POUR PERFORMANCES
-- ============================================================================
CREATE INDEX IF NOT EXISTS idx_membres_email ON membres(email);
CREATE INDEX IF NOT EXISTS idx_membres_numero ON membres(numero_membre);
CREATE INDEX IF NOT EXISTS idx_membres_organisation ON membres(organisation_id);
CREATE INDEX IF NOT EXISTS idx_membres_keycloak ON membres(keycloak_user_id);

CREATE INDEX IF NOT EXISTS idx_adhesions_membre ON adhesions(membre_id);
CREATE INDEX IF NOT EXISTS idx_adhesions_organisation ON adhesions(organisation_id);
CREATE INDEX IF NOT EXISTS idx_adhesions_statut ON adhesions(statut);

CREATE INDEX IF NOT EXISTS idx_cotisations_membre ON cotisations(membre_id);
CREATE INDEX IF NOT EXISTS idx_cotisations_statut ON cotisations(statut);
CREATE INDEX IF NOT EXISTS idx_cotisations_echeance ON cotisations(date_echeance);

CREATE INDEX IF NOT EXISTS idx_evenements_statut ON evenements(statut);
CREATE INDEX IF NOT EXISTS idx_evenements_organisation ON evenements(organisation_id);
CREATE INDEX IF NOT EXISTS idx_evenements_date_debut ON evenements(date_debut);

CREATE INDEX IF NOT EXISTS idx_notification_membre ON notifications(membre_id);
CREATE INDEX IF NOT EXISTS idx_notification_statut ON notifications(statut);
CREATE INDEX IF NOT EXISTS idx_notification_type ON notifications(type_notification);

CREATE INDEX IF NOT EXISTS idx_audit_date_heure ON audit_logs(date_heure);
CREATE INDEX IF NOT EXISTS idx_audit_action ON audit_logs(action);
CREATE INDEX IF NOT EXISTS idx_audit_utilisateur ON audit_logs(utilisateur);

CREATE INDEX IF NOT EXISTS idx_paiements_membre ON paiements(membre_id);
CREATE INDEX IF NOT EXISTS idx_paiements_statut ON paiements(statut);

CREATE INDEX IF NOT EXISTS idx_demandes_aide_demandeur ON demandes_aide(demandeur_id);
CREATE INDEX IF NOT EXISTS idx_demandes_aide_statut ON demandes_aide(statut);
