<?php
ob_start();
require_once '../config.php';
ob_clean();
header('Content-Type: application/json; charset=utf-8');

/**
 * BUQUE.PHP - Versión mejorada por DevMastering.com
 * Manejo dinámico de timestamp y lógica de deduplicación inteligente.
 */

// ============================================
// LOGGING DE DIAGNÓSTICO
// ============================================
$logDir = __DIR__ . '/../logs';
if (!is_dir($logDir))
    @mkdir($logDir, 0755, true);

function log_simple($msg)
{
    global $logDir;
    @file_put_contents($logDir . '/api2.log', "[" . date('Y-m-d H:i:s') . "] $msg\n", FILE_APPEND);
}

// log_simple("=== NUEVA SOLICITUD (buque.php) ===");

if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
    log_simple("ERROR: Método no POST");
    jsonResponse(false, 'Método no permitido. Use POST.', null, 405);
}

$rawData = file_get_contents('php://input');
if (empty($rawData)) {
    log_simple("ERROR: Body vacío");
    jsonResponse(false, 'Body vacío', null, 400);
}

$rawData = trim($rawData);
// log_simple("DATA RECIBIDA: $rawData");

// PARSE CSV (Esperado: temp, idZona, fechaRecibida, apiKey, [buque_id])
$values = array_map('trim', explode(',', $rawData));
if (count($values) < 4) {
    log_simple("ERROR: Formato CSV inválido (" . count($values) . " valores)");
    jsonResponse(false, 'Formato inválido (Esperado: temp,zona,fecha,key,[buque_id])', null, 400);
}

$temperatura = $values[0];
$idZona = $values[1];
$fechaRecibida = $values[2]; // Puede ser "now", "HH:MM" o "00:00"
$apiKey = $values[3];
$buqueId = $values[4] ?? 'BOUCIÑA-01'; // Soporte dinámico para múltiples buques/equipos

// ============================================
// SEGURIDAD Y VALIDACIÓN
// ============================================
if ($apiKey !== API_KEY) {
    log_simple("SECURITY ERROR: API KEY inválida");
    jsonResponse(false, 'API KEY inválida', null, 401);
}

// DEFINICIÓN DE LA HORA REAL
if ($fechaRecibida === 'now' || $fechaRecibida === '00:00' || empty($fechaRecibida)) {
    $fechaFinal = date('Y-m-d H:i:s');
} else {
    $fechaFinal = date('Y-m-d') . ' ' . $fechaRecibida . ':00';
}

if (!is_numeric($temperatura)) {
    jsonResponse(false, 'Temperatura inválida', null, 400);
}

$tempFloat = (float) $temperatura;
if ($tempFloat == 0.00 || $tempFloat == 85.00 || $tempFloat == -127.00) {
    $temperatura = null;
} else {
    $temperatura = number_format($tempFloat, 2, '.', '');
}

$MAX_SENSORS = 16;
if (!is_numeric($idZona) || (int) $idZona < 1 || (int) $idZona > $MAX_SENSORS) {
    jsonResponse(false, "ID de zona inválido", null, 400);
}
$idZona = (int) $idZona;

$pdo = getDBConnection();
if (!$pdo)
    jsonResponse(false, 'Error BD', null, 500);

// ============================================
// LÓGICA DE ALMACENAMIENTO
// ============================================
try {
    // 1. Obtener Umbrales de Alerta
    $stmtConfig = $pdo->prepare("SELECT max_temp, min_temp, last_payload FROM ships WHERE ship_id = :buque");
    $stmtConfig->execute([':buque' => $buqueId]);
    $shipInfo = $stmtConfig->fetch(PDO::FETCH_ASSOC);

    if (!$shipInfo) {
        // Auto-crear buque si no existe (Escalabilidad total)
        $pdo->prepare("INSERT IGNORE INTO ships (ship_id, name, type) VALUES (:id, :id, 'buque')")
            ->execute([':id' => $buqueId]);
        $maxThreshold = 25.0;
        $lastLivePayload = null;
    } else {
        $maxThreshold = $shipInfo['max_temp'] ?? 25.0;
        $lastLivePayload = $shipInfo['last_payload'] ? json_decode($shipInfo['last_payload'], true) : null;
    }

    // Obtener columnas para SQL
    $cols = [];
    for ($i = 1; $i <= $MAX_SENSORS; $i++)
        $cols[] = "temp$i";
    $colsStr = implode(', ', $cols);

    // Obtener última medición
    $stmtUltima = $pdo->prepare("SELECT $colsStr, fecha FROM mediciones WHERE buque_id = :buque ORDER BY fecha DESC LIMIT 1");
    $stmtUltima->execute([':buque' => $buqueId]);
    $ultimaMedicion = $stmtUltima->fetch(PDO::FETCH_ASSOC);

    $prevValue = $ultimaMedicion ? $ultimaMedicion["temp$idZona"] : null;
    $currentValue = $temperatura;
    $lastTime = $ultimaMedicion ? strtotime($ultimaMedicion['fecha']) : 0;

    // Lógica de guardado (Simplificada para mantener el objetivo de escalabilidad)
    $isHeartbeat = (time() - $lastTime > 3600);
    $isSignificantChange = ($prevValue !== null && $currentValue !== null && abs($currentValue - $prevValue) >= 1.0);
    $isTransition = (($prevValue !== null && $currentValue !== null) && (($prevValue <= $maxThreshold && $currentValue > $maxThreshold) || ($prevValue > $maxThreshold && $currentValue <= $maxThreshold)));
    $isNowDisconnected = ($prevValue !== null && $currentValue === null);
    $isAboveThreshold = ($currentValue !== null && $currentValue > $maxThreshold);
    $isAlertHeartbeat = ($isAboveThreshold && (time() - $lastTime > 600));

    // 5. PREPARAR PAYLOAD PARA LIVE UPDATE
    $temps = [];
    $timestamps = [];
    if ($lastLivePayload && isset($lastLivePayload['sensor_timestamps'])) {
        $timestamps = $lastLivePayload['sensor_timestamps'];
    }

    for ($i = 1; $i <= $MAX_SENSORS; $i++) {
        if ($i === $idZona) {
            $temps[$i] = $temperatura;
            $timestamps[$i] = time();
        } else {
            $temps[$i] = $lastLivePayload["temp$i"] ?? ($ultimaMedicion["temp$i"] ?? null);
        }
    }

    $livePayload = [
        'unica' => true,
        'fecha' => $fechaFinal,
        'ip' => $_SERVER['REMOTE_ADDR'] ?? 'desconocida',
        'sensor_timestamps' => $timestamps
    ];
    for ($i = 1; $i <= $MAX_SENSORS; $i++)
        $livePayload["temp$i"] = $temps[$i];

    $stmtUpdateShip = $pdo->prepare("UPDATE ships SET last_contact = NOW(), last_payload = :payload WHERE ship_id = :buque");
    $stmtUpdateShip->execute([':payload' => json_encode($livePayload), ':buque' => $buqueId]);

    $shouldInsert = (!$ultimaMedicion || $isHeartbeat || $isTransition || $isNowDisconnected ||
        ($isAboveThreshold && ($isAlertHeartbeat || $isSignificantChange)) ||
        (!$isAboveThreshold && $currentValue !== null && $isSignificantChange));

    if ($shouldInsert) {
        $paramNames = [];
        for ($i = 1; $i <= $MAX_SENSORS; $i++)
            $paramNames[] = ":t$i";
        $paramsStr = implode(', ', $paramNames);

        $sql = "INSERT INTO mediciones (buque_id, $colsStr, fecha, ip) VALUES (:buque_id, $paramsStr, :fecha, :ip)";
        $params = [':buque_id' => $buqueId, ':fecha' => $fechaFinal, ':ip' => $_SERVER['REMOTE_ADDR']];
        for ($i = 1; $i <= $MAX_SENSORS; $i++) {
            $params[":t$i"] = ($temps[$i] === null || $temps[$i] === '') ? null : (float) $temps[$i];
        }

        $pdo->prepare($sql)->execute($params);
        jsonResponse(true, 'OK - Historial Guardado', ['id' => $pdo->lastInsertId()], 200);
    } else {
        jsonResponse(true, 'OK - Solo Live Update', null, 200);
    }

} catch (Exception $e) {
    log_simple("ERROR: " . $e->getMessage());
    jsonResponse(false, 'Error Interno', null, 500);
}