<?php
namespace App\Controllers;

use App\Core\Auth;
use App\Core\Controller;
use App\Core\Csrf;
use App\Core\Formatter;
use App\Core\Permission;
use App\Models\Professor;

final class ProfessorController extends Controller
{
    private function requireRhAccess(): void
    {
        Auth::requireLogin();
        if(!Permission::canViewFullProfessorRh()){
            http_response_code(403);
            exit('Accès au dossier RH refusé.');
        }
    }

    public function index(): void
    {
        $this->requireRhAccess();

        $query=trim($_GET['q'] ?? '');

        $this->view('professors/index',[
            'pageTitle'=>'Professeurs',
            'professors'=>Professor::all($query),
            'query'=>$query,
        ]);
    }

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

        $this->view('professors/form',[
            'pageTitle'=>'Nouveau professeur',
            'professor'=>null,
            'formAction'=>'/professeurs',
            'submitLabel'=>'Créer le professeur',
        ]);
    }

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

        [$data,$errors]=$this->validatedData();

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

        $data['organisation_id']=(int)(Auth::user()['organisation_id'] ?? 1);
        $id=Professor::create($data);

        $_SESSION['success']='Le professeur a été créé.';
        $this->redirect('/professeurs/voir?id='.$id);
    }

    public function show(): void
    {
        $this->requireRhAccess();

        $id=(int)($_GET['id'] ?? 0);
        $professor=Professor::find($id);

        if(!$professor){
            http_response_code(404);
            exit('Professeur introuvable.');
        }

        $this->view('professors/show',[
            'pageTitle'=>'Fiche professeur',
            'professor'=>$professor,
            'groups'=>Professor::groups($id),
        ]);
    }

    public function edit(): void
    {
        $this->requireRhAccess();
        Permission::require('professeurs.edit');

        $id=(int)($_GET['id'] ?? 0);
        $professor=Professor::find($id);

        if(!$professor){
            http_response_code(404);
            exit('Professeur introuvable.');
        }

        $this->view('professors/form',[
            'pageTitle'=>'Modifier le professeur',
            'professor'=>$professor,
            'formAction'=>'/professeurs/modifier?id='.$id,
            'submitLabel'=>'Enregistrer les modifications',
        ]);
    }

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

        $id=(int)($_GET['id'] ?? 0);
        [$data,$errors]=$this->validatedData();

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

        Professor::update($id,$data);

        $_SESSION['success']='La fiche professeur a été mise à jour.';
        $this->redirect('/professeurs/voir?id='.$id);
    }

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

        $id=(int)($_GET['id'] ?? 0);
        Professor::archive($id);

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

    private function validatedData(): array
    {
        $errors=[];
        $nom=Formatter::lastName($_POST['nom'] ?? '');
        $prenom=Formatter::firstName($_POST['prenom'] ?? '');
        $email=Formatter::email($_POST['email'] ?? '');

        if($nom==='') $errors[]='Le nom est obligatoire.';
        if($prenom==='') $errors[]='Le prénom est obligatoire.';
        if($email!=='' && !filter_var($email,FILTER_VALIDATE_EMAIL)){
            $errors[]='L’adresse e-mail est invalide.';
        }
        if(!Formatter::validPhone($_POST['telephone_principal'] ?? '')){
            $errors[]='Le téléphone principal est invalide.';
        }
        if(!Formatter::validPhone($_POST['telephone_secondaire'] ?? '')){
            $errors[]='Le téléphone secondaire est invalide.';
        }

        return [[
            'civilite'=>$_POST['civilite'] ?? 'Non renseigne',
            'nom'=>$nom,
            'prenom'=>$prenom,
            'date_naissance'=>trim($_POST['date_naissance'] ?? ''),
            'email'=>$email,
            'telephone_principal'=>Formatter::phone($_POST['telephone_principal'] ?? ''),
            'telephone_secondaire'=>Formatter::phone($_POST['telephone_secondaire'] ?? ''),
            'adresse_ligne1'=>trim($_POST['adresse_ligne1'] ?? ''),
            'adresse_ligne2'=>trim($_POST['adresse_ligne2'] ?? ''),
            'code_postal'=>Formatter::postalCode($_POST['code_postal'] ?? ''),
            'ville'=>Formatter::city($_POST['ville'] ?? ''),
            'statut_intervenant'=>$_POST['statut_intervenant'] ?? 'autre',
            'type_contrat'=>trim($_POST['type_contrat'] ?? ''),
            'date_debut_contrat'=>trim($_POST['date_debut_contrat'] ?? ''),
            'date_fin_contrat'=>trim($_POST['date_fin_contrat'] ?? ''),
            'droit_image'=>$_POST['droit_image'] ?? 'non_renseigne',
            'rgpd_accepte'=>isset($_POST['rgpd_accepte']) ? 1 : 0,
            'dispense_mutuelle'=>isset($_POST['dispense_mutuelle']) ? 1 : 0,
            'dispense_mutuelle_date'=>trim($_POST['dispense_mutuelle_date'] ?? ''),
            'teletravail_autorise'=>isset($_POST['teletravail_autorise']) ? 1 : 0,
            'reunions_autorisees'=>isset($_POST['reunions_autorisees']) ? 1 : 0,
            'notes'=>trim($_POST['notes'] ?? ''),
        ],$errors];
    }
}
