<?php
namespace App\Controllers;

use App\Core\Auth;
use App\Core\Controller;
use App\Core\Csrf;
use App\Core\Permission;
use App\Models\CourseGroupV6;

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

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

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

        $this->view('groups_v6/form',[
            'pageTitle'=>'Nouveau groupe',
            'group'=>null,
            'workshops'=>CourseGroupV6::workshops(),
            'professors'=>CourseGroupV6::professors(),
            'rooms'=>CourseGroupV6::rooms(),
        ]);
    }

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

        $rows=$this->batchRows($_POST);
        $errors=[];
        if(!$rows){$errors[]='Ajoutez au moins un créneau.';}
        foreach($rows as $position=>$row){
            foreach($this->validate($row) as $error){
                $errors[]='Créneau '.($position+1).' : '.$error;
            }
        }

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

        $created=[];
        try{
            foreach($rows as $row){
                $created[]=CourseGroupV6::create(
                    $this->data($row),
                    (int)(Auth::user()['id'] ?? 0)
                );
            }
        }catch(\Throwable $error){
            foreach($created as $createdId){CourseGroupV6::archive((int)$createdId);}
            $_SESSION['form_errors']=[$error->getMessage()];
            $_SESSION['old']=$_POST;
            $this->redirect('/groupes/nouveau');
        }

        $_SESSION['success']=count($created).' créneau(x) créé(s).';
        $this->redirect('/groupes');
    }

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

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

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

        $this->view('groups_v6/form',[
            'pageTitle'=>'Modifier le groupe',
            'group'=>$group,
            'workshops'=>CourseGroupV6::workshops(),
            'professors'=>CourseGroupV6::professors(),
            'rooms'=>CourseGroupV6::rooms(),
        ]);
    }

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

        $id=(int)($_POST['id'] ?? 0);
        $errors=$this->validate($_POST,true);

        if($errors){
            $_SESSION['form_errors']=$errors;
            $this->redirect('/groupes/modifier?id='.$id);
        }

        try{
            CourseGroupV6::update(
                $id,
                $this->data($_POST,true),
                (int)(Auth::user()['id'] ?? 0)
            );
        }catch(\Throwable $error){
            $_SESSION['form_errors']=[$error->getMessage()];
            $_SESSION['old']=$_POST;
            $this->redirect('/groupes/modifier?id='.$id);
        }

        $_SESSION['success']='Le groupe a été modifié.';
        $this->redirect('/groupes');
    }

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

        CourseGroupV6::archive(
            (int)($_POST['id'] ?? 0)
        );

        $_SESSION['success']='Le groupe a été archivé.';
        $this->redirect('/groupes');
    }

    private function validate(
        array $input,
        bool $editing=false
    ): array {
        $errors=[];

        if(!$editing && empty($input['atelier_id'])){
            $errors[]='Le cours est obligatoire.';
        }

        if(trim($input['libelle'] ?? '')===''){
            $errors[]='Le libellé est obligatoire.';
        }

        if(empty($input['jour_semaine'])){
            $errors[]='Le jour est obligatoire.';
        }

        if(empty($input['heure_debut']) ||
           empty($input['heure_fin'])){
            $errors[]='Les horaires sont obligatoires.';
        }

        if(
            !empty($input['heure_debut']) &&
            !empty($input['heure_fin']) &&
            $input['heure_fin'] <= $input['heure_debut']
        ){
            $errors[]=
                'L’heure de fin doit être après l’heure de début.';
        }

        return $errors;
    }

    private function data(
        array $input,
        bool $editing=false
    ): array {
        return [
            'atelier_id'=>(int)($input['atelier_id'] ?? 0),
            'libelle'=>trim($input['libelle'] ?? ''),
            'type_groupe'=>$input['type_groupe'] ?? 'collectif',
            'capacite_max'=>(int)($input['capacite_max'] ?? 0),
            'duree_creneau_minutes'=>
                (int)($input['duree_creneau_minutes'] ?? 0),
            'date_debut'=>$input['date_debut'] ?? date('Y-m-d'),
            'date_fin'=>$input['date_fin'] ?? null,
            'salle_id'=>(int)($input['salle_id'] ?? 0),
            'professeur_id'=>
                (int)($input['professeur_id'] ?? 0),
            'jour_semaine'=>$input['jour_semaine'] ?? 'lundi',
            'heure_debut'=>$input['heure_debut'] ?? '09:00',
            'heure_fin'=>$input['heure_fin'] ?? '10:00',
            'date_effet'=>$input['date_effet'] ?? date('Y-m-d'),
            'motif'=>trim(
                $input['motif'] ?? 'Modification du groupe'
            ),
        ];
    }

    private function batchRows(array $input): array
    {
        $rows=[];
        foreach(($input['slots']??[]) as $slot){
            if(!is_array($slot))continue;
            $rows[]=array_merge($slot,[
                'atelier_id'=>$input['atelier_id']??0,
                'date_debut'=>$input['date_debut']??date('Y-m-d'),
                'date_fin'=>$input['date_fin']??'',
            ]);
        }
        // Compatibilité avec les anciens formulaires ou appels API.
        if(!$rows && isset($input['libelle'])){$rows[]=$input;}
        return $rows;
    }
}
