<?php

abstract class Controller {
    /**
     * Render view template with optional layout wrapper
     */
    protected function render(string $view, array $data = [], string $layout = 'header'): void {
        extract($data);

        // Global variables for views
        $csrf_token = Session::getCsrfToken();
        $currentUser = Auth::user();
        $sellerProfile = Auth::sellerProfile();

        $viewFile = SITE_ROOT . "/app/Views/{$view}.php";
        if (!file_exists($viewFile)) {
            die("View file not found: {$viewFile}");
        }

        // Standard layout includes header, view, footer
        if ($layout === 'header' || $layout === 'main') {
            require_once SITE_ROOT . "/app/Views/layouts/header.php";
            require_once SITE_ROOT . "/app/Views/layouts/navbar.php";
            require_once $viewFile;
            require_once SITE_ROOT . "/app/Views/layouts/footer.php";
        } elseif ($layout === 'seller') {
            require_once SITE_ROOT . "/app/Views/layouts/seller_header.php";
            require_once $viewFile;
            require_once SITE_ROOT . "/app/Views/layouts/seller_footer.php";
        } elseif ($layout === 'admin') {
            require_once SITE_ROOT . "/app/Views/layouts/admin_header.php";
            require_once $viewFile;
            require_once SITE_ROOT . "/app/Views/layouts/admin_footer.php";
        } else {
            require_once $viewFile;
        }
    }

    /**
     * Send JSON response
     */
    protected function json(array $data, int $statusCode = 200): void {
        // Discard any previous output buffer (e.g. notices/whitespace)
        if (ob_get_level() > 0) {
            ob_clean();
        }
        http_response_code($statusCode);
        header('Content-Type: application/json; charset=utf-8');
        echo json_encode($data, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);
        exit;
    }

    /**
     * Redirect to relative path
     */
    protected function redirect(string $path): void {
        header("Location: " . APP_URL . '/' . ltrim($path, '/'));
        exit;
    }

    /**
     * Validate CSRF token from POST request
     */
    protected function validateCsrf(): void {
        $token = $_POST['csrf_token'] ?? $_SERVER['HTTP_X_CSRF_TOKEN'] ?? null;
        if (!Session::validateCsrfToken($token)) {
            if ($this->isAjax()) {
                $this->json(['status' => 'error', 'message' => 'CSRF Token Mismatch'], 403);
            } else {
                Session::setFlash('danger', 'Invalid security token. Please try again.');
                $this->redirect('');
            }
        }
    }

    protected function isAjax(): bool {
        return !empty($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) === 'xmlhttprequest';
    }
}
