<?php

declare(strict_types=1);

require_once __DIR__ . '/app/bootstrap.php';
require_once __DIR__ . '/app/pages.php';
require_once __DIR__ . '/app/actions.php';

$route = (string)($_GET['r'] ?? '');
$method = $_SERVER['REQUEST_METHOD'] ?? 'GET';

if ($route === '') {
    redirect(route_url(is_logged_in() ? 'vehicles' : 'login'));
}
if ($method === 'POST') {
    if ((int)($_SERVER['CONTENT_LENGTH'] ?? 0) > 0 && empty($_POST) && empty($_FILES)) {
        http_response_code(413);
        render('Prevelik zahtev', '<section class="card empty"><h1>Fajlovi su preveliki</h1><p>Ukupna veličina prelazi ograničenje hostinga. Pošaljite manje fajlova odjednom.</p>' . link_button('Nazad na vozila', route_url('vehicles'), 'back') . '</section>');
        exit;
    }
    require_csrf();
}

if ($route === 'login') {
    if (is_logged_in()) {
        redirect(route_url('vehicles'));
    }
    $error = '';
    $restored = isset($_GET['restored']) ? '<div class="notice success" role="status">Backup je uspešno vraćen. Prijavite se ponovo.</div>' : '';
    if ($method === 'POST') {
        $username = trim((string)($_POST['username'] ?? ''));
        if (login_attempt($username, (string)($_POST['password'] ?? ''))) {
            redirect(route_url('vehicles'));
        }
        http_response_code(422);
        $error = '<div class="notice error" role="alert">Korisničko ime ili lozinka nisu ispravni.</div>';
    }
    $body = '<section class="card login"><span class="brand-mark">' . icon('car') . '</span><p class="eyebrow">Dobro došli u svoju garažu</p><h1>Prijavite se</h1><p class="subtitle">Vaša vozila i njihova istorija čekaju vas.</p>' . $restored . $error
        . '<form method="post" action="' . h(route_url('login')) . '">' . csrf_field()
        . field('username', 'Korisničko ime', $_POST['username'] ?? '', 'text', 'required autocomplete="username"')
        . field('password', 'Lozinka', '', 'password', 'required autocomplete="current-password"')
        . '<button class="btn primary" type="submit">Prijavi se ' . icon('arrow') . '</button></form></section>';
    render('Prijava', $body);
    exit;
}

require_login();

try {
    if ($method === 'POST') {
        try {
            handle_action($route);
        } catch (InvalidArgumentException $error) {
            http_response_code(422);
            flash($error->getMessage(), 'error');
            render('Proverite podatke', action_error_page($route));
            exit;
        }
    }
    if ($method !== 'GET') {
        http_response_code(405);
        header('Allow: GET, POST');
        exit;
    }
    $id = (int)($_GET['id'] ?? 0);
    switch ($route) {
        case 'vehicles':
            render('Moja vozila', vehicles_page());
            break;
        case 'vehicle':
            render('Istorija servisa', vehicle_page(required_vehicle($id)));
            break;
        case 'reminders':
            render('Podsetnici', reminders_page((int)($_GET['vehicle_id'] ?? 0), (int)($_GET['edit'] ?? 0)));
            break;
        case 'backup':
            render('Backup i vraćanje', backup_page());
            break;
        case 'vehicle_edit':
            render('Izmeni vozilo', edit_vehicle_page(required_vehicle($id)));
            break;
        case 'service_edit':
            $service = required_service($id);
            render('Izmeni servis', edit_service_page(required_vehicle((int)$service['vehicle_id']), $service));
            break;
        case 'vehicle_files':
            $vehicle = required_vehicle($id);
            render('Dokumenta vozila', files_page('vehicle', $vehicle, $vehicle));
            break;
        case 'service_files':
            $service = required_service($id);
            render('Fotografije i računi', files_page('service', $service, required_vehicle((int)$service['vehicle_id'])));
            break;
        case 'file':
            serve_attachment();
        case 'password':
            render('Promena lozinke', password_page());
            break;
        case 'vehicle_booklet_pdf':
        case 'service_pdf':
            $service = $route === 'service_pdf' ? required_service($id) : null;
            $vehicle = required_vehicle($service ? (int)$service['vehicle_id'] : $id);
            $services = $service ? [$service] : vehicle_services((int)$vehicle['id']);
            $attachments = service_attachments((int)$vehicle['id']);
            session_write_close();
            require_once __DIR__ . '/app/pdf.php';
            try {
                $pdf = build_booklet($vehicle, $services, $attachments);
            } catch (RuntimeException $error) {
                http_response_code(422);
                render('PDF nije napravljen', '<section class="card empty"><h1>Knjižica nije preuzeta</h1><p>' . h($error->getMessage()) . '</p><p>Nijedan prilog nije izostavljen. Ispravite problem i ponovite izvoz.</p>' . link_button('Nazad na servise', route_url('vehicle', ['id' => $vehicle['id']]), 'back') . '</section>');
                exit;
            }
            header('Content-Type: application/pdf');
            header('Content-Disposition: attachment; filename="servisna-knjizica-' . (int)$vehicle['id'] . ($service ? '-servis-' . $id : '') . '.pdf"');
            header('Content-Length: ' . strlen($pdf));
            echo $pdf;
            break;
        default:
            if (in_array($route, ['logout', 'vehicle_add', 'vehicle_update', 'vehicle_delete', 'service_add', 'service_update', 'service_delete', 'service_image_delete', 'vehicle_file_delete', 'reminder_add', 'maintenance_reminder_add', 'maintenance_reminder_update', 'maintenance_reminder_complete', 'maintenance_reminder_reopen', 'maintenance_reminder_delete', 'backup_download', 'backup_restore'], true)) {
                http_response_code(405);
                header('Allow: POST');
                render('Nedozvoljen zahtev', '<section class="card empty"><h1>Ova akcija zahteva slanje forme.</h1>' . link_button('Nazad na vozila', route_url('vehicles'), 'back') . '</section>');
                break;
            }
            throw new OutOfBoundsException('Stranica ne postoji.');
    }
} catch (OutOfBoundsException $error) {
    http_response_code(404);
    render('Nije pronađeno', '<section class="card empty"><h1>' . h($error->getMessage()) . '</h1>' . link_button('Nazad na vozila', route_url('vehicles'), 'back') . '</section>');
} catch (Throwable $error) {
    error_log((string)$error);
    http_response_code(500);
    render('Greška', '<section class="card empty"><h1>Promena nije završena</h1><p>Došlo je do greške. Proverite evidenciju pre ponovnog pokušaja.</p>' . link_button('Nazad na vozila', route_url('vehicles'), 'back') . '</section>');
}
