<?php
/**
 * TTS-Cache: ersetzter Text → Audio-Dateiname.
 * Verhindert doppelte TTS-Erzeugung bei gleichem Text (z.B. "Guten Morgen Lucas, es ist 7 Uhr 00...").
 */
if (!defined('FUNCTIONS_ROOT')) {
    return;
}

require_once __DIR__ . '/functions_common.php';

/**
 * Sucht gecachte Audio-Datei für den exakten ersetzten Text.
 * @return string|null Dateiname (z.B. tts_123.mp3) oder null wenn nicht gecacht oder Datei fehlt
 */
function function_tts_cache_get(string $replacedText): ?string
{
    $text = trim($replacedText);
    if ($text === '') {
        return null;
    }
    $hash = hash('sha256', $text);
    $pdo = $GLOBALS['pdo'] ?? null;
    if (!$pdo) {
        return null;
    }
    try {
        $stmt = $pdo->prepare('SELECT audio_dateiname FROM wecker_tts_cache WHERE text_hash = :hash LIMIT 1');
        $stmt->execute(['hash' => $hash]);
        $row = $stmt->fetch(PDO::FETCH_ASSOC);
        if (!$row || empty($row['audio_dateiname'])) {
            return null;
        }
        $filename = $row['audio_dateiname'];
        $audioDir = function_storage_audio_dir();
        if (!is_file($audioDir . $filename)) {
            return null;
        }
        return $filename;
    } catch (Throwable $e) {
        return null;
    }
}

/**
 * Speichert ersetzten Text und zugehörige Audio-Datei im Cache.
 */
function function_tts_cache_set(string $replacedText, string $audioDateiname): bool
{
    $text = trim($replacedText);
    if ($text === '' || trim($audioDateiname) === '') {
        return false;
    }
    $hash = hash('sha256', $text);
    $pdo = $GLOBALS['pdo'] ?? null;
    if (!$pdo) {
        return false;
    }
    try {
        $stmt = $pdo->prepare('
            INSERT INTO wecker_tts_cache (text_hash, replaced_text, audio_dateiname)
            VALUES (:hash, :text, :filename)
            ON DUPLICATE KEY UPDATE replaced_text = VALUES(replaced_text), audio_dateiname = VALUES(audio_dateiname), created_at = CURRENT_TIMESTAMP
        ');
        $stmt->execute([
            'hash'     => $hash,
            'text'     => $text,
            'filename' => $audioDateiname,
        ]);
        return true;
    } catch (Throwable $e) {
        return false;
    }
}
