<?php
// app/Controllers/KalendarController.php
// Controller pro správu událostí/akcí – výpis, detail, vytváření, editace a mazání.

namespace App\Controllers;

use App\Core\Controller;
use App\Core\Auth;
use App\Models\UdalostRepository;
use App\Core\Database;

/**
 * Spravuje události (tréninky, zápasy apod.).
 * Sportovci mohou pouze prohlížet; admin a trenér mohou vytvářet a editovat.
 */
class KalendarController extends Controller
{
    private UdalostRepository $udalosti;

    public function __construct(Database $db)
    {
        parent::__construct($db);
        Auth::requireLogin();
        $this->udalosti = new UdalostRepository($db);
    }

    /** Zobrazí všechny události přístupné přihlášenému uživateli. */
    public function index()
    {
        $user = Auth::user();
        $events = $this->udalosti->getAllEventsForUser($user['id'], $user['role']);

        $this->view->render('kalendar/index', [
            'user' => $user,
            'events' => $events
        ]);
    }

    /** Zobrazí formulář pro vytvoření události. Sportovci nemají přístup. */
    public function pridat()
    {
        $user = Auth::user();
        // Jen admin a coach mohou vytvářet akce
        if ($user['role'] === 'sportovec') {
            $this->abort(403, 'Nemáte oprávnění');
        }

        // Načti týmy pro select
        $userRepo = new \App\Models\UserRepository($this->db);
        if ($user['role'] === 'admin') {
            $teams = $userRepo->getAllTeams();
        } else {
            // Trenér vidí pouze své týmy
            $teams = $userRepo->getTeamsForCoach($user['id']);
        }

        $this->view->render('kalendar/form', ['teams' => $teams]);
    }

    /** Uloží novou událost z POST dat a přesměruje na výpis. */
    public function ulozit()
    {
        $this->udalosti->insert([
            'tym_id' => $_POST['tym_id'],
            'typ' => $_POST['typ'],
            'misto' => $_POST['misto'] ?? null,
            'datum' => $_POST['datum'],
            'popis' => $_POST['popis'] ?? null
        ]);

        Auth::setFlash('success', 'Událost byla úspěšně vytvořena!');
        $this->redirect(BASE_URL . '/kalendar/index');
    }

    /** Zobrazí detail události; trenér může editovat pouze akce svého týmu. */
    public function show()
    {
        $id = (int)($_GET['id'] ?? 0);
        $event = $this->udalosti->findWithTeam($id);

        if (!$event) {
            $this->abort(404, 'Událost nenalezena');
        }

        $user = Auth::user();
        $canEdit = false;
        if ($user['role'] === 'admin') {
            $canEdit = true;
        } elseif ($user['role'] === 'trener') {
            $userRepo = new \App\Models\UserRepository($this->db);
            $coachTeams = $userRepo->getTeamsForCoach($user['id']);
            $coachTeamIds = array_column($coachTeams, 'id');
            $canEdit = in_array($event['tym_id'], $coachTeamIds);
        }

        $this->view->render('kalendar/show', [
            'event' => $event,
            'canEdit' => $canEdit
        ]);
    }

    /** GET: editační formulář. POST: uloží změny. Trenér může editovat jen akce svého týmu. */
    public function edit()
    {
        $id = (int)($_GET['id'] ?? 0);
        $event = $this->udalosti->findWithTeam($id);

        if (!$event) {
            $this->abort(404, 'Událost nenalezena');
        }

        $user = Auth::user();
        if ($user['role'] !== 'admin') {
            if ($user['role'] === 'trener') {
                $userRepo = new \App\Models\UserRepository($this->db);
                $coachTeams = $userRepo->getTeamsForCoach($user['id']);
                $coachTeamIds = array_column($coachTeams, 'id');
                if (!in_array($event['tym_id'], $coachTeamIds)) {
                    $this->abort(403, 'Nemáte oprávnění');
                }
            } else {
                $this->abort(403, 'Nemáte oprávnění');
            }
        }

        if ($_SERVER['REQUEST_METHOD'] === 'POST') {
            $this->udalosti->update($id, [
                'typ' => $_POST['typ'],
                'misto' => $_POST['misto'] ?? null,
                'datum' => $_POST['datum'],
                'popis' => $_POST['popis'] ?? null
            ]);
            Auth::setFlash('success', 'Událost byla úspěšně aktualizována!');
            $this->redirect(BASE_URL . '/kalendar/index');
        }

        $this->view->render('kalendar/edit', ['event' => $event]);
    }

    /** Smaže událost. Admin maže cokoli; trenér jen z vlastních týmů. */
    public function delete()
    {
        $id = (int)($_GET['id'] ?? 0);
        $event = $this->udalosti->find($id);

        if (!$event) {
            $this->abort(404, 'Událost nenalezena');
        }

        $eventWithTeam = $this->udalosti->findWithTeam($id);
        
        $user = Auth::user();
        if ($user['role'] !== 'admin') {
            if ($user['role'] === 'trener' && $eventWithTeam) {
                $userRepo = new \App\Models\UserRepository($this->db);
                $coachTeams = $userRepo->getTeamsForCoach($user['id']);
                $coachTeamIds = array_column($coachTeams, 'id');
                if (!in_array($eventWithTeam['tym_id'], $coachTeamIds)) {
                    $this->abort(403, 'Nemáte oprávnění');
                }
            } else {
                $this->abort(403, 'Nemáte oprávnění');
            }
        }

        $this->udalosti->delete($id);
        Auth::setFlash('success', 'Událost byla úspěšně smazána!');
        $this->redirect(BASE_URL . '/kalendar/index');
    }
}