<?php
// app/Models/UdalostRepository.php
// Repozitář pro události/schůzky týmů – načítání dle uživatele, týmu a ID (tabulka udalosti).

namespace App\Models;

use App\Core\Database;
use App\Models\Entities\UdalostEntity;

/**
 * Poskytuje metody pro čtení a zápis událostí.
 * Admin vidí všechny události; ostatní uživatelé jen z týmů, jejichž jsou členy.
 */
class UdalostRepository extends BaseRepository
{
    public function __construct(Database $db)
    {
        parent::__construct($db, 'udalosti', UdalostEntity::class);
    }

    /** Vrátí nadcházející události (od teď) pro uživatele podle jeho role. Admin vidí vše. */
    public function getNextEventsForUser(int $userId, string $role, int $limit = 5): array
    {
        if ($role === 'admin') {
            // admin vidí všechny nadcházející události
            $stmt = $this->pdo->prepare(
                "SELECT 
                    u.id,
                    u.typ,
                    u.misto,
                    u.datum,
                    u.popis,
                    t.nazev AS tym_nazev
                FROM udalosti u
                JOIN tymy t ON t.id = u.tym_id
                WHERE u.datum >= NOW()
                ORDER BY u.datum ASC
                LIMIT :limit"
            );
            $stmt->bindValue(':limit', $limit, \PDO::PARAM_INT);
        } else {
            // běžný uživatel – jen týmy, kde je členem
            $stmt = $this->pdo->prepare(
                "SELECT 
                    u.id,
                    u.typ,
                    u.misto,
                    u.datum,
                    u.popis,
                    t.nazev AS tym_nazev
                FROM udalosti u
                JOIN tymy t ON t.id = u.tym_id
                JOIN clenove_tymu c ON c.tym_id = t.id
                WHERE c.uzivatel_id = :uid
                AND u.datum >= NOW()
                ORDER BY u.datum ASC
                LIMIT :limit"
            );
            $stmt->bindValue(':uid', $userId, \PDO::PARAM_INT);
            $stmt->bindValue(':limit', $limit, \PDO::PARAM_INT);
        }

        $stmt->execute();
        return $stmt->fetchAll(\PDO::FETCH_ASSOC);
    }

    /** Vrátí všechny události (minulé i budoucí) pro uživatele dle jeho role. */
    public function getAllEventsForUser(int $userId, string $role): array
    {
        if ($role === 'admin') {
            $stmt = $this->pdo->query(
                "SELECT 
                    u.id, u.typ, u.misto, u.datum, u.popis,
                    t.nazev AS tym_nazev
                FROM udalosti u
                JOIN tymy t ON t.id = u.tym_id
                ORDER BY u.datum DESC"
            );
        } else {
            $stmt = $this->pdo->prepare(
                "SELECT 
                    u.id, u.typ, u.misto, u.datum, u.popis,
                    t.nazev AS tym_nazev
                FROM udalosti u
                JOIN tymy t ON t.id = u.tym_id
                JOIN clenove_tymu c ON c.tym_id = t.id
                WHERE c.uzivatel_id = :uid
                ORDER BY u.datum DESC"
            );
            $stmt->bindValue(':uid', $userId, \PDO::PARAM_INT);
            $stmt->execute();
        }

        return $stmt->fetchAll(\PDO::FETCH_ASSOC);
    }

    /** Najde událost dle ID a přidá k ní název týmu (tym_nazev); vrátí null pokud neexistuje. */
    public function findWithTeam(int $id): ?array
    {
        $stmt = $this->pdo->prepare(
            "SELECT u.*, t.nazev AS tym_nazev
             FROM udalosti u
             JOIN tymy t ON t.id = u.tym_id
             WHERE u.id = :id LIMIT 1"
        );
        $stmt->execute(['id' => $id]);
        $row = $stmt->fetch(\PDO::FETCH_ASSOC);
        return $row ?: null;
    }

    /** Aktualizuje libovolné sloupce události podle předaného pole $data. */
    public function update(int $id, array $data): bool
    {
        $columns = array_keys($data);
        $placeholders = array_map(fn($c) => "$c = :" . $c, $columns);

        $sql = sprintf(
            "UPDATE %s SET %s WHERE id = :id",
            $this->table,
            implode(', ', $placeholders)
        );

        $stmt = $this->pdo->prepare($sql);
        $stmt->bindValue(':id', $id);

        foreach ($data as $key => $value) {
            $stmt->bindValue(':' . $key, $value);
        }

        return $stmt->execute();
    }

    // vrátí všechny události pro tým podle tym_id
    public function getEventsForTeam(int $teamId): array
    {
        $stmt = $this->pdo->prepare(
            "SELECT * FROM udalosti WHERE tym_id = :teamId ORDER BY datum DESC"
        );
        $stmt->execute(['teamId' => $teamId]);
        return $stmt->fetchAll(\PDO::FETCH_ASSOC);
    }
}
