<?php

require_once __DIR__ . '/functions_cache.php';

function function_wecker_hole_alle(): array
{
    $c = function_cache_get('wecker_all');
    if ($c !== null) {
        return $c;
    }
    $sql = "
        SELECT *
        FROM wecker
        ORDER BY weckzeit
    ";
    $rows = function_cyldb_select($GLOBALS['pdo'], $sql);
    function_cache_set('wecker_all', $rows);
    return $rows;
}

function function_wecker_hole_aktive(): array
{
    $c = function_cache_get('wecker_aktive');
    if ($c !== null) {
        return $c;
    }
    $sql = "
        SELECT *
        FROM wecker
        WHERE aktiv = :aktiv
        ORDER BY weckzeit
    ";
    $rows = function_cyldb_select($GLOBALS['pdo'], $sql, [
        'aktiv' => 1
    ]);
    function_cache_set('wecker_aktive', $rows);
    return $rows;
}

function function_wecker_hole(int $id): ?array
{
    $sql = "
        SELECT *
        FROM wecker
        WHERE id = :id
    ";

    $rows = function_cyldb_select($GLOBALS['pdo'], $sql, [
        'id' => $id
    ]);

    return $rows[0] ?? null;
}

function function_wecker_hole_wochentage(int $weckerId): array
{
    $sql = "
        SELECT wochentag
        FROM wecker_wochentage
        WHERE wecker_id = :id
        ORDER BY wochentag
    ";

    $rows = function_cyldb_select($GLOBALS['pdo'], $sql, [
        'id' => $weckerId
    ]);

    return array_column($rows, 'wochentag');
}

function function_wecker_hole_audio(int $weckerId): array
{
    $sql = "
        SELECT id, datei, titel, position, sortierung
        FROM wecker_audio
        WHERE wecker_id = :id
        ORDER BY position, sortierung, id
    ";
    return function_cyldb_select($GLOBALS['pdo'], $sql, ['id' => $weckerId]);
}

function function_wecker_setze_audio(int $weckerId, array $items): void
{
    function_cyldb_exec(
        $GLOBALS['pdo'],
        'DELETE FROM wecker_audio WHERE wecker_id = :id',
        ['id' => $weckerId]
    );

    $sql = "
        INSERT INTO wecker_audio (wecker_id, datei, titel, position, sortierung)
        VALUES (:wecker_id, :datei, :titel, :position, :sortierung)
    ";
    $sort = ['vorher' => 0, 'gleichzeitig' => 0, 'danach' => 0];
    foreach ($items as $item) {
        $pos = $item['position'] ?? 'danach';
        if (!in_array($pos, ['vorher', 'gleichzeitig', 'danach'], true)) {
            $pos = 'danach';
        }
        $sort[$pos]++;
        function_cyldb_exec($GLOBALS['pdo'], $sql, [
            'wecker_id'  => $weckerId,
            'datei'      => $item['datei'] ?? '',
            'titel'      => !empty($item['titel']) ? $item['titel'] : null,
            'position'   => $pos,
            'sortierung' => $item['sortierung'] ?? $sort[$pos]
        ]);
    }
}

function function_wecker_hole_komplett(int $id): ?array
{
    $wecker = function_wecker_hole($id);

    if (!$wecker) {
        return null;
    }

    if ($wecker['wiederholung'] === 'woechentlich') {
        $wecker['wochentage'] = function_wecker_hole_wochentage($id);
    } else {
        $wecker['wochentage'] = [];
    }

    $wecker['audio'] = function_wecker_hole_audio($id);

    return $wecker;
}

function function_wecker_setze_wochentage(int $weckerId, array $tage): void
{
    function_cyldb_exec(
        $GLOBALS['pdo'],
        'DELETE FROM wecker_wochentage WHERE wecker_id = :id',
        ['id' => $weckerId]
    );

    $sql = "
        INSERT INTO wecker_wochentage (wecker_id, wochentag)
        VALUES (:id, :tag)
    ";

    foreach ($tage as $tag) {
        function_cyldb_exec($GLOBALS['pdo'], $sql, [
            'id'  => $weckerId,
            'tag' => $tag
        ]);
    }
}

function function_wecker_anlegen(array $daten): int
{
    $n = function_wecker_anlegen_impl($daten);
    if ($n > 0) {
        function_cache_invalidate('wecker_all');
        function_cache_invalidate('wecker_aktive');
    }
    return $n;
}

function function_wecker_anlegen_impl(array $daten): int
{
    $sql = "
        INSERT INTO wecker (
        weckzeit,
        weckdatum,
        wiederholung,
        sprachtext,
        aktiv
    ) VALUES (
        :zeit,
        :datum,
        :wiederholung,
        :text,
        :aktiv
    )
    ";

    return function_cyldb_exec($GLOBALS['pdo'], $sql, [
        'zeit'         => $daten['weckzeit'],
        'datum'        => $daten['weckdatum'],
        'wiederholung' => $daten['wiederholung'],
        'text'         => $daten['sprachtext'],
        'aktiv'        => $daten['aktiv'] ?? 1
    ]);
}

function function_wecker_aktualisieren(int $id, array $daten): int
{
    $sql = "
        UPDATE wecker SET
            weckzeit = :zeit,
            weckdatum = :datum,
            wiederholung = :wiederholung,
            sprachtext = :text,
            aktiv = :aktiv
        WHERE id = :id
    ";
    $n = function_cyldb_exec($GLOBALS['pdo'], $sql, [
        'id'         => $id,
        'zeit'       => $daten['weckzeit'],
        'datum'      => $daten['weckdatum'] ?: null,
        'wiederholung' => $daten['wiederholung'],
        'text'       => $daten['sprachtext'],
        'aktiv'      => isset($daten['aktiv']) ? (int)(bool)$daten['aktiv'] : 1
    ]);

    if ($n > 0 && ($daten['wiederholung'] ?? '') === 'woechentlich' && isset($daten['wochentage']) && is_array($daten['wochentage'])) {
        function_wecker_setze_wochentage($id, $daten['wochentage']);
    } elseif ($n > 0) {
        function_wecker_setze_wochentage($id, []);
    }

    if ($n > 0) {
        function_cache_invalidate('wecker_all');
        function_cache_invalidate('wecker_aktive');
    }
    return $n;
}

function function_wecker_setze_aktiv(int $id, bool $aktiv): int
{
    $n = function_cyldb_exec(
        $GLOBALS['pdo'],
        'UPDATE wecker SET aktiv = :aktiv WHERE id = :id',
        [
            'aktiv' => $aktiv ? 1 : 0,
            'id'    => $id
        ]
    );
    if ($n > 0) {
        function_cache_invalidate('wecker_all');
        function_cache_invalidate('wecker_aktive');
    }
    return $n;
}

function function_wecker_loeschen(int $id): int
{
    $n = function_cyldb_exec(
        $GLOBALS['pdo'],
        'DELETE FROM wecker WHERE id = :id',
        ['id' => $id]
    );
    if ($n > 0) {
        function_cache_invalidate('wecker_all');
        function_cache_invalidate('wecker_aktive');
    }
    return $n;
}

function function_einstellungen_hole_alle(): array
{
    $c = function_cache_get('einstellungen_all');
    if ($c !== null) {
        return $c;
    }
    $sql = "SELECT schluessel, wert FROM einstellungen";
    $rows = function_cyldb_select($GLOBALS['pdo'], $sql);
    function_cache_set('einstellungen_all', $rows);
    return $rows;
}

function function_einstellung_hole(string $schluessel): ?string
{
    $map = function_cache_get('einstellungen_map');
    if ($map === null) {
        $rows = function_einstellungen_hole_alle();
        $map = [];
        foreach ($rows as $r) {
            $map[$r['schluessel']] = $r['wert'];
        }
        function_cache_set('einstellungen_map', $map);
    }
    return $map[$schluessel] ?? null;
}

function function_einstellung_setzen(string $schluessel, string $wert): int
{
    $sql = "
        INSERT INTO einstellungen (schluessel, wert) VALUES (:k, :v)
        ON DUPLICATE KEY UPDATE wert = VALUES(wert)
    ";
    $n = function_cyldb_exec($GLOBALS['pdo'], $sql, ['k' => $schluessel, 'v' => $wert]);
    if ($n >= 0) {
        function_cache_invalidate('einstellungen_all');
        function_cache_invalidate('einstellungen_map');
    }
    return $n;
}

function function_tts_hole_aktive_platzhalter(): array
{
    $sql = "
        SELECT platzhalter, beschreibung
        FROM tts_platzhalter
        WHERE aktiv = 1
        ORDER BY sortierung, platzhalter
    ";

    return function_cyldb_select($GLOBALS['pdo'], $sql);
}

function function_tts_custom_hole_alle(): array
{
    $sql = "
        SELECT id, platzhalter, ersetzungstext, beschreibung, aktiv, sortierung
        FROM tts_custom
        ORDER BY sortierung, platzhalter
    ";
    return function_cyldb_select($GLOBALS['pdo'], $sql);
}

function function_tts_custom_hole_aktive(): array
{
    $sql = "
        SELECT platzhalter, ersetzungstext
        FROM tts_custom
        WHERE aktiv = 1
        ORDER BY sortierung, platzhalter
    ";
    return function_cyldb_select($GLOBALS['pdo'], $sql);
}

function function_tts_custom_hole(int $id): ?array
{
    $rows = function_cyldb_select(
        $GLOBALS['pdo'],
        'SELECT id, platzhalter, ersetzungstext, beschreibung, aktiv, sortierung FROM tts_custom WHERE id = :id',
        ['id' => $id]
    );
    return $rows[0] ?? null;
}

function function_tts_custom_anlegen(array $daten): int
{
    $sql = "
        INSERT INTO tts_custom (platzhalter, ersetzungstext, beschreibung, aktiv, sortierung)
        VALUES (:platzhalter, :ersetzungstext, :beschreibung, :aktiv, :sortierung)
    ";
    function_cyldb_exec($GLOBALS['pdo'], $sql, [
        'platzhalter'    => $daten['platzhalter'],
        'ersetzungstext' => $daten['ersetzungstext'],
        'beschreibung'   => $daten['beschreibung'] ?? null,
        'aktiv'         => isset($daten['aktiv']) ? (int)(bool)$daten['aktiv'] : 1,
        'sortierung'    => (int)($daten['sortierung'] ?? 0)
    ]);
    return (int)$GLOBALS['pdo']->lastInsertId();
}

function function_tts_custom_aktualisieren(int $id, array $daten): int
{
    $sql = "
        UPDATE tts_custom SET
            platzhalter = :platzhalter,
            ersetzungstext = :ersetzungstext,
            beschreibung = :beschreibung,
            aktiv = :aktiv,
            sortierung = :sortierung
        WHERE id = :id
    ";
    return function_cyldb_exec($GLOBALS['pdo'], $sql, [
        'id'             => $id,
        'platzhalter'    => $daten['platzhalter'],
        'ersetzungstext' => $daten['ersetzungstext'],
        'beschreibung'   => $daten['beschreibung'] ?? null,
        'aktiv'          => isset($daten['aktiv']) ? (int)(bool)$daten['aktiv'] : 1,
        'sortierung'     => (int)($daten['sortierung'] ?? 0)
    ]);
}

function function_tts_custom_loeschen(int $id): int
{
    return function_cyldb_exec(
        $GLOBALS['pdo'],
        'DELETE FROM tts_custom WHERE id = :id',
        ['id' => $id]
    );
}

/**
 * Lautstärke-Einstellungen für den Wecker-Service (TTS, Musik, Ducking).
 * Rückgabe: ['tts' => 0-100, 'musik' => 0-100, 'musik_ducking_prozent' => 0-100]
 * Während TTS abspielen: Musik auf (musik * musik_ducking_prozent / 100) setzen, danach wieder auf musik.
 */
function function_wecker_lautstaerke_holen(): array
{
    return [
        'tts'                   => (int) max(0, min(100, (int)(function_einstellung_hole('lautstaerke') ?: 100))),
        'musik'                 => (int) max(0, min(100, (int)(function_einstellung_hole('lautstaerke_musik') ?: 80))),
        'musik_ducking_prozent' => (int) max(0, min(100, (int)(function_einstellung_hole('musik_ducking_prozent') ?: 20))),
    ];
}

/**
 * Ersetzt TTS-Platzhalter im Text (für Wecker-Service beim Abspielen).
 * {{name}}, {{uhrzeit}}, {{datum}}, {{temperatur}}, {{wetter}}, {{wetter_tag}}, plus tts_custom.
 */
function function_tts_text_ersetzen(string $text, ?DateTimeInterface $zeit = null): string
{
    if ($zeit === null) {
        $zeit = new DateTimeImmutable('now', new DateTimeZone(function_einstellung_hole('zeitzone') ?: 'Europe/Berlin'));
    }

    $temperatur = '';
    $wetter = '';
    $wetterTag = '';

    $ort = trim((string) (function_einstellung_hole('wetter_ort') ?: ''));
    if ($ort !== '') {
        if (!function_exists('function_wetter_fetch')) {
            require_once __DIR__ . '/functions_wetter.php';
        }
        $wetterData = function_wetter_fetch($ort);
        if (!empty($wetterData['ok']) && !empty($wetterData['current'])) {
            $cur = $wetterData['current'];
            $temperatur = (string) ($cur['temp'] ?? '');
            $wetter = (string) ($cur['beschreibung'] ?? '');
            if (!empty($wetterData['daily'][0])) {
                $tag = $wetterData['daily'][0];
                $min = $tag['temp_min'] ?? null;
                $max = $tag['temp_max'] ?? null;
                $beschr = $tag['beschreibung'] ?? '';
                if ($min !== null && $max !== null) {
                    $wetterTag = trim($beschr . ', ' . $min . ' bis ' . $max . ' Grad');
                } else {
                    $wetterTag = $beschr;
                }
            }
        }
    }

    $ersetzungen = [
        '{{name}}'         => function_einstellung_hole('tts_name') ?: '',
        '{{uhrzeit}}'      => $zeit->format('H:i'),
        '{{datum}}'        => $zeit->format('d.m.Y'),
        '{{temperatur}}'   => $temperatur,
        '{{wetter}}'       => $wetter,
        '{{wetter_tag}}'   => $wetterTag,
    ];

    foreach (function_tts_custom_hole_aktive() as $row) {
        $ersetzungen[$row['platzhalter']] = $row['ersetzungstext'];
    }

    $out = $text;
    foreach ($ersetzungen as $platzhalter => $wert) {
        $out = str_replace($platzhalter, $wert, $out);
    }

    return $out;
}

