<?php
// app/Models/PoznamkaRepository.php
// Repozitář pro poznámky nástěnky – CRUD a načítání s daty autora a týmu (tabulka poznamky).

namespace App\Models;

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

/**
 * Poskytuje metody pro čtení a zápis poznámek.
 * Admin vidí všechny poznámky; ostatní jen z týmů, jejichž jsou členy.
 */
class PoznamkaRepository extends BaseRepository
{
    public function __construct(Database $db)
    {
        parent::__construct($db, 'poznamky', PoznamkaEntity::class);
    }

    /** Vrátí posledních $limit poznámek pro uživatele dle jeho role. Admin vidí vše. */
    public function getRecentNotesForUser(int $userId, string $role, int $limit = 5): array
    {
        if ($role === 'admin') {
            // admin vidí všechny poznámky
            $stmt = $this->pdo->prepare(
                "SELECT p.*, u.jmeno, u.prijmeni, t.nazev AS tym_nazev
                FROM poznamky p
                JOIN uzivatele u ON u.id = p.uzivatel_id
                JOIN tymy t ON t.id = p.tym_id
                ORDER BY p.datum DESC
                LIMIT :limit"
            );
            $stmt->bindValue(':limit', $limit, \PDO::PARAM_INT);
        } else {
            $stmt = $this->pdo->prepare(
                "SELECT p.*, u.jmeno, u.prijmeni, t.nazev AS tym_nazev
                FROM poznamky p
                JOIN clenove_tymu c ON c.tym_id = p.tym_id
                JOIN uzivatele u ON u.id = p.uzivatel_id
                JOIN tymy t ON t.id = p.tym_id
                WHERE c.uzivatel_id = :uid
                ORDER BY p.datum DESC
                LIMIT :limit"
            );
            $stmt->bindValue(':uid', $userId, \PDO::PARAM_INT);
            $stmt->bindValue(':limit', $limit, \PDO::PARAM_INT);
        }

        $stmt->execute();
        return $stmt->fetchAll();
    }

    /** Vytvoří novou poznámku; autora bere přímo ze $_SESSION. Vrátí ID záznamu. */
    public function create(array $data): int
    {
        $stmt = $this->pdo->prepare(
            "INSERT INTO poznamky (obsah, uzivatel_id, datum)
             VALUES (:obsah, :uzivatel_id, NOW())"
        );

        $stmt->execute([
            'obsah' => $data['obsah'],
            'uzivatel_id' => $_SESSION['user']['id']
        ]);

        return (int)$this->pdo->lastInsertId();
    }

    /** Aktualizuje obsah poznámky. */
    public function update(int $id, array $data): bool
    {
        $stmt = $this->pdo->prepare(
            "UPDATE poznamky SET obsah=:obsah WHERE id=:id"
        );

        return $stmt->execute([
            'obsah' => $data['obsah'],
            'id' => $id
        ]);
    }

    /** Najde poznámku dle ID a přidá jméno autora a název týmu; vrátí null pokud neexistuje. */
    public function findWithUser(int $id): ?array
    {
        $stmt = $this->pdo->prepare(
            "SELECT p.*, u.jmeno, u.prijmeni, t.nazev AS tym_nazev
             FROM poznamky p
             JOIN uzivatele u ON u.id = p.uzivatel_id
             JOIN tymy t ON t.id = p.tym_id
             WHERE p.id = :id LIMIT 1"
        );
        $stmt->execute(['id' => $id]);
        $row = $stmt->fetch(\PDO::FETCH_ASSOC);
        return $row ?: null;
    }

}
