CREATE EXTENSION IF NOT EXISTS "pgcrypto";

-- ==========================================================
-- ENUMS
-- ==========================================================
DO $$ BEGIN
    IF NOT EXISTS (SELECT 1 FROM pg_type WHERE typname = 'role_type') THEN
        CREATE TYPE role_type AS ENUM ('parent', 'gestionnaire', 'super_admin', 'assistante_maternelle');
    END IF;
    IF NOT EXISTS (SELECT 1 FROM pg_type WHERE typname = 'genre_type') THEN
        CREATE TYPE genre_type AS ENUM ('H', 'F', 'Autre');
    END IF;
    IF NOT EXISTS (SELECT 1 FROM pg_type WHERE typname = 'statut_utilisateur_type') THEN
        CREATE TYPE statut_utilisateur_type AS ENUM ('en_attente','actif','suspendu');
    END IF;
    IF NOT EXISTS (SELECT 1 FROM pg_type WHERE typname = 'statut_enfant_type') THEN
        CREATE TYPE statut_enfant_type AS ENUM ('a_naitre','actif','scolarise');
    END IF;
    IF NOT EXISTS (SELECT 1 FROM pg_type WHERE typname = 'statut_dossier_type') THEN
        CREATE TYPE statut_dossier_type AS ENUM ('envoye','accepte','refuse');
    END IF;
    IF NOT EXISTS (SELECT 1 FROM pg_type WHERE typname = 'statut_contrat_type') THEN
        CREATE TYPE statut_contrat_type AS ENUM ('brouillon','en_attente_signature','valide','resilie');
    END IF;
    IF NOT EXISTS (SELECT 1 FROM pg_type WHERE typname = 'statut_avenant_type') THEN
        CREATE TYPE statut_avenant_type AS ENUM ('propose','accepte','refuse');
    END IF;
    IF NOT EXISTS (SELECT 1 FROM pg_type WHERE typname = 'type_evenement_type') THEN
        CREATE TYPE type_evenement_type AS ENUM ('absence_enfant','conge_am','conge_parent','arret_maladie_am','evenement_rpe');
    END IF;
    IF NOT EXISTS (SELECT 1 FROM pg_type WHERE typname = 'statut_evenement_type') THEN
        CREATE TYPE statut_evenement_type AS ENUM ('propose','valide','refuse');
    END IF;
    IF NOT EXISTS (SELECT 1 FROM pg_type WHERE typname = 'statut_validation_type') THEN
        CREATE TYPE statut_validation_type AS ENUM ('en_attente','valide','refuse');
    END IF;
END $$;

-- ==========================================================
-- Table : utilisateurs
-- ==========================================================
CREATE TABLE utilisateurs (
    id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
    courriel VARCHAR(255) NOT NULL UNIQUE,
    CHECK (courriel ~* '^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,}$'),
    mot_de_passe_hash TEXT NOT NULL,
    prenom VARCHAR(100),
    nom VARCHAR(100),
    genre genre_type,
    role role_type NOT NULL,
    statut statut_utilisateur_type DEFAULT 'en_attente',
    telephone VARCHAR(20),
    adresse TEXT,
    photo_url TEXT,
    consentement_photo BOOLEAN DEFAULT false,
    date_consentement_photo TIMESTAMPTZ,
    changement_mdp_obligatoire BOOLEAN DEFAULT false,
    cree_le TIMESTAMPTZ DEFAULT now(),
    modifie_le TIMESTAMPTZ DEFAULT now(),
    ville VARCHAR(150),
    code_postal VARCHAR(10)
);

-- ==========================================================
-- Table : assistantes_maternelles
-- ==========================================================
CREATE TABLE assistantes_maternelles (
    id_utilisateur UUID PRIMARY KEY REFERENCES utilisateurs(id) ON DELETE CASCADE,
    numero_agrement VARCHAR(50),
    date_naissance DATE,
    ville_naissance VARCHAR(100),
    pays_naissance CHAR(2),
    nir_chiffre CHAR(15),
    nb_max_enfants INT,
    biographie TEXT,
    disponible BOOLEAN DEFAULT true,
    ville_residence VARCHAR(100)
);

-- ==========================================================
-- Table : parents
-- ==========================================================
CREATE TABLE parents (
    id_utilisateur UUID PRIMARY KEY REFERENCES utilisateurs(id) ON DELETE CASCADE,
    id_co_parent UUID REFERENCES utilisateurs(id)
);

-- ==========================================================
-- Table : enfants
-- ==========================================================
CREATE TABLE enfants (
    id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
    statut statut_enfant_type,
    prenom VARCHAR(100),
    nom VARCHAR(100),
    genre genre_type,
    date_naissance DATE,
    date_prevue_naissance DATE,
    photo_url TEXT,
    consentement_photo BOOLEAN DEFAULT false,
    date_consentement_photo TIMESTAMPTZ,
    est_multiple BOOLEAN DEFAULT false
);

-- ==========================================================
-- Table : enfants_parents
-- ==========================================================
CREATE TABLE enfants_parents (
    id_parent UUID REFERENCES parents(id_utilisateur) ON DELETE CASCADE,
    id_enfant UUID REFERENCES enfants(id) ON DELETE CASCADE,
    PRIMARY KEY (id_parent, id_enfant)
);

-- ==========================================================
-- Table : dossiers
-- ==========================================================
CREATE TABLE dossiers (
    id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
    id_parent UUID REFERENCES parents(id_utilisateur) ON DELETE CASCADE,
    id_enfant UUID REFERENCES enfants(id) ON DELETE CASCADE,
    presentation TEXT,
    type_contrat VARCHAR(50),
    repas BOOLEAN DEFAULT false,
    budget NUMERIC(10,2),
    planning_souhaite JSONB,
    statut statut_dossier_type DEFAULT 'envoye',
    cree_le TIMESTAMPTZ DEFAULT now(),
    modifie_le TIMESTAMPTZ DEFAULT now()
);

-- ==========================================================
-- Table : messages
-- ==========================================================
CREATE TABLE messages (
    id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
    id_dossier UUID REFERENCES dossiers(id) ON DELETE CASCADE,
    id_expediteur UUID REFERENCES utilisateurs(id) ON DELETE CASCADE,
    contenu TEXT,
    re_redige_par_ia BOOLEAN DEFAULT false,
    cree_le TIMESTAMPTZ DEFAULT now()
);

-- ==========================================================
-- Table : contrats
-- ==========================================================
CREATE TABLE contrats (
    id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
    id_dossier UUID UNIQUE REFERENCES dossiers(id) ON DELETE CASCADE,
    planning JSONB,
    tarif_horaire NUMERIC(6,2),
    indemnites_repas NUMERIC(6,2),
    date_debut DATE,
    statut statut_contrat_type DEFAULT 'brouillon',
    signe_parent BOOLEAN DEFAULT false,
    signe_am BOOLEAN DEFAULT false,
    finalise_le TIMESTAMPTZ,
    cree_le TIMESTAMPTZ DEFAULT now(),
    modifie_le TIMESTAMPTZ DEFAULT now()
);

-- ==========================================================
-- Table : avenants_contrats
-- ==========================================================
CREATE TABLE avenants_contrats (
    id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
    id_contrat UUID REFERENCES contrats(id) ON DELETE CASCADE,
    modifications JSONB,
    initie_par UUID REFERENCES utilisateurs(id),
    statut statut_avenant_type DEFAULT 'propose',
    cree_le TIMESTAMPTZ DEFAULT now(),
    modifie_le TIMESTAMPTZ DEFAULT now()
);

-- ==========================================================
-- Table : evenements
-- ==========================================================
CREATE TABLE evenements (
    id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
    type type_evenement_type,
    id_enfant UUID REFERENCES enfants(id) ON DELETE CASCADE,
    id_am UUID REFERENCES utilisateurs(id),
    id_parent UUID REFERENCES parents(id_utilisateur),
    cree_par UUID REFERENCES utilisateurs(id),
    date_debut TIMESTAMPTZ,
    date_fin TIMESTAMPTZ,
    commentaires TEXT,
    statut statut_evenement_type DEFAULT 'propose',
    delai_grace TIMESTAMPTZ,
    urgent BOOLEAN DEFAULT false,
    cree_le TIMESTAMPTZ DEFAULT now(),
    modifie_le TIMESTAMPTZ DEFAULT now()
);

-- ==========================================================
-- Table : signalements_bugs
-- ==========================================================
CREATE TABLE signalements_bugs (
    id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
    id_utilisateur UUID REFERENCES utilisateurs(id),
    description TEXT,
    cree_le TIMESTAMPTZ DEFAULT now()
);

-- ==========================================================
-- Table : uploads
-- ==========================================================
CREATE TABLE uploads (
    id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
    id_utilisateur UUID REFERENCES utilisateurs(id) ON DELETE SET NULL,
    fichier_url TEXT NOT NULL,
    type VARCHAR(50),
    cree_le TIMESTAMPTZ DEFAULT now()
);

-- ==========================================================
-- Table : notifications
-- ==========================================================
CREATE TABLE notifications (
    id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
    id_utilisateur UUID REFERENCES utilisateurs(id) ON DELETE CASCADE,
    contenu TEXT,
    lu BOOLEAN DEFAULT false,
    cree_le TIMESTAMPTZ DEFAULT now()
);

-- ==========================================================
-- Table : validations
-- ==========================================================
CREATE TABLE validations (
    id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
    id_utilisateur UUID REFERENCES utilisateurs(id),
    type VARCHAR(50),
    statut statut_validation_type DEFAULT 'en_attente',
    cree_le TIMESTAMPTZ DEFAULT now(),
    modifie_le TIMESTAMPTZ DEFAULT now()
);
