<?php
/**
 * Bazowy kontroler
 */

abstract class BaseController
{
    protected Smarty $smarty;
    protected Auth $auth;
    protected Logger $logger;
    protected ?array $currentUser;

    public function __construct()
    {
        $this->smarty = initSmarty();
        $this->auth = new Auth();
        $this->logger = new Logger();
        $this->currentUser = $this->auth->user();
        
        // Przekaż flash message do szablonu
        $this->smarty->assign('flash', getFlash());
    }

    /**
     * Renderuj szablon
     */
    protected function render(string $template, array $data = []): void
    {
        foreach ($data as $key => $value) {
            $this->smarty->assign($key, $value);
        }
        
        $this->smarty->display($template);
    }

    /**
     * Odpowiedź JSON
     */
    protected function json(array $data, int $code = 200): void
    {
        jsonResponse($data, $code);
    }

    /**
     * Przekieruj
     */
    protected function redirect(string $path = '', ?string $flashType = null, ?string $flashMessage = null): void
    {
        if ($flashType && $flashMessage) {
            setFlash($flashType, $flashMessage);
        }
        redirect($path);
    }

    /**
     * Weryfikuj CSRF token
     */
    protected function verifyCsrf(): bool
    {
        $token = $_POST['csrf_token'] ?? $_SERVER['HTTP_X_CSRF_TOKEN'] ?? null;
        
        if (!$this->auth->verifyCsrfToken($token)) {
            if (isAjax()) {
                $this->json(['success' => false, 'error' => 'Nieprawidłowy token CSRF.'], 403);
            } else {
                $this->redirect('', 'danger', 'Nieprawidłowy token CSRF. Spróbuj ponownie.');
            }
            return false;
        }
        
        return true;
    }

    /**
     * Sprawdź czy użytkownik ma dostęp do zasobu
     */
    protected function canAccess(int $ownerId): bool
    {
        if ($this->auth->isAdmin()) {
            return true;
        }
        
        // Reseller ma dostęp do zasobów swoich użytkowników
        if ($this->auth->isReseller()) {
            $userModel = new User();
            $visibleUserIds = $userModel->getVisibleUserIds($this->currentUser);
            return in_array($ownerId, $visibleUserIds);
        }
        
        return $this->currentUser && $this->currentUser['id'] === $ownerId;
    }
}
