<?php
$configPath = dirname(__DIR__) . '/config.php';
if (!file_exists($configPath)) {
    http_response_code(500);
    exit('Nedostaje config.php. Kopirajte config.example.php u config.php i podesite bazu.');
}

require_once $configPath;
require_once __DIR__ . '/request.php';

// Kada zahtev premaši PHP post_max_size, PHP odbaci i POST polja i fajlove.
// Vraćamo jasnu poruku umesto zbunjujuće CSRF greške.
if (strtoupper($_SERVER['REQUEST_METHOD'] ?? 'GET') === 'POST'
    && (int)($_SERVER['CONTENT_LENGTH'] ?? 0) > 0
    && empty($_POST)
    && empty($_FILES)) {
    http_response_code(413);
    exit('Zahtev je veći od dozvoljenog PHP post_max_size limita. Povećajte post_max_size ili izaberite manje priloge.');
}

date_default_timezone_set(defined('APP_TIMEZONE') ? APP_TIMEZONE : 'Europe/Belgrade');
mb_internal_encoding('UTF-8');

$isHttps = request_is_https();
$secureSessionCookie = request_should_use_secure_cookie();
$sessionIniOptions = [
    'session.use_strict_mode' => '1',
    'session.use_only_cookies' => '1',
    'session.use_trans_sid' => '0',
];
foreach ($sessionIniOptions as $option => $value) {
    ini_set($option, $value);
}
$cookieParams = session_get_cookie_params();
session_name(defined('SESSION_NAME') ? SESSION_NAME : 'sos_tiketing_session');
session_set_cookie_params([
    'lifetime' => 0,
    'path' => $cookieParams['path'] ?: '/',
    // Host-only cookie: ne nasleđujemo domen starog hostinga iz php.ini.
    'domain' => '',
    'secure' => $secureSessionCookie,
    'httponly' => true,
    'samesite' => 'Lax',
]);

if (session_status() !== PHP_SESSION_ACTIVE) {
    session_start();
}

require_once __DIR__ . '/session.php';

// Serverska sesija se ne produžava običnim HTTP/AJAX zahtevima. Produženje je
// dozvoljeno samo kroz eksplicitne, CSRF-zaštićene rute pokrenute stvarnom
// aktivnošću korisnika. Svaki zahtev ipak nezavisno proverava krajnji rok.
if (authenticated_session_exists()) {
    if (session_last_user_activity_at() <= 0) {
        mark_authenticated_user_activity();
    }
    if (session_started_at() <= 0) {
        $_SESSION['session_started_at'] = (int)round(microtime(true) * 1000);
    }

    if (authenticated_session_has_expired()) {
        invalidate_current_session();
        start_clean_anonymous_session();
        queue_session_expired_notice();
    } elseif (request_represents_user_navigation()) {
        // Stvarna navigacija ili klasično slanje forme računa se kao aktivnost.
        // XHR/fetch, polling, prefetch, slike i drugi background zahtevi su isključeni.
        mark_authenticated_user_activity();
    }
}

if (!headers_sent()) {
    header('Cache-Control: no-store, no-cache, must-revalidate, max-age=0');
    header('Pragma: no-cache');
    header('X-Content-Type-Options: nosniff');
    header('X-Frame-Options: DENY');
    header('Referrer-Policy: strict-origin-when-cross-origin');
    header("Permissions-Policy: geolocation=(), microphone=(), camera=()");
    header("Content-Security-Policy: default-src 'self'; img-src 'self' data:; style-src 'self'; script-src 'self'; connect-src 'self'; object-src 'none'; base-uri 'self'; form-action 'self'; frame-ancestors 'none'");
    if ($isHttps) {
        header('Strict-Transport-Security: max-age=31536000');
    }
}

require_once __DIR__ . '/db.php';
require_once __DIR__ . '/functions.php';
require_once __DIR__ . '/security.php';
require_once __DIR__ . '/auth.php';
require_once __DIR__ . '/entra.php';

// Korisnik označen za obaveznu promenu lozinke nema pristup ostatku sistema.
if (!empty($_SESSION['user_id'])) {
    $currentScript = basename((string)($_SERVER['SCRIPT_NAME'] ?? ''));
    $forcedPasswordAllowedPages = ['password_change_required.php', 'logout.php', 'serve_avatar.php', 'session_activity.php', 'session_extend.php'];
    if (!in_array($currentScript, $forcedPasswordAllowedPages, true)) {
        $sessionUser = current_user();
        if ($sessionUser && (int)($sessionUser['must_change_password'] ?? 0) === 1) {
            redirect('password_change_required.php');
        }
    }
}
