<?php
// app/Core/Auth.php
// Statická třída pro správu autentizace – přihlášení, odhlášení, flash zprávy a kontrola oprávnění.

namespace App\Core;

/**
 * Poskytuje statické metody pro práci se session a oprávněními.
 * Nevytváří se jako instance – vše se volá jako Auth::metoda().
 */
class Auth
{
    // Vrátí true, pokud je uživatel přihlášen (session obsahuje 'user')
    public static function check(): bool
    {
        return isset($_SESSION['user']);
    }

    // Vrátí data přihlášeného uživatele, nebo null pokud není přihlášen
    public static function user(): ?array
    {
        return $_SESSION['user'] ?? null;
    }

    // Uloží data uživatele do session – volá se po úspěšném přihlášení
    public static function login(array $user): void
    {
        $_SESSION['user'] = $user;
    }

    // Zničí session a přesměruje na přihlašovací stránku
    public static function logout(): void
    {
        session_destroy();
        header('Location: ' . BASE_URL . '/auth/login');
        exit;
    }

    // Pokud uživatel není přihlášen, uloží cílovou URL a přesměruje na login
    public static function requireLogin(): void
    {
        if (!self::check()) {
            $_SESSION['redirect_after_login'] = $_SERVER['REQUEST_URI'];
            header('Location: ' . BASE_URL . '/auth/login');
            exit;
        }
    }

    /**
     * Nastaví flash zprávu
     */
    public static function setFlash(string $type, string $message): void
    {
        $_SESSION['flash'] = [
            'type' => $type,
            'message' => $message
        ];
    }

    /**
     * Vrátí flash zprávu a smaže ji
     */
    public static function getFlash(): ?array
    {
        $flash = $_SESSION['flash'] ?? null;
        if ($flash) {
            unset($_SESSION['flash']);
        }
        return $flash;
    }   

    /**
     * Zkontroluje, zda má přihlášený uživatel právo upravit daný záznam.
     * Admin může upravit cokoliv, ostatní jen své vlastní záznamy (porovnání uzivatel_id).
     */
    public static function muzeUpravit($record): bool
    {
        $user = self::user();

        if (!$user) {
            return false;
        }

        if ($user['role'] === 'admin') {
            return true;
        }

        // Převede objekt na pole, aby fungoval přístup přes ['uzivatel_id']
        $recordArray = is_array($record) ? $record : (array) $record;

        return isset($recordArray['uzivatel_id']) && (int)$recordArray['uzivatel_id'] === (int)$user['id'];
    }

}
