<?php
namespace App\Controllers;

use App\Core\Auth;
use App\Core\Controller;
use App\Core\Csrf;
use App\Core\Permission;
use App\Models\GroupParticipant;
use Throwable;

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

        $groupId=(int)($_GET['groupe_id'] ?? 0);
        $group=GroupParticipant::group($groupId);

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

        $this->view('group_participants/index',[
            'pageTitle'=>'Participants du groupe',
            'group'=>$group,
            'participants'=>
                GroupParticipant::participants($groupId),
            'eligible'=>
                GroupParticipant::eligibleRegistrations($groupId),
            'metrics'=>
                GroupParticipant::metrics($groupId),
        ]);
    }

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

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

        try{
            GroupParticipant::assign(
                $groupId,
                (int)($_POST['inscription_id'] ?? 0),
                [
                    'date_entree'=>
                        $_POST['date_entree'] ?? date('Y-m-d'),
                    'statut'=>
                        $_POST['statut'] ?? 'actif',
                    'heure_debut'=>
                        $_POST['heure_debut'] ?? '',
                    'heure_fin'=>
                        $_POST['heure_fin'] ?? '',
                    'observations'=>
                        $_POST['observations'] ?? '',
                ],
                (int)(Auth::user()['id'] ?? 0),
                Permission::can(
                    'groupes.participants.override_capacity'
                )
            );

            $_SESSION['success']=
                'Le participant a été affecté au groupe.';
        }catch(Throwable $error){
            $_SESSION['error']=$error->getMessage();
        }

        $this->redirect(
            '/groupes/participants?groupe_id='.$groupId
        );
    }

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

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

        GroupParticipant::remove(
            (int)($_POST['id'] ?? 0),
            (string)($_POST['motif'] ?? '')
        );

        $_SESSION['success']=
            'Le participant a été retiré du groupe.';

        $this->redirect(
            '/groupes/participants?groupe_id='.$groupId
        );
    }
}
