<?php
/**
 * Cronjob: Sensordaten von SCD41 und DHT11 erfassen und in DB schreiben.
 * Läuft alle 30 Sekunden, löscht Daten älter als 7 Tage.
 * Kann standalone aufgerufen werden: php /var/www/wecker/cronjob/collect_sensoren.php
 */
$weckerRoot = dirname(__DIR__);
if (!function_exists('function_einstellung_hole')) {
    require $weckerRoot . '/config.php';
    require FUNCTIONS_ROOT . '/functions_db.php';
    require FUNCTIONS_ROOT . '/functions_common.php';
}

$pdo = $GLOBALS['pdo'] ?? null;
if (!$pdo) {
    error_log('[collect_sensoren] Keine DB-Verbindung.');
    exit(1);
}

$script = $weckerRoot . '/skripts_webseite/abfrage_sensoren.sh';

if (!is_file($script)) {
    error_log('[collect_sensoren] Skript nicht gefunden: ' . $script);
    exit(1);
}

// Shell-Skript ausführen und JSON-Ausgabe einlesen
$output = [];
$exitCode = 0;
@exec('bash ' . escapeshellarg($script) . ' 2>/dev/null', $output, $exitCode);

$json = trim(implode('', $output));
$data = $json !== '' ? @json_decode($json, true) : null;

$co2     = null;
$tempScd = null;
$humScd  = null;
$tempDht = null;
$humDht  = null;
$status  = 'error';
$fehler  = null;

if ($data === null) {
    $fehler = 'Ungültige JSON-Ausgabe: ' . substr($json, 0, 200);
} elseif (($data['status'] ?? '') === 'error') {
    $status = 'error';
    $fehler = $data['message'] ?? 'Unbekannter Fehler';
} else {
    $status = $data['status'] ?? 'searching';

    $scd = $data['sensors']['scd41'] ?? null;
    if (is_array($scd) && !isset($scd['error'])) {
        $co2     = isset($scd['co2'])  ? (int)$scd['co2']           : null;
        $tempScd = isset($scd['temp']) ? (float)$scd['temp']        : null;
        $humScd  = isset($scd['hum'])  ? (float)$scd['hum']         : null;
    } elseif (isset($scd['error'])) {
        $fehler = 'SCD41: ' . $scd['error'];
    }

    $dht = $data['sensors']['dht11'] ?? null;
    if (is_array($dht)) {
        $tempDht = isset($dht['temp']) ? (float)$dht['temp'] : null;
        $humDht  = isset($dht['hum'])  ? (float)$dht['hum']  : null;
    }
}

// Eintrag in DB schreiben
try {
    $stmt = $pdo->prepare(
        'INSERT INTO sensoren (zeitstempel, co2, temp_scd, hum_scd, temp_dht, hum_dht, status, fehler)
         VALUES (NOW(), ?, ?, ?, ?, ?, ?, ?)'
    );
    $stmt->execute([$co2, $tempScd, $humScd, $tempDht, $humDht, $status, $fehler]);
} catch (Throwable $e) {
    error_log('[collect_sensoren] DB-Insert Fehler: ' . $e->getMessage());
    exit(1);
}

// Alte Daten bereinigen (älter als 7 Tage)
try {
    $pdo->exec("DELETE FROM sensoren WHERE zeitstempel < DATE_SUB(NOW(), INTERVAL 7 DAY)");
} catch (Throwable $e) {
    error_log('[collect_sensoren] Cleanup Fehler: ' . $e->getMessage());
}
