<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

return new class extends Migration
{
    public function up(): void
    {
        // Créer la table Role
        Schema::create('roles', function (Blueprint $table) {
            $table->id('ID_Role');
            $table->string('Nom', 100)->unique();
        });

        // Créer la table Utilisateur
        Schema::create('utilisateurs', function (Blueprint $table) {
            $table->id('ID_Utilisateur');
            $table->string('Email', 255)->unique();
            $table->string('MotDePasse', 255);
            $table->string('Pseudo', 100)->unique()->nullable();
            $table->timestamp('DateInscription')->useCurrent();
            $table->enum('Statut', ['Actif', 'Inactif'])->default('Actif');
            $table->foreignId('ID_Role')->constrained('roles', 'ID_Role');
        });

        // Créer la table Type_Ressource
        Schema::create('type_ressources', function (Blueprint $table) {
            $table->id('ID_Type_Ressource');
            $table->string('Format', 100)->unique();
        });

        // Créer la table Categorie
        Schema::create('categories', function (Blueprint $table) {
            $table->id('ID_Categorie');
            $table->string('Nom', 100);
            $table->text('Description')->nullable();
        });

        // Créer la table Ressource
        Schema::create('ressources', function (Blueprint $table) {
            $table->id('ID_Ressource');
            $table->string('Titre', 255);
            $table->text('Contenu')->nullable();
            $table->string('URL', 2048)->nullable();
            $table->timestamp('DateCreation')->useCurrent();
            $table->enum('Visibilite', ['Privée', 'Partagée', 'Publique'])->default('Privée');
            $table->enum('Statut', ['En attente', 'Publiée', 'Suspendue', 'Rejetée'])->default('En attente');
            $table->foreignId('ID_Type_Ressource')->constrained('type_ressources', 'ID_Type_Ressource');
            $table->foreignId('ID_Moderateur_Validation')->nullable()->constrained('utilisateurs', 'ID_Utilisateur');
            $table->foreignId('ID_Utilisateur_Createur')->constrained('utilisateurs', 'ID_Utilisateur');
        });

        // Créer la table Commentaire
        Schema::create('commentaires', function (Blueprint $table) {
            $table->id('ID_Commentaire');
            $table->text('Texte');
            $table->timestamp('DatePublication')->useCurrent();
            $table->enum('Statut', ['En attente', 'Approuvé', 'Rejeté'])->default('En attente');
            $table->foreignId('ID_Parent_Commentaire')->nullable()->constrained('commentaires', 'ID_Commentaire');
            $table->foreignId('ID_Utilisateur')->constrained('utilisateurs', 'ID_Utilisateur');
            $table->foreignId('ID_Ressource')->constrained('ressources', 'ID_Ressource');
        });

        // Créer la table Activite
        Schema::create('activites', function (Blueprint $table) {
            $table->id('ID_Instance');
            $table->timestamp('DateDebut')->useCurrent();
            $table->timestamp('DateFin')->useCurrent();
            $table->foreignId('ID_Utilisateur_Hote')->constrained('utilisateurs', 'ID_Utilisateur');
            $table->foreignId('ID_Ressource')->constrained('ressources', 'ID_Ressource');
        });

        // Créer la table Activite_Message
        Schema::create('activite_messages', function (Blueprint $table) {
            $table->id('ID_Message');
            $table->text('Message');
            $table->timestamp('Timestamp')->useCurrent();
            $table->foreignId('ID_Utilisateur_Emetteur')->constrained('utilisateurs', 'ID_Utilisateur');
            $table->foreignId('ID_Instance')->constrained('activites', 'ID_Instance');
        });

        // Créer la table Ressource_Categorie
        Schema::create('ressource_categories', function (Blueprint $table) {
            $table->foreignId('ID_Ressource')->constrained('ressources', 'ID_Ressource');
            $table->foreignId('ID_Categorie')->constrained('categories', 'ID_Categorie');
            $table->primary(['ID_Ressource', 'ID_Categorie']);
        });

        // Créer la table Utilisateur_Progression
        Schema::create('utilisateur_progressions', function (Blueprint $table) {
            $table->foreignId('ID_Utilisateur')->constrained('utilisateurs', 'ID_Utilisateur');
            $table->foreignId('ID_Ressource')->constrained('ressources', 'ID_Ressource');
            $table->enum('Statut_Exploitation', ['Non commencé', 'Exploitée', 'Mis de côté'])->default('Non commencé');
            $table->boolean('Est_Favori')->default(false);
            $table->primary(['ID_Utilisateur', 'ID_Ressource']);
        });

        // Créer la table Activite_Participant
        Schema::create('activite_participants', function (Blueprint $table) {
            $table->foreignId('ID_Instance')->constrained('activites', 'ID_Instance');
            $table->foreignId('ID_Utilisateur_Participant')->constrained('utilisateurs', 'ID_Utilisateur');
            $table->primary(['ID_Instance', 'ID_Utilisateur_Participant']);
        });
    }

    public function down(): void
    {
        Schema::dropIfExists('activite_participants');
        Schema::dropIfExists('utilisateur_progressions');
        Schema::dropIfExists('ressource_categories');
        Schema::dropIfExists('activite_messages');
        Schema::dropIfExists('activites');
        Schema::dropIfExists('commentaires');
        Schema::dropIfExists('ressources');
        Schema::dropIfExists('categories');
        Schema::dropIfExists('type_ressources');
        Schema::dropIfExists('utilisateurs');
        Schema::dropIfExists('roles');
    }
};
