-- Script d'initialisation de la base de données MySQL
-- Ce script est exécuté automatiquement par le conteneur MySQL au premier démarrage.

-- Création de la base de données si elle n'existe pas
CREATE DATABASE IF NOT EXISTS `cert_gestion` CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- Utilisation de la base de données
USE `cert_gestion`;

-- Table pour stocker les informations des utilisateurs
CREATE TABLE IF NOT EXISTS `users` (
    `id` INT AUTO_INCREMENT PRIMARY KEY,
    `username` VARCHAR(255) UNIQUE NOT NULL, -- Nom d'utilisateur unique
    `password` VARCHAR(255) NOT NULL,        -- Mot de passe haché
    `role` ENUM('admin', 'user') DEFAULT 'user', -- Rôle de l'utilisateur (admin ou utilisateur simple)
    `created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP -- Date de création du compte
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- Table pour stocker les périmètres fonctionnels
CREATE TABLE IF NOT EXISTS `functional_perimeters` (
    `id` INT AUTO_INCREMENT PRIMARY KEY,
    `name` VARCHAR(255) UNIQUE NOT NULL,           -- Nom unique du périmètre fonctionnel
    `intermediate_cert_name` VARCHAR(255) UNIQUE NOT NULL, -- Nom du fichier du certificat intermédiaire associé
    `created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP -- Date de création du périmètre
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- Table pour stocker les informations sur les certificats
CREATE TABLE IF NOT EXISTS `certificates` (
    `id` INT AUTO_INCREMENT PRIMARY KEY,
    `name` VARCHAR(255) UNIQUE NOT NULL,           -- Nom du fichier du certificat (ex: www.example.com.pem)
    `type` ENUM('root', 'intermediate', 'simple') NOT NULL, -- Type de certificat
    `functional_perimeter_id` INT NULL,              -- Clé étrangère vers functional_perimeters (NULL pour le certificat root)
    `expiration_date` DATETIME NOT NULL,           -- Date d'expiration du certificat
    `is_revoked` BOOLEAN DEFAULT FALSE,            -- Indique si le certificat est révoqué
    `revoked_at` DATETIME NULL,                    -- Date de révocation si révoqué
    `created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP, -- Date de création du certificat
    FOREIGN KEY (`functional_perimeter_id`) REFERENCES `functional_perimeters`(`id`) ON DELETE SET NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- Table pour historiser les actions des utilisateurs
CREATE TABLE IF NOT EXISTS `action_logs` (
    `id` INT AUTO_INCREMENT PRIMARY KEY,
    `user_id` INT NOT NULL,                        -- ID de l'utilisateur qui a effectué l'action
    `action_type` VARCHAR(50) NOT NULL,            -- Type d'action (ex: 'login', 'create_cert', 'revoke_cert', 'create_user')
    `description` TEXT NOT NULL,                   -- Description détaillée de l'action
    `ip_address` VARCHAR(45) NOT NULL,             -- Adresse IP de l'utilisateur
    `action_time` TIMESTAMP DEFAULT CURRENT_TIMESTAMP, -- Date et heure de l'action
    FOREIGN KEY (`user_id`) REFERENCES `users`(`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- Note sur l'initialisation du premier administrateur et du certificat root:
-- La création du premier compte administrateur et du certificat root
-- sera gérée par l'application PHP au premier lancement pour des raisons de flexibilité et de sécurité.
-- Le mot de passe de l'administrateur sera haché par l'application PHP.
