<?php

use MintyPHP\DB;
use MintyPHP\I18n;
use MintyPHP\Router;
use MintyPHP\Service\Access\PermissionService;
use MintyPHP\Service\User\UserServicesFactory;
use MintyPHP\Support\Guard;
use MintyPHP\Support\SearchConfig;

Guard::requireLogin();

$userId = (int) ($_SESSION['user']['id'] ?? 0);
if ($userId > 0) {
    permissionGateway()->getUserPermissions($userId);
}

$query = trim((string) ($_GET['q'] ?? ''));
if ($query === '') {
    Router::json([]);
}

$previewLimit = 5;
$locale = I18n::$locale ?? (I18n::$defaultLocale ?? 'de');
$userTenantRepository = (new UserServicesFactory())->createUserTenantRepository();
$tenantIds = $userId > 0 ? $userTenantRepository->listTenantIdsByUserId($userId) : [];
$tenantScoped = !empty($tenantIds);

$tenantScopeFilters = SearchConfig::tenantScopeFilters();
$resources = SearchConfig::resources($query, $locale);
$results = [];

foreach ($resources as $resource) {
    $key = (string) ($resource['key'] ?? '');
    if ($key === '') {
        continue;
    }

    $tenantFilter = $tenantScopeFilters[$key] ?? '';
    $isTenantScoped = $tenantFilter !== '';
    if ($isTenantScoped && !$tenantScoped) {
        continue;
    }

    $perm = (string) ($resource['permission'] ?? '');
    if ($perm !== '' && !permissionGateway()->userHas($userId, $perm)) {
        continue;
    }

    $countSql = str_replace('{{tenantFilter}}', $isTenantScoped ? $tenantFilter : '', $resource['countSql'] ?? '');
    $countParams = $resource['countParams'] ?? [];
    if ($isTenantScoped && strpos($countSql, '???') !== false) {
        $countParams[] = $tenantIds;
    }
    $count = $countSql !== '' ? (int) DB::selectValue($countSql, ...$countParams) : 0;

    $items = [];
    $previewSql = $resource['previewSql'] ?? null;
    if ($previewSql) {
        $previewSql = str_replace('{{tenantFilter}}', $isTenantScoped ? $tenantFilter : '', $previewSql);
        $previewParams = $resource['previewParams'] ?? [];
        if ($isTenantScoped && strpos($previewSql, '???') !== false) {
            $previewParams[] = $tenantIds;
        }
        $previewParams[] = $previewLimit;
        $rows = DB::select($previewSql, ...$previewParams);
        foreach ($rows as $row) {
            $data = $row;
            if (is_array($row) && count($row) === 1) {
                $data = reset($row);
            }
            $data = is_array($data) ? $data : [];
            $mapped = SearchConfig::mapPreviewItem($key, $data, $query);
            if ($mapped !== null) {
                $items[] = $mapped;
            }
        }
    }

    $result = [
        'key' => $key,
        'label' => $resource['label'] ?? '',
        'count' => $count,
        'url' => SearchConfig::listUrl($key, $query),
        'items' => $items,
    ];
    if ($key === 'pages' && !empty($items[0]['url'])) {
        $result['url'] = $items[0]['url'];
    }
    $results[] = $result;
}

$hotkeyResource = SearchConfig::hotkeyPreviewResource($query);
if ($hotkeyResource !== null) {
    $results[] = $hotkeyResource;
}

if (permissionGateway()->userHas($userId, PermissionService::DOCS_VIEW)) {
    $docsResource = SearchConfig::docsPreviewResource($query);
    if ($docsResource !== null) {
        $results[] = $docsResource;
    }
}

Router::json($results);
