Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
0.00% covered (danger)
0.00%
0 / 28
0.00% covered (danger)
0.00%
0 / 2
CRAP
0.00% covered (danger)
0.00%
0 / 1
AnniversaryUtils
0.00% covered (danger)
0.00%
0 / 28
0.00% covered (danger)
0.00%
0 / 2
42
0.00% covered (danger)
0.00%
0 / 1
 getElevationStats
0.00% covered (danger)
0.00%
0 / 21
0.00% covered (danger)
0.00%
0 / 1
12
 getPrettySource
0.00% covered (danger)
0.00%
0 / 7
0.00% covered (danger)
0.00%
0 / 1
12
1<?php
2
3namespace Olz\Anniversary\Utils;
4
5use Olz\Utils\WithUtilsTrait;
6
7/**
8 * @phpstan-type OlzElevationStats array{
9 *   completion: float,
10 *   diffMeters: float,
11 *   diffDays: float,
12 *   diffKind: 'ahead'|'behind',
13 * }
14 */
15class AnniversaryUtils {
16    use WithUtilsTrait;
17
18    /** @return OlzElevationStats */
19    public function getElevationStats() {
20        $db = $this->dbUtils()->getDb();
21
22        $is_before_2026 = intval($this->dateUtils()->getCurrentDateInFormat('Y')) < 2026;
23        $goal_meters_per_day = 4478;
24        $year_start_secs = 1735689600; // 2025-01-01 00:00:00
25        $now_secs = $is_before_2026 ? $year_start_secs : strtotime($this->dateUtils()->getIsoNow());
26        $goal_elevation = ($now_secs - $year_start_secs) * $goal_meters_per_day / 86400;
27        $sql = <<<'ZZZZZZZZZZ'
28                SELECT SUM(elevation_meters) as sum_elevation
29                FROM anniversary_runs
30                WHERE
31                    run_at >= '2026-01-01'
32                    AND run_at <= '2026-12-31'
33                    AND is_counting = '1'
34                    AND on_off = '1'
35            ZZZZZZZZZZ;
36        $res_sum_elevation = $db->query($sql);
37        $this->generalUtils()->checkNotBool($res_sum_elevation, "Query error: {$sql}");
38        $sum_elevation = floatval($res_sum_elevation->fetch_assoc()['sum_elevation'] ?? 0);
39
40        $completion = $sum_elevation / ($goal_meters_per_day * 356);
41        $diff_meters = $sum_elevation - $goal_elevation;
42        $diff_days = $diff_meters / $goal_meters_per_day;
43        $diff_kind = $diff_days >= 0 ? 'ahead' : 'behind';
44
45        return [
46            'completion' => $completion,
47            'diffMeters' => $diff_meters,
48            'diffDays' => $diff_days,
49            'diffKind' => $diff_kind,
50        ];
51    }
52
53    public function getPrettySource(string $source): string {
54        $source_short = mb_split('-', $source)[0] ?? '?';
55        if ($source_short === 'manuell') {
56            return "✍️ manuell";
57        }
58        if ($source_short === 'strava') {
59            $code_href = $this->envUtils()->getCodeHref();
60            return "<img src='{$code_href}assets/icns/strava_16.svg' alt='s' class='noborder'> strava";
61        }
62        return "🤷 {$source_short}";
63    }
64}