<?php
declare(strict_types=1);

header('Content-Type: application/json; charset=utf-8');

require_once __DIR__ . '/../../bootstrap.php';

ym_require('src/services/TelemetryDbRouter.php');
ym_require('src/services/TelemetryTimeSeriesBuilder.php');

$vesselKey = $_GET['vessel'] ?? 'silent_sea';
$lang      = $_GET['lang'] ?? 'de';
$range     = $_GET['range'] ?? '24h';

$allowedRanges = [
    '6h' => [
        'modify' => '-6 hours',
        'step' => 1,
    ],
    '24h' => [
        'modify' => '-24 hours',
        'step' => 1,
    ],
    '1m' => [
        'modify' => '-1 month',
        'step' => 10,
    ],
    '1y' => [
        'modify' => '-1 year',
        'step' => 100,
    ],
];

if (!isset($allowedRanges[$range])) {
    $range = '24h';
}

$rangeConfig = $allowedRanges[$range];
$step = $rangeConfig['step'];

try {
    $db = TelemetryDbRouter::getTelemetryPdoByVesselKey(
        $vesselKey
    );

    $from = new DateTimeImmutable(
        $rangeConfig['modify']
    );

    $allPoints = TelemetryTimeSeriesBuilder::buildCategorySeries(
        $db,
        'ENVdata',
        [
            'windspeed',
            'windtrue',
        ],
        $from,
        2
    );

    $points = [];

    foreach ($allPoints as $index => $point) {
        /*
         * Bei größeren Zeiträumen wird vorerst wie bisher jeder n-te
         * Messpunkt übernommen. Ein generisches Downsampling gehört
         * bewusst nicht in den TelemetryTimeSeriesBuilder.
         */
        if (
            $step > 1
            && (($index + 1) % $step !== 0)
        ) {
            continue;
        }

        if (
            $point['windspeed'] === null
            && $point['windtrue'] === null
        ) {
            continue;
        }

        $points[] = $point;
    }

    echo json_encode(
        [
            'success' => true,
            'vessel' => $vesselKey,
            'lang' => $lang,
            'range' => $range,
            'step' => $step,
            'count' => count($points),
            'points' => $points,
        ],
        JSON_PRETTY_PRINT
        | JSON_UNESCAPED_UNICODE
        | JSON_UNESCAPED_SLASHES
    );
} catch (Throwable $e) {
    http_response_code(500);

    echo json_encode(
        [
            'success' => false,
            'error' => $e->getMessage(),
        ],
        JSON_PRETTY_PRINT
        | JSON_UNESCAPED_UNICODE
        | JSON_UNESCAPED_SLASHES
    );
}
