<?php
/**
 * Cronjob: Timer-Prüfung (läuft sekündlich).
 * Prüft ob ein aktiver Wecker klingeln soll und schreibt den Zustand in
 * storage/alarm_ringing.json. Steuert auch Snooze-Ablauf.
 *
 * Wird von cronjob.php per include ausgeführt; $pdo und alle Wecker-Funktionen sind verfügbar.
 */

$stateFile = STORAGE_ROOT . '/alarm_ringing.json';

// Sicherstellen dass storage-Verzeichnis existiert
if (!is_dir(STORAGE_ROOT)) {
    @mkdir(STORAGE_ROOT, 0755, true);
}

// Aktuellen Zustand lesen
$state = [];
if (is_file($stateFile)) {
    $raw = @file_get_contents($stateFile);
    if ($raw !== false && $raw !== '') {
        $state = @json_decode($raw, true) ?: [];
    }
}

$now            = time();
$currentTime    = date('H:i');
$currentDate    = date('Y-m-d');
$currentWeekday = (int) date('N'); // 1 = Montag, 7 = Sonntag

// Auto-Expire: Klingeln nach 2 Minuten ohne Reaktion automatisch beenden
if (!empty($state['ringing']) && !empty($state['started_at'])) {
    if (($now - (int) $state['started_at']) > 120) {
        $state = ['ringing' => false];
        @file_put_contents($stateFile, json_encode($state));
    }
}

// Wenn gerade klingelt: nichts tun (Benutzer muss Snooze/Stop drücken)
if (!empty($state['ringing'])) {
    return;
}

// Aktive Wecker holen
if (!function_exists('function_wecker_hole_aktive')) {
    return;
}
$alarms = function_wecker_hole_aktive();

foreach ($alarms as $alarm) {
    $alarmId   = (int) $alarm['id'];
    $alarmTime = substr((string) $alarm['weckzeit'], 0, 5); // HH:MM

    // Prüfen ob dieser Wecker jetzt klingeln soll
    $shouldRing = false;

    switch ($alarm['wiederholung'] ?? 'taeglich') {
        case 'einmal':
            $shouldRing = ($alarm['weckdatum'] === $currentDate && $alarmTime === $currentTime);
            break;

        case 'taeglich':
            $shouldRing = ($alarmTime === $currentTime);
            break;

        case 'woechentlich':
            $wochentage = function_wecker_hole_wochentage($alarmId);
            $shouldRing = in_array($currentWeekday, array_map('intval', $wochentage), true)
                       && ($alarmTime === $currentTime);
            break;
    }

    if (!$shouldRing) {
        continue;
    }

    // Snooze-Check: noch in der Snooze-Phase?
    if (
        !empty($state['snoozed_until'])
        && $now < (int) $state['snoozed_until']
        && ((int) ($state['snooze_alarm_id'] ?? 0)) === $alarmId
    ) {
        continue;
    }

    // Stop-Check: in dieser Minute bereits gestoppt?
    $stopKey = $alarmId . '_' . $currentTime . '_' . $currentDate;
    if (!empty($state['stopped_for']) && $state['stopped_for'] === $stopKey) {
        continue;
    }

    // Cover-URL ermitteln (erste Audio-Quelle)
    $coverUrl = null;
    if (function_exists('function_wecker_hole_audio')) {
        $audioEntries = function_wecker_hole_audio($alarmId);
        foreach ($audioEntries as $a) {
            $datei = trim((string) ($a['datei'] ?? ''));
            if ($datei === '') {
                continue;
            }
            if (strpos($datei, 'playlist:') === 0) {
                $pid = (int) substr($datei, 9);
                if ($pid > 0) {
                    $coverUrl = '/album_cover.php?album_id=' . $pid;
                }
            } else {
                $coverUrl = '/audio_cover.php?f=' . rawurlencode(basename($datei));
            }
            break;
        }
    }

    // Audio-URLs für Browser-Player berechnen
    // Reihenfolge: gleichzeitig (vor TTS) → TTS → danach
    $audioUrls = [];
    $ttsUrl    = null;

    if (function_exists('function_wecker_audio_urls')) {
        $resolved = function_wecker_audio_urls($alarmId);
        $vorher   = $resolved['gleichzeitig'] ?? [];
        $danach   = $resolved['danach']       ?? [];

        // TTS-URL aus Cache holen
        try {
            if (function_exists('function_tts_text_ersetzen') && !empty($alarm['sprachtext'])) {
                $ttsText = function_tts_text_ersetzen($alarm['sprachtext'], null, $alarmTime);
                $hash    = hash('sha256', $ttsText);
                $stmt    = $GLOBALS['pdo']->prepare(
                    'SELECT audio_dateiname FROM wecker_tts_cache WHERE text_hash = ? LIMIT 1'
                );
                $stmt->execute([$hash]);
                $row = $stmt->fetch(PDO::FETCH_ASSOC);
                if ($row && !empty($row['audio_dateiname'])) {
                    $ttsUrl = '/tts_file.php?f=' . rawurlencode(basename($row['audio_dateiname']));
                }
            }
        } catch (Throwable $e) {
            // TTS-Cache nicht verfügbar – kein Fehler
        }

        // Geordnete Abspielliste aufbauen
        $audioUrls = array_values(array_filter(array_merge(
            $vorher,
            $ttsUrl !== null ? [$ttsUrl] : [],
            $danach
        )));
    }

    // Klingel-Zustand schreiben
    $newState = [
        'ringing'    => true,
        'alarm_id'   => $alarmId,
        'alarm_time' => $alarmTime,
        'cover_url'  => $coverUrl,
        'audio_urls' => $audioUrls,
        'started_at' => $now,
    ];
    @file_put_contents($stateFile, json_encode($newState));

    // Letzten Auslösezeitpunkt in DB aktualisieren
    try {
        $GLOBALS['pdo']
            ->prepare('UPDATE wecker SET zuletzt_ausgeloest = NOW() WHERE id = ?')
            ->execute([$alarmId]);
    } catch (Throwable $e) {
        // Nicht kritisch
    }

    break; // Nur ein Alarm gleichzeitig
}
