<?php
namespace App\Controllers;

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

final class ParameterManagementController extends Controller
{
    public function editPole(): void
    {
        Auth::requireLogin();
        Permission::require('parametres.poles.edit');

        $id=(int)($_GET['id'] ?? 0);
        $pole=ParameterManagement::pole($id);

        if(!$pole){
            http_response_code(404);
            exit('Pôle introuvable.');
        }

        $this->view('parameters/manage_pole',[
            'pageTitle'=>'Modifier le pôle',
            'pole'=>$pole,
        ]);
    }

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

        $id=(int)($_POST['id'] ?? 0);
        $code=strtoupper(trim($_POST['code'] ?? ''));
        $libelle=trim($_POST['libelle'] ?? '');

        if($code==='' || $libelle===''){
            $_SESSION['error']='Le code et le libellé sont obligatoires.';
            $this->redirect('/parametres/poles/modifier?id='.$id);
        }

        ParameterManagement::updatePole($id,$code,$libelle);

        $_SESSION['success']='Le pôle a été modifié.';
        $this->redirect('/parametres/pedagogie#poles');
    }

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

        $id=(int)($_POST['id'] ?? 0);

        if(ParameterManagement::poleHasActiveCourses($id)){
            $_SESSION['error']=
                'Impossible d’archiver ce pôle : des cours actifs y sont encore rattachés.';
            $this->redirect('/parametres/pedagogie#poles');
        }

        ParameterManagement::archivePole($id);

        $_SESSION['success']='Le pôle a été archivé.';
        $this->redirect('/parametres/pedagogie#poles');
    }

    public function editDiscipline(): void
    {
        Auth::requireLogin();
        Permission::require('parametres.disciplines.edit');

        $id=(int)($_GET['id'] ?? 0);
        $discipline=ParameterManagement::discipline($id);

        if(!$discipline){
            http_response_code(404);
            exit('Discipline introuvable.');
        }

        $this->view('parameters/manage_discipline',[
            'pageTitle'=>'Modifier la discipline',
            'discipline'=>$discipline,
            'poles'=>ParameterManagement::poles(),
        ]);
    }

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

        $id=(int)($_POST['id'] ?? 0);
        $poleId=(int)($_POST['pole_id'] ?? 0);
        $code=strtoupper(trim($_POST['code'] ?? ''));
        $libelle=trim($_POST['libelle'] ?? '');
        $individualDuration=(int)($_POST['duree_individuelle_minutes'] ?? 30);
        $collectiveDuration=(int)($_POST['duree_collective_minutes'] ?? 60);

        if(
            !$poleId || $code==='' || $libelle==='' ||
            $individualDuration<5 || $individualDuration>480 ||
            $collectiveDuration<5 || $collectiveDuration>480 ||
            $individualDuration%5!==0 || $collectiveDuration%5!==0
        ){
            $_SESSION['error']=
                'Le pôle et les libellés sont obligatoires. '
                .'Les durées doivent être comprises entre 5 et 480 minutes, par pas de 5 minutes.';
            $this->redirect('/parametres/disciplines/modifier?id='.$id);
        }

        ParameterManagement::updateDiscipline(
            $id,
            $poleId,
            $code,
            $libelle,
            $individualDuration,
            $collectiveDuration
        );

        $_SESSION['success']='La discipline a été modifiée.';
        $this->redirect('/parametres/pedagogie#disciplines');
    }

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

        $id=(int)($_POST['id'] ?? 0);

        if(ParameterManagement::disciplineHasActiveCourses($id)){
            $_SESSION['error']=
                'Impossible d’archiver cette discipline : des cours actifs y sont encore rattachés.';
            $this->redirect('/parametres/pedagogie#disciplines');
        }

        ParameterManagement::archiveDiscipline($id);

        $_SESSION['success']='La discipline a été archivée.';
        $this->redirect('/parametres/pedagogie#disciplines');
    }

    public function updatePublic(): void
    {
        Auth::requireLogin();
        Permission::require('parametres.poles.edit');
        Csrf::verify($_POST['_csrf'] ?? null);
        $id=(int)($_POST['id'] ?? 0);
        $libelle=trim((string)($_POST['libelle'] ?? ''));
        $ageMin=$_POST['age_min']===''?null:(int)$_POST['age_min'];
        $ageMax=$_POST['age_max']===''?null:(int)$_POST['age_max'];
        if(!$id || $libelle==='' || ($ageMin!==null && $ageMax!==null && $ageMin>$ageMax)){
            $_SESSION['error']='Le public ou sa tranche d’âge est invalide.';
            $this->redirect('/parametres/pedagogie#publics');
        }
        ParameterManagement::updatePublic($id,$libelle,$ageMin,$ageMax);
        $_SESSION['success']='Le public a été modifié.';
        $this->redirect('/parametres/pedagogie#publics');
    }
}
