<?php
define('BASEPATH',   dirname(__DIR__));
define('APPPATH',    BASEPATH . '/app');
define('PUBLICPATH', BASEPATH . '/public');

if (session_status() === PHP_SESSION_NONE) session_start();
if (empty($_SESSION['role'])) $_SESSION['role'] = 'public';

function matchRoute(string $pattern, string $uri): array|false {
    $regex = preg_replace('/\/:([^\/]+)/', '/(?P<$1>[^/]+)', $pattern);
    if (preg_match('#^' . $regex . '$#', $uri, $matches)) {
        return array_filter($matches, 'is_string', ARRAY_FILTER_USE_KEY);
    }
    return false;
}

// Router
global $uri, $admin;
$uri = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);
$uri = rtrim($uri, '/') ?: '/';
$admin = false;

if (empty($_SESSION['user_id']))
    $routes = ['/' => '/pages/home.php'];
else
    $routes = ['/' => '/pages/dashboard.php'];

$routes = array_merge($routes, [
    '/contact'                => '/pages/home.php',
    '/contact/sendmail'       => '/include/sendmail.php',
    '/login'                  => '/pages/login.php',
    '/register'               => '/pages/register.php',
    '/password'               => '/member/member_password.php',
    '/password/change'        => '/member/member_password.php',
    '/password/reset'         => '/member/member_password_reset.php',
    '/password/reset/:token'  => '/member/member_password_reset.php',
    '/password/confirm/:token'=> '/member/member_confirm.php',
    '/impress'                => '/pages/impress.php',
    '/datenschutz'            => '/pages/datenschutz.php',

    '/modul'          => '/core/menu_modul.php',
    '/modul/menu'     => '/core/menu_modul.php',
    '/modul/list/:id' => '/core/menu_modul.php',

    '/projekte/list'         => '/module/projekte/projekte_list.php',
    '/projekte/edit'         => '/module/projekte/projekte_edit.php',
    '/projekte/edit/:id'     => '/module/projekte/projekte_edit.php',

    '/leistungen/list'       => '/module/leistungen/leistungen_list.php',
    '/leistungen/neu'        => '/module/leistungen/leistungen_neu.php',
    '/leistungen/edit/:id'   => '/module/leistungen/leistungen_edit.php',
    '/leistungen/import'     => '/module/leistungen/leistungen_import.php',

    '/faktura/list'          => '/module/faktura/faktura_list.php',
    '/faktura/edit'          => '/module/faktura/faktura_edit.php',
    '/faktura/edit/:id'      => '/module/faktura/faktura_edit.php',
    '/faktura/view/:id'      => '/module/faktura/faktura_view.php',

    '/gj/list'               => '/module/buchhaltung/gj_list.php',
    '/gj/edit'               => '/module/buchhaltung/gj_edit.php',
    '/gj/edit/:id'           => '/module/buchhaltung/gj_edit.php',
    '/konten/list'           => '/module/buchhaltung/konten_list.php',
    '/konten/edit'           => '/module/buchhaltung/konten_edit.php',
    '/konten/edit/:id'       => '/module/buchhaltung/konten_edit.php',
    '/buchungen/list'        => '/module/buchhaltung/buchungen_list.php',
    '/buchungen/neu'         => '/module/buchhaltung/buchungen_neu.php',
    '/buchungen/edit/:id'    => '/module/buchhaltung/buchungen_neu.php',
    '/berichte/offene-posten'   => '/module/buchhaltung/offene_posten.php',
    '/berichte/saldenliste'     => '/module/buchhaltung/saldenliste.php',
    '/berichte/guv'             => '/module/buchhaltung/guv.php',
    '/berichte/bilanz'          => '/module/buchhaltung/bilanz.php',
    '/berichte/bilanz-abschluss'=> '/module/buchhaltung/bilanz_abschluss.php',
    '/berichte/kontoauszug'     => '/module/buchhaltung/kontoauszug.php',

    '/personenkonten/list'     => '/module/personenkonten/pk_list.php',
    '/personenkonten/edit'     => '/module/personenkonten/pk_edit.php',
    '/personenkonten/edit/:id' => '/module/personenkonten/pk_edit.php',

]);

$routes_admin = [
    '/admin/list'        => '/admin/admin_list.php',
    '/admin/list/:id'    => '/admin/admin_list.php',

    '/mandanten/list'              => '/admin/mandanten/mandanten_list.php',
    '/mandanten/kontenrahmen'      => '/admin/mandanten/mandanten_kontenrahmen.php',

    '/admin/nummernkreise/list'     => '/admin/nummernkreise/nk_list.php',
    '/admin/nummernkreise/edit'     => '/admin/nummernkreise/nk_edit.php',
    '/admin/nummernkreise/edit/:id' => '/admin/nummernkreise/nk_edit.php',

    '/admin/steuersaetze/list'      => '/admin/steuersaetze/steuer_list.php',
    '/admin/steuersaetze/edit'      => '/admin/steuersaetze/steuer_edit.php',
    '/admin/steuersaetze/edit/:id'  => '/admin/steuersaetze/steuer_edit.php',

    '/user/list'         => '/admin/user/user_list.php',
    '/user/edit'         => '/admin/user/user_edit.php',
    '/user/edit/:id'     => '/admin/user/user_edit.php',

    '/kunden/list'       => '/module/kunden/kunden_list.php',
    '/kunden/edit'       => '/module/kunden/kunden_edit.php',
    '/kunden/edit/:id'   => '/module/kunden/kunden_edit.php',
];

$services = [
    '/logout'              => '/pages/logout.php',
    '/login/submit'        => '/pages/login_submit.php',
    '/register/submit'     => '/pages/register_submit.php',

    '/user/save'           => '/admin/user/user_save.php',
    '/user/delete/:id'     => '/admin/user/user_delete.php',

    '/mandanten/kontenrahmen/save'   => '/admin/mandanten/mandanten_kontenrahmen_save.php',
    '/admin/nummernkreise/save'      => '/admin/nummernkreise/nk_save.php',
    '/admin/steuersaetze/save'       => '/admin/steuersaetze/steuer_save.php',

    '/kunden/save'              => '/module/kunden/kunden_save.php',
    '/kunden/deactivate/:id'    => '/module/kunden/kunden_deactivate.php',
    '/kunden/activate/:id'      => '/module/kunden/kunden_activate.php',

    '/projekte/save'            => '/module/projekte/projekte_save.php',
    '/projekte/deactivate/:id'  => '/module/projekte/projekte_deactivate.php',
    '/projekte/activate/:id'    => '/module/projekte/projekte_activate.php',

    '/leistungen/save'          => '/module/leistungen/leistungen_save.php',
    '/leistungen/delete/:id'    => '/module/leistungen/leistungen_delete.php',
    '/leistungen/import/submit' => '/module/leistungen/leistungen_import_submit.php',

    '/personenkonten/save'     => '/module/personenkonten/pk_save.php',

    '/faktura/save'             => '/module/faktura/faktura_save.php',
    '/faktura/delete/:id'       => '/module/faktura/faktura_delete.php',
    '/faktura/status/:id'       => '/module/faktura/faktura_status.php',
    '/faktura/api_leistungen'   => '/module/faktura/faktura_api_leistungen.php',
    '/leistungen/monatsblatt'   => '/module/leistungen/leistungen_monatsblatt.php',

    '/gj/save'                  => '/module/buchhaltung/gj_save.php',
    '/gj/status/:id'            => '/module/buchhaltung/gj_status.php',
    '/konten/steuer'            => '/module/buchhaltung/konten_steuer.php',
    '/konten/save'              => '/module/buchhaltung/konten_save.php',
    '/konten/delete'            => '/module/buchhaltung/konten_delete.php',
    '/buchungen/save'           => '/module/buchhaltung/buchungen_save.php',
    '/buchungen/delete/:id'     => '/module/buchhaltung/buchungen_delete.php',
    '/buchungen/storno/:id'     => '/module/buchhaltung/buchungen_storno.php',
    '/buchungen/api/konten'       => '/module/buchhaltung/buchungen_api_konten.php',
    '/buchungen/api/belegnummer'  => '/module/buchhaltung/buchungen_api_belegnummer.php',

    '/berichte/bilanz-abschluss/save' => '/module/buchhaltung/bilanz_abschluss_save.php',
    '/berichte/offene-posten-pdf'     => '/module/buchhaltung/offene_posten_pdf.php',
    '/berichte/saldenliste-pdf'  => '/module/buchhaltung/saldenliste_pdf.php',
    '/berichte/guv-pdf'          => '/module/buchhaltung/guv_pdf.php',
    '/berichte/bilanz-pdf'       => '/module/buchhaltung/bilanz_pdf.php',
];

function printPage($file) {
    require_once APPPATH . '/include/header.php';
    if (isset($_SESSION['code'])) {
        switch ($_SESSION['code']) {
            case 0: echo '<div class="alert alert-info mt-4">'    . htmlspecialchars($_SESSION['message'], ENT_QUOTES, 'UTF-8') . '</div>'; break;
            case 1: echo '<div class="alert alert-success mt-4">' . htmlspecialchars($_SESSION['message'], ENT_QUOTES, 'UTF-8') . '</div>'; break;
            case 2: echo '<div class="alert alert-warning mt-4">Warnung: ' . htmlspecialchars($_SESSION['message'], ENT_QUOTES, 'UTF-8') . '</div>'; break;
            case 3: echo '<div class="alert alert-danger mt-4">Fehler: '   . htmlspecialchars($_SESSION['message'], ENT_QUOTES, 'UTF-8') . '</div>'; break;
        }
        $_SESSION['code']    = '';
        $_SESSION['message'] = '';
    }
    require APPPATH . $file;
    require_once APPPATH . '/include/footer.php';
}

foreach ($routes as $pattern => $file) {
    $params = matchRoute($pattern, $uri);
    if ($params !== false) {
        $_GET = array_merge($_GET, $params);
        printPage($file);
        exit;
    }
}

foreach ($routes_admin as $pattern => $file) {
    $params = matchRoute($pattern, $uri);
    if ($params !== false) {
        $admin = true;
        $_GET  = array_merge($_GET, $params);
        printPage($file);
        exit;
    }
}

foreach ($services as $pattern => $file) {
    $params = matchRoute($pattern, $uri);
    if ($params !== false) {
        $_GET = array_merge($_GET, $params);
        require_once APPPATH . '/include/auth.php';
        require APPPATH . $file;
        exit;
    }
}

http_response_code(404);
printPage('/pages/404.php');
?>
