<?php
/**
 * Hilfsfunktionen rund um die Suchergebnisse.
 *
 * Werden sowohl von content/search-results.php (No-JS-Rendering)
 * als auch von php/controller/search-results-data.php (JSON für
 * die JS-Hydration) genutzt, damit Sortier-/Filterlogik nur an
 * einer Stelle gepflegt werden muss
 */

function getLikeCount($item): int
{
    if (isset($item['likes']) && is_array($item['likes'])) {
        return count($item['likes']);
    }
    return (int)($item['likes'] ?? 0);
}

/**
 * Sortiert die Ergebnisse
 */
function sortSearchResults(array $results, string $sortStyle): array
{
    switch ($sortStyle) {
        case 'likes':
            usort($results, function ($a, $b) {
                return getLikeCount($b) <=> getLikeCount($a);
            });
            break;
        case 'newest':
            usort($results, function ($a, $b) {
                return strcmp($b['creationDate'] ?? '', $a['creationDate'] ?? '');
            });
            break;
        case 'oldest':
            usort($results, function ($a, $b) {
                return strcmp($a['creationDate'] ?? '', $b['creationDate'] ?? '');
            });
            break;
        case 'alphabet':
        default:
            usort($results, function ($a, $b) {
                return strcasecmp($a['title'] ?? '', $b['title'] ?? '');
            });
            break;
    }
    return $results;
}

/**
 * Filtert die Ergebnisse ('all' = kein Filter).
 */
function filterSearchResultsByCategory(array $results, string $category): array
{
    $category = strtolower(trim($category));
    if ($category === '' || $category === 'all') {
        return $results;
    }
    return array_values(array_filter($results, function ($item) use ($category) {
        return strtolower($item['category'] ?? '') === $category;
    }));
}

/**
 * Baut eine Such-Ergebnis-URL für einen bestimmten Seitenwechsel (No-JS-Pagination).
 */
function buildSearchResultsUrl(int $page, string $query, string $sort, string $category, int $limit): string
{
    return "index.php?pfad=search-results"
        . "&q=" . urlencode($query)
        . "&sort=" . urlencode($sort)
        . "&category=" . urlencode($category)
        . "&limit=" . $limit
        . "&page=" . $page;
}

/**
 * Rendert eine rein serverseitige Pagination für den No-JS-Fall:
 */
function renderNoJsPagination(int $currentPage, int $totalPages, string $query, string $sort, string $category, int $limit): string
{
    $html = '';

    if ($currentPage > 1) {
        $html .= '<a class="s-res-page-btn" href="' . htmlspecialchars(buildSearchResultsUrl($currentPage - 1, $query, $sort, $category, $limit)) . '">&laquo;</a> ';
    } else {
        $html .= '<span class="s-res-page-btn" aria-disabled="true">&laquo;</span> ';
    }

    for ($i = 1; $i <= $totalPages; $i++) {
        if ($i === $currentPage) {
            $html .= '<span class="s-res-page-btn s-res-page-btn-active">' . $i . '</span> ';
        } else {
            $html .= '<a class="s-res-page-btn" href="' . htmlspecialchars(buildSearchResultsUrl($i, $query, $sort, $category, $limit)) . '">' . $i . '</a> ';
        }
    }

    if ($currentPage < $totalPages) {
        $html .= '<a class="s-res-page-btn" href="' . htmlspecialchars(buildSearchResultsUrl($currentPage + 1, $query, $sort, $category, $limit)) . '">&raquo;</a>';
    } else {
        $html .= '<span class="s-res-page-btn" aria-disabled="true">&raquo;</span>';
    }

    return $html;
}


/**
 * Filtert Ergebnisse anhand eines Suchbegriffs
 *
 * Wird von content/showCategory.php genutzt, um innerhalb einer bereits
 * geladenen Kategorie zu suchen.
 */
function filterResultsByQuery(array $results, string $query): array
{
    $query = trim($query);
    if ($query === '') {
        return $results;
    }
    $needle = mb_strtolower($query);
    return array_values(array_filter($results, function ($item) use ($needle) {
        $haystack = mb_strtolower(($item['title'] ?? '') . ' ' . ($item['content'] ?? ''));
        return mb_strpos($haystack, $needle) !== false;
    }));
}

/**
 * Baut eine Kategorie-URL für einen bestimmten Seitenwechsel (No-JS-Pagination).
 * Analog zu buildSearchResultsUrl, aber für pfad=showCategory (feste Kategorie,
 * dafür mit Freitext-Suche innerhalb der Kategorie statt Kategorie-Filter).
 */
function buildCategoryUrl(int $page, string $category, string $sort, string $query, int $limit): string
{
    return "index.php?pfad=showCategory"
        . "&category=" . urlencode($category)
        . "&sort=" . urlencode($sort)
        . "&q=" . urlencode($query)
        . "&limit=" . $limit
        . "&page=" . $page;
}

/**
 * Rendert eine rein serverseitige Pagination für showCategory (No-JS-Fall).
 * Analog zu renderNoJsPagination.
 */
function renderNoJsPaginationCategory(int $currentPage, int $totalPages, string $category, string $sort, string $query, int $limit): string
{
    $html = '';

    if ($currentPage > 1) {
        $html .= '<a class="s-res-page-btn" href="' . htmlspecialchars(buildCategoryUrl($currentPage - 1, $category, $sort, $query, $limit)) . '">&laquo;</a> ';
    } else {
        $html .= '<span class="s-res-page-btn" aria-disabled="true">&laquo;</span> ';
    }

    for ($i = 1; $i <= $totalPages; $i++) {
        if ($i === $currentPage) {
            $html .= '<span class="s-res-page-btn s-res-page-btn-active">' . $i . '</span> ';
        } else {
            $html .= '<a class="s-res-page-btn" href="' . htmlspecialchars(buildCategoryUrl($i, $category, $sort, $query, $limit)) . '">' . $i . '</a> ';
        }
    }

    if ($currentPage < $totalPages) {
        $html .= '<a class="s-res-page-btn" href="' . htmlspecialchars(buildCategoryUrl($currentPage + 1, $category, $sort, $query, $limit)) . '">&raquo;</a>';
    } else {
        $html .= '<span class="s-res-page-btn" aria-disabled="true">&raquo;</span>';
    }

    return $html;
}