<?php
namespace App\Controllers;

use App\Core\Auth;
use App\Core\Controller;
use App\Core\Csrf;
use App\Core\Permission;
use App\Models\CourseGroup;
use App\Models\Professor;
use App\Models\Workshop;

final class CourseGroupController extends Controller
{
    public function index(): void
    {
        Auth::requireLogin();
        Permission::require('groupes.view');

        $this->view('groups/index', [
            'pageTitle' => 'Groupes et créneaux',
            'groups' => CourseGroup::all(),
        ]);
    }

    public function create(): void
    {
        Auth::requireLogin();
        Permission::require('groupes.create');

        $this->view('groups/form', [
            'pageTitle' => 'Nouveau groupe',
            'workshops' => Workshop::active(),
            'professors' => Professor::active(),
            'rooms' => CourseGroup::rooms(),
        ]);
    }

    public function store(): void
    {
        Auth::requireLogin();
        Permission::require('groupes.create');
        Csrf::verify($_POST['_csrf'] ?? null);

        $errors = [];
        $code = strtoupper(trim($_POST['code'] ?? ''));
        $libelle = trim($_POST['libelle'] ?? '');

        if (!(int)($_POST['atelier_id'] ?? 0)) $errors[] = 'L’atelier est obligatoire.';
        if ($code === '') $errors[] = 'Le code est obligatoire.';
        if ($libelle === '') $errors[] = 'Le libellé est obligatoire.';
        if (empty($_POST['date_debut']) || empty($_POST['date_fin'])) {
            $errors[] = 'La période est obligatoire.';
        }
        if (empty($_POST['heure_debut']) || empty($_POST['heure_fin'])) {
            $errors[] = 'Les horaires sont obligatoires.';
        }

        if ($errors) {
            $_SESSION['form_errors'] = $errors;
            $_SESSION['old'] = $_POST;
            $this->redirect('/groupes/nouveau');
        }

        $id = CourseGroup::create([
            'atelier_id' => (int)$_POST['atelier_id'],
            'code' => $code,
            'libelle' => $libelle,
            'type_groupe' => $_POST['type_groupe'] ?? 'collectif',
            'capacite_max' => (int)($_POST['capacite_max'] ?? 0),
            'duree_creneau_minutes' => (int)($_POST['duree_creneau_minutes'] ?? 0),
            'date_debut' => $_POST['date_debut'],
            'date_fin' => $_POST['date_fin'],
            'salle_id' => (int)($_POST['salle_id'] ?? 0),
            'professeur_id' => (int)($_POST['professeur_id'] ?? 0),
            'jour_semaine' => $_POST['jour_semaine'],
            'heure_debut' => $_POST['heure_debut'],
            'heure_fin' => $_POST['heure_fin'],
        ], (int)Auth::id());

        $_SESSION['success'] = 'Le groupe et sa première version de planning ont été créés.';
        $this->redirect('/groupes/voir?id=' . $id);
    }

    public function show(): void
    {
        Auth::requireLogin();
        Permission::require('groupes.view');

        $id = (int)($_GET['id'] ?? 0);
        $group = CourseGroup::find($id);

        if (!$group) {
            http_response_code(404);
            exit('Groupe introuvable.');
        }

        $this->view('groups/show', [
            'pageTitle' => 'Fiche groupe',
            'group' => $group,
            'participants' => CourseGroup::participants($id),
        ]);
    }
}
