includes/dashboard/_init.php

<?php
declare(strict_types=1);

/*
|--------------------------------------------------------------------------
| Search engines
|--------------------------------------------------------------------------
|
| Move along, bots. Nothing to index here.
|
*/

header('X-Robots-Tag: noindex, nofollow, noarchive, nosnippet');


/*
|--------------------------------------------------------------------------
| Dashboard bootstrap
|--------------------------------------------------------------------------
*/

$db = brivaciaDb();
$day = $_GET['day'] ?? date('Y-m-d');
$showCountries = brivacia_setting('privacy.country_provider', 'none') !== 'none';

/*
|--------------------------------------------------------------------------
| Date range
|--------------------------------------------------------------------------
*/

$view = $_GET['view'] ?? 'today';

$allowedViews = ['today', 'week', 'month', 'year', 'all'];

if (!in_array($view, $allowedViews, true)) {
    $view = 'today';
}

$day = $_GET['day'] ?? date('Y-m-d');
$week = $_GET['week'] ?? date('o-\WW');
$month = $_GET['month'] ?? date('Y-m');
$year = $_GET['year'] ?? date('Y');
$year = substr($year, 0, 4);

$periodInputName = 'day';
$periodInputType = 'date';
$periodInputValue = $day;
$periodLabel = $day;
$rangeStart = $day;
$rangeEnd = $day;

switch ($view) {
    case 'today':
        $rangeSql = 'day = ?';
        $rangeParams = [$day];
        break;

    case 'week':
        $weekStart = date('Y-m-d', strtotime($week));
        $weekEnd = date('Y-m-d', strtotime($weekStart . ' +6 days'));

        $rangeSql = 'day BETWEEN ? AND ?';
        $rangeParams = [$weekStart, $weekEnd];
        $rangeStart = $weekStart;
        $rangeEnd = $weekEnd;

        $periodInputName = 'week';
        $periodInputType = 'week';
        $periodInputValue = $week;
        $periodLabel = $week;
        break;

    case 'month':
        $rangeSql = 'day BETWEEN ? AND ?';
        $rangeParams = [
            $month . '-01',
            date('Y-m-t', strtotime($month . '-01')),
        ];
        $rangeStart = $rangeParams[0];
        $rangeEnd = $rangeParams[1];

        $periodInputName = 'month';
        $periodInputType = 'month';
        $periodInputValue = $month;
        $periodLabel = $month;
        break;

    case 'year':
        $rangeSql = 'day BETWEEN ? AND ?';
        $rangeParams = [
            $year . '-01-01',
            $year . '-12-31',
        ];
        $rangeStart = $rangeParams[0];
        $rangeEnd = $rangeParams[1];

        $periodInputType = 'month';
        $periodInputValue = $year . '-01';
        $periodLabel = $periodIosInputValue = $year;
        $periodIosInputType = 'number';
        $periodIosInputValue = $periodLabel;
        break;

    case 'all':
        $rangeSql = '1 = 1';
        $rangeParams = [];
        $rangeStart = null;
        $rangeEnd = null;

        $periodInputName = '';
        $periodInputType = '';
        $periodInputValue = '';
        $periodLabel = t('form.all');
        break;
}


/*
|--------------------------------------------------------------------------
| Site filter
|--------------------------------------------------------------------------
*/

if ($currentSite !== '' && isset(brivacia_sites()[$currentSite])) {
    $rangeSql .= ' AND site = ?';
    $rangeParams[] = $currentSite;
} else {
    $currentSite = '';
}


/*
|--------------------------------------------------------------------------
| Local helpers
|--------------------------------------------------------------------------
*/

function one(PDO $db, string $sql, array $params = []): array {
    return fetchAll($db, $sql, $params)[0] ?? [];
}

function dashboardRangeNeedsArchives(?string $start, ?string $end): bool {
    if ($start === null || $end === null) {
        return true;
    }

    return $start < date('Y') . '-01-01';
}

$includeArchives = dashboardRangeNeedsArchives($rangeStart, $rangeEnd);

function dashboardViewUrl(string $view, string $day, string $week, string $month, string $year, array $extra = []): string {
    $params = ['view' => $view];

    if (($extra['site'] ?? '') !== '') {
        $params['site'] = $extra['site'];
    }

    match ($view) {
        'today' => $params['day'] = $day,
        'week'  => $params['week'] = $week,
        'month' => $params['month'] = $month,
        'year'  => $params['year'] = $year,
        'all'   => null,
        default => $params = ['view' => 'today', 'day' => $day],
    };

    return '?' . http_build_query($params);
}

function dashboardPaginationParams(string $view, string $day, string $week, string $month, string $year, array $extra = []): string {
    return ltrim(
        dashboardViewUrl($view, $day, $week, $month, $year, $extra),
        '?'
    );
}