<?php
require_once __DIR__ . '/app/bootstrap.php';

function avatar_response_error(int $statusCode): void
{
    http_response_code($statusCode);
    header('Content-Type: text/plain; charset=UTF-8');
    header('Cache-Control: private, no-store, no-cache, must-revalidate, max-age=0');
    header('Pragma: no-cache');
    header('Expires: 0');
    header('X-Content-Type-Options: nosniff');
    header('Cross-Origin-Resource-Policy: same-origin');

    $messages = [
        401 => 'Pristup zahteva prijavu.',
        403 => 'Pristup avataru nije dozvoljen.',
        404 => 'Avatar nije pronađen.',
        405 => 'HTTP metoda nije dozvoljena.',
    ];
    echo $messages[$statusCode] ?? 'Zahtev nije moguće obraditi.';
    exit;
}

$method = strtoupper((string)($_SERVER['REQUEST_METHOD'] ?? 'GET'));
if (!in_array($method, ['GET', 'HEAD'], true)) {
    header('Allow: GET, HEAD');
    avatar_response_error(405);
}

// Autentifikacija se proverava pre obrade identifikatora kako anonimni zahtev
// ne bi dobio informaciju o postojanju korisnika ili avatar fajla.
$authenticatedUser = current_user();
if (!$authenticatedUser) {
    avatar_response_error(401);
}

$loggedInUserId = (int)($authenticatedUser['id'] ?? 0);
$sessionUserId = (int)($_SESSION['user_id'] ?? 0);
if ($loggedInUserId <= 0 || $sessionUserId !== $loggedInUserId) {
    avatar_response_error(401);
}

// Nije dozvoljen PATH_INFO niti bilo koji query parametar osim jednog
// strogo numeričkog user_id parametra. Bez parametra se servira sopstveni avatar.
if ((string)($_SERVER['PATH_INFO'] ?? '') !== '') {
    avatar_response_error(403);
}

$requestedUserId = $loggedInUserId;
$rawQuery = (string)($_SERVER['QUERY_STRING'] ?? '');
if ($rawQuery !== '') {
    if (preg_match('/\Auser_id=([1-9][0-9]{0,9})\z/D', $rawQuery, $matches) !== 1
        || count($_GET) !== 1
        || !array_key_exists('user_id', $_GET)
        || is_array($_GET['user_id'])) {
        avatar_response_error(403);
    }

    $requestedUserId = (int)$matches[1];
    if ($requestedUserId <= 0 || $requestedUserId > 4294967295) {
        avatar_response_error(403);
    }
}

// SEC-AVATAR-RBAC-ACCESS-CONTROL:
// - običan korisnik može da traži samo sopstveni ID;
// - sistemski administrator može da traži avatar bilo kog korisnika;
// - administratorsko pravo se dobija iz current_user(), odnosno iz baze.
if (!can_view_user_avatar($authenticatedUser, $requestedUserId)) {
    avatar_response_error(403);
}

try {
    $avatarStmt = db()->prepare('SELECT id, profile_photo FROM users WHERE id = ? LIMIT 1');
    $avatarStmt->execute([$requestedUserId]);
    $avatarOwner = $avatarStmt->fetch();
} catch (Throwable $e) {
    // Ne izlažemo SQL ili infrastrukturne detalje korisniku.
    avatar_response_error(404);
}

if (!$avatarOwner) {
    avatar_response_error(404);
}

$avatarInfo = profile_photo_file_info((string)($avatarOwner['profile_photo'] ?? ''));
if ($avatarInfo === null) {
    avatar_response_error(404);
}

$handle = @fopen($avatarInfo['path'], 'rb');
if ($handle === false) {
    avatar_response_error(404);
}

header_remove('Expires');
header('Content-Type: ' . $avatarInfo['mime']);
header('Content-Length: ' . (int)$avatarInfo['size']);
header('Content-Disposition: inline');
header('Cache-Control: private, no-store, no-cache, must-revalidate, max-age=0');
header('Pragma: no-cache');
header('Expires: 0');
header('X-Content-Type-Options: nosniff');
header('Cross-Origin-Resource-Policy: same-origin');

if ($method === 'HEAD') {
    fclose($handle);
    exit;
}

fpassthru($handle);
fclose($handle);
exit;
