-- CreateTable
CREATE TABLE "agence_config" (
    "id" TEXT NOT NULL,
    "nom" TEXT NOT NULL,
    "slogan" TEXT,
    "email" TEXT,
    "adresse" TEXT,
    "ville" TEXT,
    "telephones" TEXT[],
    "logo_url" TEXT,
    "is_active" BOOLEAN NOT NULL DEFAULT true,
    "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
    "updated_at" TIMESTAMP(3) NOT NULL,

    CONSTRAINT "agence_config_pkey" PRIMARY KEY ("id")
);

-- CreateTable
CREATE TABLE "Users" (
    "id" SERIAL NOT NULL,
    "email" TEXT NOT NULL,
    "password_hash" TEXT NOT NULL,
    "nom" TEXT NOT NULL,
    "prenom" TEXT NOT NULL,
    "isActive" BOOLEAN NOT NULL DEFAULT true,
    "otp_code" TEXT,
    "otp_expires_at" TIMESTAMP(3),
    "otp_attempts" INTEGER NOT NULL DEFAULT 0,
    "otp_created_at" TIMESTAMP(3),
    "token_version" INTEGER NOT NULL DEFAULT 0,
    "refresh_token_hash" TEXT,
    "derniere_connexion" TIMESTAMP(3),
    "deleted_at" TIMESTAMP(3),
    "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
    "updated_at" TIMESTAMP(3) NOT NULL,

    CONSTRAINT "Users_pkey" PRIMARY KEY ("id")
);

-- CreateTable
CREATE TABLE "roles" (
    "id" TEXT NOT NULL,
    "nom" TEXT NOT NULL,
    "description" TEXT,
    "deleted_at" TIMESTAMP(3),
    "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,

    CONSTRAINT "roles_pkey" PRIMARY KEY ("id")
);

-- CreateTable
CREATE TABLE "permissions" (
    "id" TEXT NOT NULL,
    "action" TEXT NOT NULL,
    "ressource" TEXT NOT NULL,
    "description" TEXT,
    "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,

    CONSTRAINT "permissions_pkey" PRIMARY KEY ("id")
);

-- CreateTable
CREATE TABLE "roles_Users" (
    "User_id" INTEGER NOT NULL,
    "role_id" TEXT NOT NULL,
    "assigné_au" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,

    CONSTRAINT "roles_Users_pkey" PRIMARY KEY ("User_id","role_id")
);

-- CreateTable
CREATE TABLE "permissions_roles" (
    "role_id" TEXT NOT NULL,
    "permission_id" TEXT NOT NULL,

    CONSTRAINT "permissions_roles_pkey" PRIMARY KEY ("role_id","permission_id")
);

-- CreateTable
CREATE TABLE "pelerins" (
    "id" TEXT NOT NULL,
    "nom" TEXT NOT NULL,
    "prenom" TEXT NOT NULL,
    "date_naissance" TIMESTAMP(3) NOT NULL,
    "telephone" TEXT NOT NULL,
    "numero_pasport" TEXT NOT NULL,
    "date_emission_pasport" TIMESTAMP(3) NOT NULL,
    "date_expiration_pasport" TIMESTAMP(3) NOT NULL,
    "statut_visa" TEXT NOT NULL DEFAULT 'EN_ATTENTE',
    "statut_dossier" TEXT NOT NULL DEFAULT 'INCOMPLET',
    "deleted_at" TIMESTAMP(3),
    "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
    "updated_at" TIMESTAMP(3) NOT NULL,

    CONSTRAINT "pelerins_pkey" PRIMARY KEY ("id")
);

-- CreateTable
CREATE TABLE "voyages" (
    "id" TEXT NOT NULL,
    "nom" TEXT NOT NULL,
    "type" TEXT NOT NULL,
    "prix" DECIMAL(12,2) NOT NULL,
    "date_debut" TIMESTAMP(3) NOT NULL,
    "date_fin" TIMESTAMP(3) NOT NULL,
    "capacite_max" INTEGER NOT NULL,
    "deleted_at" TIMESTAMP(3),
    "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
    "updated_at" TIMESTAMP(3) NOT NULL,

    CONSTRAINT "voyages_pkey" PRIMARY KEY ("id")
);

-- CreateTable
CREATE TABLE "inscriptions_pelerins" (
    "id" TEXT NOT NULL,
    "pelerin_id" TEXT NOT NULL,
    "voyage_id" TEXT NOT NULL,
    "statut" TEXT NOT NULL DEFAULT 'EN_ATTENTE',
    "montant_total" DECIMAL(12,2) NOT NULL,
    "montant_paye" DECIMAL(12,2) NOT NULL DEFAULT 0,
    "montant_restant" DECIMAL(12,2) NOT NULL,
    "date_inscription" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
    "deleted_at" TIMESTAMP(3),

    CONSTRAINT "inscriptions_pelerins_pkey" PRIMARY KEY ("id")
);

-- CreateTable
CREATE TABLE "paiements_tranches" (
    "id" TEXT NOT NULL,
    "inscription_id" TEXT NOT NULL,
    "numero_sequence" INTEGER NOT NULL,
    "montant" DECIMAL(12,2) NOT NULL,
    "date_echeance" TIMESTAMP(3) NOT NULL,
    "date_paiement" TIMESTAMP(3),
    "statut" TEXT NOT NULL DEFAULT 'EN_ATTENTE',
    "type_paiement" TEXT,
    "reference_externe" TEXT,
    "numero_recu" TEXT,
    "url_recu_pdf" TEXT,
    "note_admin" TEXT,
    "creatée_par" INTEGER,
    "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,

    CONSTRAINT "paiements_tranches_pkey" PRIMARY KEY ("id")
);

-- CreateTable
CREATE TABLE "documents_pelerins" (
    "id" TEXT NOT NULL,
    "pelerin_id" TEXT NOT NULL,
    "type" TEXT NOT NULL,
    "numero_document" TEXT NOT NULL,
    "date_expiration" TIMESTAMP(3),
    "chemin_fichier" TEXT NOT NULL,
    "date_chargement" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
    "statut" TEXT NOT NULL DEFAULT 'EN_ATTENTE',

    CONSTRAINT "documents_pelerins_pkey" PRIMARY KEY ("id")
);

-- CreateTable
CREATE TABLE "depenses" (
    "id" TEXT NOT NULL,
    "voyage_id" TEXT,
    "libelle" TEXT NOT NULL,
    "montant" DECIMAL(15,2) NOT NULL,
    "categorie" TEXT NOT NULL,
    "date_depense" TIMESTAMP(3) NOT NULL,
    "notes" TEXT,
    "creatée_par" INTEGER,
    "deleted_at" TIMESTAMP(3),
    "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,

    CONSTRAINT "depenses_pkey" PRIMARY KEY ("id")
);

-- CreateTable
CREATE TABLE "audit_logs" (
    "id" TEXT NOT NULL,
    "User_id" INTEGER NOT NULL,
    "action" TEXT NOT NULL,
    "ressource" TEXT NOT NULL,
    "ressource_id" TEXT NOT NULL,
    "anciennes_valeurs" JSONB,
    "nouvelles_valeurs" JSONB,
    "adresse_ip" TEXT,
    "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,

    CONSTRAINT "audit_logs_pkey" PRIMARY KEY ("id")
);

-- CreateIndex
CREATE UNIQUE INDEX "Users_email_key" ON "Users"("email");

-- CreateIndex
CREATE INDEX "Users_email_idx" ON "Users"("email");

-- CreateIndex
CREATE INDEX "Users_isActive_idx" ON "Users"("isActive");

-- CreateIndex
CREATE INDEX "Users_deleted_at_idx" ON "Users"("deleted_at");

-- CreateIndex
CREATE UNIQUE INDEX "roles_nom_key" ON "roles"("nom");

-- CreateIndex
CREATE INDEX "roles_deleted_at_idx" ON "roles"("deleted_at");

-- CreateIndex
CREATE UNIQUE INDEX "permissions_action_ressource_key" ON "permissions"("action", "ressource");

-- CreateIndex
CREATE UNIQUE INDEX "pelerins_numero_pasport_key" ON "pelerins"("numero_pasport");

-- CreateIndex
CREATE INDEX "pelerins_date_expiration_pasport_idx" ON "pelerins"("date_expiration_pasport");

-- CreateIndex
CREATE INDEX "pelerins_statut_dossier_idx" ON "pelerins"("statut_dossier");

-- CreateIndex
CREATE INDEX "pelerins_deleted_at_idx" ON "pelerins"("deleted_at");

-- CreateIndex
CREATE INDEX "voyages_type_idx" ON "voyages"("type");

-- CreateIndex
CREATE INDEX "voyages_date_debut_idx" ON "voyages"("date_debut");

-- CreateIndex
CREATE INDEX "voyages_deleted_at_idx" ON "voyages"("deleted_at");

-- CreateIndex
CREATE INDEX "inscriptions_pelerins_pelerin_id_idx" ON "inscriptions_pelerins"("pelerin_id");

-- CreateIndex
CREATE INDEX "inscriptions_pelerins_voyage_id_idx" ON "inscriptions_pelerins"("voyage_id");

-- CreateIndex
CREATE INDEX "inscriptions_pelerins_statut_idx" ON "inscriptions_pelerins"("statut");

-- CreateIndex
CREATE INDEX "inscriptions_pelerins_deleted_at_idx" ON "inscriptions_pelerins"("deleted_at");

-- CreateIndex
CREATE UNIQUE INDEX "inscriptions_pelerins_pelerin_id_voyage_id_key" ON "inscriptions_pelerins"("pelerin_id", "voyage_id");

-- CreateIndex
CREATE UNIQUE INDEX "paiements_tranches_reference_externe_key" ON "paiements_tranches"("reference_externe");

-- CreateIndex
CREATE UNIQUE INDEX "paiements_tranches_numero_recu_key" ON "paiements_tranches"("numero_recu");

-- CreateIndex
CREATE INDEX "paiements_tranches_inscription_id_idx" ON "paiements_tranches"("inscription_id");

-- CreateIndex
CREATE INDEX "paiements_tranches_date_echeance_idx" ON "paiements_tranches"("date_echeance");

-- CreateIndex
CREATE INDEX "paiements_tranches_statut_idx" ON "paiements_tranches"("statut");

-- CreateIndex
CREATE UNIQUE INDEX "paiements_tranches_inscription_id_numero_sequence_key" ON "paiements_tranches"("inscription_id", "numero_sequence");

-- CreateIndex
CREATE INDEX "documents_pelerins_pelerin_id_idx" ON "documents_pelerins"("pelerin_id");

-- CreateIndex
CREATE INDEX "documents_pelerins_type_idx" ON "documents_pelerins"("type");

-- CreateIndex
CREATE INDEX "documents_pelerins_date_expiration_idx" ON "documents_pelerins"("date_expiration");

-- CreateIndex
CREATE INDEX "depenses_voyage_id_idx" ON "depenses"("voyage_id");

-- CreateIndex
CREATE INDEX "depenses_categorie_idx" ON "depenses"("categorie");

-- CreateIndex
CREATE INDEX "depenses_date_depense_idx" ON "depenses"("date_depense");

-- CreateIndex
CREATE INDEX "depenses_deleted_at_idx" ON "depenses"("deleted_at");

-- CreateIndex
CREATE INDEX "audit_logs_User_id_idx" ON "audit_logs"("User_id");

-- CreateIndex
CREATE INDEX "audit_logs_action_idx" ON "audit_logs"("action");

-- CreateIndex
CREATE INDEX "audit_logs_ressource_idx" ON "audit_logs"("ressource");

-- CreateIndex
CREATE INDEX "audit_logs_created_at_idx" ON "audit_logs"("created_at");

-- AddForeignKey
ALTER TABLE "roles_Users" ADD CONSTRAINT "roles_Users_User_id_fkey" FOREIGN KEY ("User_id") REFERENCES "Users"("id") ON DELETE CASCADE ON UPDATE CASCADE;

-- AddForeignKey
ALTER TABLE "roles_Users" ADD CONSTRAINT "roles_Users_role_id_fkey" FOREIGN KEY ("role_id") REFERENCES "roles"("id") ON DELETE CASCADE ON UPDATE CASCADE;

-- AddForeignKey
ALTER TABLE "permissions_roles" ADD CONSTRAINT "permissions_roles_role_id_fkey" FOREIGN KEY ("role_id") REFERENCES "roles"("id") ON DELETE CASCADE ON UPDATE CASCADE;

-- AddForeignKey
ALTER TABLE "permissions_roles" ADD CONSTRAINT "permissions_roles_permission_id_fkey" FOREIGN KEY ("permission_id") REFERENCES "permissions"("id") ON DELETE CASCADE ON UPDATE CASCADE;

-- AddForeignKey
ALTER TABLE "inscriptions_pelerins" ADD CONSTRAINT "inscriptions_pelerins_pelerin_id_fkey" FOREIGN KEY ("pelerin_id") REFERENCES "pelerins"("id") ON DELETE CASCADE ON UPDATE CASCADE;

-- AddForeignKey
ALTER TABLE "inscriptions_pelerins" ADD CONSTRAINT "inscriptions_pelerins_voyage_id_fkey" FOREIGN KEY ("voyage_id") REFERENCES "voyages"("id") ON DELETE CASCADE ON UPDATE CASCADE;

-- AddForeignKey
ALTER TABLE "paiements_tranches" ADD CONSTRAINT "paiements_tranches_inscription_id_fkey" FOREIGN KEY ("inscription_id") REFERENCES "inscriptions_pelerins"("id") ON DELETE CASCADE ON UPDATE CASCADE;

-- AddForeignKey
ALTER TABLE "documents_pelerins" ADD CONSTRAINT "documents_pelerins_pelerin_id_fkey" FOREIGN KEY ("pelerin_id") REFERENCES "pelerins"("id") ON DELETE CASCADE ON UPDATE CASCADE;

-- AddForeignKey
ALTER TABLE "depenses" ADD CONSTRAINT "depenses_voyage_id_fkey" FOREIGN KEY ("voyage_id") REFERENCES "voyages"("id") ON DELETE SET NULL ON UPDATE CASCADE;

-- AddForeignKey
ALTER TABLE "audit_logs" ADD CONSTRAINT "audit_logs_User_id_fkey" FOREIGN KEY ("User_id") REFERENCES "Users"("id") ON DELETE CASCADE ON UPDATE CASCADE;
