<?php
// app/Controllers/NastenkaController.php
// Controller pro nástěnku (poznámky) – výpis, detail, přidání, editace a mazání.

namespace App\Controllers;

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

/**
 * Spravuje poznámky na nástěnce.
 * Sportovci mohou pouze číst; admin a trenér mohou přidávat a upravovat.
 * Upravit/smazat může pouze autor záznamu nebo admin (Auth::muzeUpravit).
 */
class NastenkaController extends Controller
{
    private PoznamkaRepository $poznamky;

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

    /** Zobrazí seznam posledních 20 poznámek přístupných přihlášenému uživateli. */
    public function index()
    {
        $user = Auth::user();
        $notes = $this->poznamky->getRecentNotesForUser($user['id'], $user['role'], 20);

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

    /** Zobrazí formulář pro vytvoření poznámky. Sportovci nemají přístup. */
    public function pridat()
    {
        $user = Auth::user();
        // Jen admin a coach mohou vytvářet poznámky
        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('nastenka/form', ['teams' => $teams]);
    }

    /** Uloží novou poznámku z POST dat a přesměruje na výpis. */
    public function ulozit()
    {
        $this->poznamky->insert([
            'tym_id' => $_POST['tym_id'],
            'uzivatel_id' => Auth::user()['id'],
            'obsah' => $_POST['obsah'],
            'datum' => date('Y-m-d H:i:s')
        ]);

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

    /** Zobrazí detail poznámky; předá příznak muzeUpravit pro zobrazení tlačítek. */
    public function show()
    {
        $id = (int)($_GET['id'] ?? 0);
        $note = $this->poznamky->findWithUser($id);

        if (!$note) {
            $this->abort(404, 'Poznámka nenalezena');
        }

        $this->view->render('nastenka/show', [
            'note' => $note,
            'muzeUpravit' => Auth::muzeUpravit($note)
        ]);
    }

    /** GET: editační formulář. POST: uloží změny. Ověřuje Auth::muzeUpravit(). */
    public function edit()
    {
        $id = (int)($_GET['id'] ?? 0);
        $note = $this->poznamky->findWithUser($id);

        if (!$note) {
            $this->abort(404, 'Poznámka nenalezena');
        }

        if (!Auth::muzeUpravit($note)) {
            $this->abort(403, 'Nemáte oprávnění');
        }

        if ($_SERVER['REQUEST_METHOD'] === 'POST') {
            $data = $this->validate($_POST);
            $this->poznamky->update($id, $data);
            Auth::setFlash('success', 'Poznámka byla úspěšně aktualizována!');
            $this->redirect(BASE_URL . '/nastenka/index');
        }

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

    /** Smaže poznámku; přístup jen pro autora nebo admina. */
    public function delete()
    {
        $id = (int)($_GET['id'] ?? 0);
        $note = $this->poznamky->findWithUser($id);

        if (!$note || !Auth::muzeUpravit($note)) {
            $this->abort(403, 'Zakázáno');
        }

        $this->poznamky->delete($id);
        Auth::setFlash('success', 'Poznámka byla úspěšně smazána!');
        $this->redirect(BASE_URL . '/nastenka/index');
    }

    /** Sanitizuje vstup formuláře poznámky; vrátí jen povolené pole. */
    private function validate(array $input): array
    {
        return [
            'obsah' => trim($input['obsah'] ?? ''),
        ];
    }

}