-- ============================================================
-- V2.5 — Workflow solidarité configurable (max 3 étapes)
--        + demandes_adhesion (remplace adhesions)
-- Auteur: UnionFlow Team | BCEAO/OHADA compliant
-- ============================================================

-- ============================================================
-- Workflow de validation configurable par organisation
-- ============================================================
CREATE TABLE IF NOT EXISTS workflow_validation_config (
    id UUID PRIMARY KEY DEFAULT gen_random_uuid(),

    organisation_id   UUID NOT NULL,
    type_workflow     VARCHAR(30) NOT NULL DEFAULT 'DEMANDE_AIDE',
    etape_numero      INTEGER NOT NULL CHECK (etape_numero BETWEEN 1 AND 3),
    role_requis_id    UUID,               -- rôle nécessaire pour valider cette étape
    libelle_etape     VARCHAR(200) NOT NULL,
    delai_max_heures  INTEGER DEFAULT 72,
    actif             BOOLEAN NOT NULL DEFAULT TRUE,

    -- Métadonnées BaseEntity
    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_wf_organisation FOREIGN KEY (organisation_id) REFERENCES organisations(id) ON DELETE CASCADE,
    CONSTRAINT fk_wf_role         FOREIGN KEY (role_requis_id)  REFERENCES roles(id) ON DELETE SET NULL,
    CONSTRAINT uk_wf_org_type_etape UNIQUE (organisation_id, type_workflow, etape_numero),
    CONSTRAINT chk_wf_type CHECK (type_workflow IN ('DEMANDE_AIDE','ADHESION','AUTRE'))
);

CREATE INDEX idx_wf_organisation ON workflow_validation_config(organisation_id);
CREATE INDEX idx_wf_type         ON workflow_validation_config(type_workflow);

-- ============================================================
-- Historique des validations d'une demande d'aide
-- ============================================================
CREATE TABLE IF NOT EXISTS validation_etapes_demande (
    id UUID PRIMARY KEY DEFAULT gen_random_uuid(),

    demande_aide_id   UUID NOT NULL,
    etape_numero      INTEGER NOT NULL CHECK (etape_numero BETWEEN 1 AND 3),
    valideur_id       UUID,
    statut            VARCHAR(20) NOT NULL DEFAULT 'EN_ATTENTE',
    date_validation   TIMESTAMP,
    commentaire       VARCHAR(1000),
    delegue_par_id    UUID,           -- si désactivation du véto par supérieur
    trace_delegation  TEXT,           -- motif + traçabilité BCEAO/OHADA

    -- Métadonnées BaseEntity
    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_ved_demande        FOREIGN KEY (demande_aide_id) REFERENCES demandes_aide(id) ON DELETE CASCADE,
    CONSTRAINT fk_ved_valideur       FOREIGN KEY (valideur_id)     REFERENCES utilisateurs(id) ON DELETE SET NULL,
    CONSTRAINT fk_ved_delegue_par    FOREIGN KEY (delegue_par_id)  REFERENCES utilisateurs(id) ON DELETE SET NULL,
    CONSTRAINT chk_ved_statut CHECK (statut IN ('EN_ATTENTE','APPROUVEE','REJETEE','DELEGUEE','EXPIREE'))
);

CREATE INDEX idx_ved_demande  ON validation_etapes_demande(demande_aide_id);
CREATE INDEX idx_ved_valideur ON validation_etapes_demande(valideur_id);
CREATE INDEX idx_ved_statut   ON validation_etapes_demande(statut);

-- ============================================================
-- demandes_adhesion (remplace adhesions avec modèle enrichi)
-- ============================================================
DROP TABLE IF EXISTS adhesions CASCADE;

CREATE TABLE IF NOT EXISTS demandes_adhesion (
    id UUID PRIMARY KEY DEFAULT gen_random_uuid(),

    numero_reference   VARCHAR(50) UNIQUE NOT NULL,
    utilisateur_id     UUID NOT NULL,
    organisation_id    UUID NOT NULL,
    statut             VARCHAR(20) NOT NULL DEFAULT 'EN_ATTENTE',
    frais_adhesion     DECIMAL(12,2) NOT NULL DEFAULT 0 CHECK (frais_adhesion >= 0),
    montant_paye       DECIMAL(12,2) NOT NULL DEFAULT 0,
    code_devise        VARCHAR(3) NOT NULL DEFAULT 'XOF',
    intention_paiement_id UUID,
    date_demande       TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
    date_traitement    TIMESTAMP,
    traite_par_id      UUID,
    motif_rejet        VARCHAR(1000),
    observations       VARCHAR(1000),

    -- Métadonnées BaseEntity
    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_da_utilisateur    FOREIGN KEY (utilisateur_id)      REFERENCES utilisateurs(id) ON DELETE CASCADE,
    CONSTRAINT fk_da_organisation   FOREIGN KEY (organisation_id)     REFERENCES organisations(id) ON DELETE CASCADE,
    CONSTRAINT fk_da_intention      FOREIGN KEY (intention_paiement_id) REFERENCES intentions_paiement(id) ON DELETE SET NULL,
    CONSTRAINT fk_da_traite_par     FOREIGN KEY (traite_par_id)       REFERENCES utilisateurs(id) ON DELETE SET NULL,
    CONSTRAINT chk_da_statut CHECK (statut IN ('EN_ATTENTE','APPROUVEE','REJETEE','ANNULEE'))
);

CREATE INDEX idx_da_utilisateur   ON demandes_adhesion(utilisateur_id);
CREATE INDEX idx_da_organisation  ON demandes_adhesion(organisation_id);
CREATE INDEX idx_da_statut        ON demandes_adhesion(statut);
CREATE INDEX idx_da_date          ON demandes_adhesion(date_demande);

COMMENT ON TABLE workflow_validation_config IS 'Configuration du workflow de validation par organisation (max 3 étapes)';
COMMENT ON TABLE validation_etapes_demande  IS 'Historique des validations — tracé BCEAO/OHADA — délégation de véto incluse';
COMMENT ON TABLE demandes_adhesion IS 'Demande d''adhésion d''un utilisateur à une organisation avec paiement Wave intégré';
