<?php
// api.php - VERSIÓN CORREGIDA
require_once __DIR__ . '/config.php';

// Función para enviar respuestas JSON
function sendJsonResponse($data) {
    // Limpiar cualquier salida previa
    if (ob_get_length()) ob_clean();
    
    header('Content-Type: application/json; charset=utf-8');
    echo json_encode($data, JSON_UNESCAPED_UNICODE);
    exit;
}

// Verificar conexión a DB
$conn = getDB();
if (!$conn) {
    sendJsonResponse(['error' => 'Error de conexión a la base de datos']);
}

$action = $_GET['action'] ?? '';

// Manejar solicitudes OPTIONS para CORS
if ($_SERVER['REQUEST_METHOD'] === 'OPTIONS') {
    http_response_code(200);
    exit();
}

switch ($action) {
    case 'getDisponibilidad':
        getDisponibilidad($conn);
        break;
    case 'getPedidos':
        getPedidos($conn);
        break;
    case 'nuevoPedido':
        nuevoPedido($conn);
        break;
    case 'reiniciarDia':
        reiniciarDia($conn);
        break;
    case 'getEstadisticas':
        getEstadisticas($conn);
        break;
    case 'verificarConexion':
        sendJsonResponse(['success' => true, 'mensaje' => 'Conexión exitosa']);
        break;
    case 'actualizarEstadoPedido':
        actualizarEstadoPedido($conn);
        break;
    case 'getEstadosPedidos':
        getEstadosPedidos($conn);
        break;
    case 'getResumenEstados':
        getResumenEstados($conn);
        break;
    default:
        sendJsonResponse(['error' => 'Acción no válida: ' . $action]);
}

function getDisponibilidad($conn) {
    $fecha = $_GET['fecha'] ?? FECHA_ACTUAL;
    
    $stmt = $conn->prepare("SELECT horario, reservados, max_capacidad FROM disponibilidad WHERE fecha = ?");
    if (!$stmt) {
        sendJsonResponse(['error' => 'Error en prepare: ' . $conn->error]);
    }
    
    $stmt->bind_param("s", $fecha);
    $stmt->execute();
    $result = $stmt->get_result();
    
    $disponibilidad = [];
    while ($row = $result->fetch_assoc()) {
        $disponibilidad[$row['horario']] = [
            'reservados' => (int)$row['reservados'],
            'max' => (int)$row['max_capacidad']
        ];
    }
    
    sendJsonResponse($disponibilidad);
}

function getPedidos($conn) {
    $fecha = $_GET['fecha'] ?? FECHA_ACTUAL;
    
    $stmt = $conn->prepare("SELECT * FROM pedidos WHERE fecha_desayuno = ? ORDER BY horario, habitacion");
    if (!$stmt) {
        sendJsonResponse(['error' => 'Error en prepare: ' . $conn->error]);
    }
    
    $stmt->bind_param("s", $fecha);
    $stmt->execute();
    $result = $stmt->get_result();
    
    $pedidos = [];
    while ($row = $result->fetch_assoc()) {
        $row['desayunos'] = json_decode($row['desayunos'], true);
        $row['variaciones'] = json_decode($row['variaciones'], true);
        $pedidos[] = $row;
    }
    
    sendJsonResponse($pedidos);
}

function nuevoPedido($conn) {
    // Obtener datos del POST
    $input = file_get_contents('php://input');
    $data = json_decode($input, true);
    
    if (!$data) {
        sendJsonResponse(['error' => 'Datos no válidos: ' . $input]);
    }
    
    // Validar campos requeridos
    $required = ['habitacion', 'horario', 'desayunos', 'variaciones', 'totalPasajeros'];
    foreach ($required as $field) {
        if (!isset($data[$field])) {
            sendJsonResponse(['error' => "Campo requerido faltante: $field"]);
        }
    }
    
    $habitacion = (int)$data['habitacion'];
    $horario = $data['horario'];
    $desayunos = json_encode($data['desayunos'], JSON_UNESCAPED_UNICODE);
    $variaciones = json_encode($data['variaciones'], JSON_UNESCAPED_UNICODE);
    $nota = $data['nota'] ?? '';
    $total_pasajeros = (int)$data['totalPasajeros'];
    $idioma = $data['lang'] ?? 'es';
    $fecha = $data['fecha'] ?? FECHA_ACTUAL;
    $estado_cocina = 'nuevo';
    
    // Validar que haya al menos un pasajero
    if ($total_pasajeros <= 0) {
        sendJsonResponse(['error' => 'Debe seleccionar al menos un desayuno']);
    }
    
    // Verificar disponibilidad
    $stmt = $conn->prepare("SELECT reservados, max_capacidad FROM disponibilidad WHERE fecha = ? AND horario = ?");
    if (!$stmt) {
        sendJsonResponse(['error' => 'Error al verificar disponibilidad']);
    }
    
    $stmt->bind_param("ss", $fecha, $horario);
    $stmt->execute();
    $result = $stmt->get_result();
    $disp = $result->fetch_assoc();
    
    if (!$disp) {
        sendJsonResponse(['error' => 'Horario no disponible']);
    }
    
    if (($disp['reservados'] + $total_pasajeros) > $disp['max_capacidad']) {
        sendJsonResponse(['error' => 'No hay suficiente disponibilidad para este horario']);
    }
    
    // Iniciar transacción
    $conn->begin_transaction();
    
    try {
        // Insertar pedido
        $stmt = $conn->prepare("INSERT INTO pedidos (habitacion, horario, desayunos, variaciones, nota, total_pasajeros, idioma, estado_cocina, fecha_desayuno) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)");
        if (!$stmt) {
            throw new Exception('Error al preparar inserción');
        }
        
        $stmt->bind_param("issssisss", 
            $habitacion, 
            $horario, 
            $desayunos, 
            $variaciones, 
            $nota, 
            $total_pasajeros, 
            $idioma, 
            $estado_cocina, 
            $fecha
        );
        
        if (!$stmt->execute()) {
            throw new Exception('Error al ejecutar inserción: ' . $stmt->error);
        }
        
        $pedido_id = $conn->insert_id;
        
        // Actualizar disponibilidad
        $nuevos_reservados = $disp['reservados'] + $total_pasajeros;
        $stmt = $conn->prepare("UPDATE disponibilidad SET reservados = ? WHERE fecha = ? AND horario = ?");
        if (!$stmt) {
            throw new Exception('Error al preparar actualización de disponibilidad');
        }
        
        $stmt->bind_param("iss", $nuevos_reservados, $fecha, $horario);
        if (!$stmt->execute()) {
            throw new Exception('Error al actualizar disponibilidad');
        }
        
        $conn->commit();
        
        sendJsonResponse([
            'success' => true,
            'pedido_id' => $pedido_id,
            'mensaje' => 'Pedido registrado correctamente'
        ]);
        
    } catch (Exception $e) {
        $conn->rollback();
        error_log("Error en nuevoPedido: " . $e->getMessage());
        sendJsonResponse(['error' => 'Error al guardar el pedido: ' . $e->getMessage()]);
    }
}

function reiniciarDia($conn) {
    $fecha = $_POST['fecha'] ?? $_GET['fecha'] ?? FECHA_ACTUAL;
    
    if (empty($fecha)) {
        sendJsonResponse(['success' => false, 'message' => 'Fecha no proporcionada']);
    }
    
    $conn->begin_transaction();
    
    try {
        // Eliminar pedidos
        $stmt = $conn->prepare("DELETE FROM pedidos WHERE fecha_desayuno = ?");
        $stmt->bind_param("s", $fecha);
        $stmt->execute();
        
        // Resetear disponibilidad
        $stmt = $conn->prepare("UPDATE disponibilidad SET reservados = 0 WHERE fecha = ?");
        $stmt->bind_param("s", $fecha);
        $stmt->execute();
        
        $conn->commit();
        
        sendJsonResponse([
            'success' => true,
            'message' => 'Día reiniciado correctamente'
        ]);
        
    } catch (Exception $e) {
        $conn->rollback();
        sendJsonResponse(['success' => false, 'message' => 'Error: ' . $e->getMessage()]);
    }
}

function actualizarEstadoPedido($conn) {
    $data = json_decode(file_get_contents('php://input'), true);
    
    if (!$data || !isset($data['pedido_id']) || !isset($data['estado'])) {
        sendJsonResponse(['success' => false, 'message' => 'Datos incompletos']);
    }
    
    $pedido_id = (int)$data['pedido_id'];
    $estado = $data['estado'];
    $fecha_estado = date('Y-m-d H:i:s');
    
    $estados_validos = ['nuevo', 'preparacion', 'listo', 'completado'];
    if (!in_array($estado, $estados_validos)) {
        sendJsonResponse(['success' => false, 'message' => 'Estado no válido']);
    }
    
    $stmt = $conn->prepare("UPDATE pedidos SET estado_cocina = ?, fecha_estado = ? WHERE id = ?");
    if (!$stmt) {
        sendJsonResponse(['success' => false, 'message' => 'Error en prepare']);
    }
    
    $stmt->bind_param("ssi", $estado, $fecha_estado, $pedido_id);
    
    if ($stmt->execute()) {
        sendJsonResponse([
            'success' => true,
            'message' => 'Estado actualizado correctamente',
            'pedido_id' => $pedido_id,
            'estado' => $estado
        ]);
    } else {
        sendJsonResponse(['success' => false, 'message' => 'Error al actualizar estado']);
    }
}

function getEstadisticas($conn) {
    $fecha = $_GET['fecha'] ?? FECHA_ACTUAL;
    
    // Total reservas
    $stmt = $conn->prepare("SELECT SUM(reservados) as total FROM disponibilidad WHERE fecha = ?");
    $stmt->bind_param("s", $fecha);
    $stmt->execute();
    $totalReservas = $stmt->get_result()->fetch_assoc()['total'] ?? 0;
    
    // Total pedidos
    $stmt = $conn->prepare("SELECT COUNT(*) as total FROM pedidos WHERE fecha_desayuno = ?");
    $stmt->bind_param("s", $fecha);
    $stmt->execute();
    $totalPedidos = $stmt->get_result()->fetch_assoc()['total'] ?? 0;
    
    // Desglose por desayuno
    $stmt = $conn->prepare("SELECT desayunos FROM pedidos WHERE fecha_desayuno = ?");
    $stmt->bind_param("s", $fecha);
    $stmt->execute();
    $result = $stmt->get_result();
    
    $desglose = [1 => 0, 2 => 0, 3 => 0, 4 => 0];
    while ($row = $result->fetch_assoc()) {
        $desayunos = json_decode($row['desayunos'], true);
        if (is_array($desayunos)) {
            foreach ($desayunos as $d) {
                $id = $d['id'];
                if (isset($desglose[$id])) {
                    $desglose[$id] += (int)$d['cantidad'];
                }
            }
        }
    }
    
    // Resumen de estados
    $resumenEstados = [];
    $stmt = $conn->prepare("SELECT estado_cocina, COUNT(*) as total FROM pedidos WHERE fecha_desayuno = ? GROUP BY estado_cocina");
    $stmt->bind_param("s", $fecha);
    $stmt->execute();
    $resultEstados = $stmt->get_result();
    while ($row = $resultEstados->fetch_assoc()) {
        $resumenEstados[$row['estado_cocina']] = (int)$row['total'];
    }
    
    sendJsonResponse([
        'totalReservas' => (int)$totalReservas,
        'totalPedidos' => (int)$totalPedidos,
        'desglose' => $desglose,
        'estados' => $resumenEstados
    ]);
}

function getEstadosPedidos($conn) {
    $fecha = $_GET['fecha'] ?? FECHA_ACTUAL;
    
    $stmt = $conn->prepare("SELECT id, estado_cocina, fecha_estado FROM pedidos WHERE fecha_desayuno = ?");
    $stmt->bind_param("s", $fecha);
    $stmt->execute();
    $result = $stmt->get_result();
    
    $estados = [];
    while ($row = $result->fetch_assoc()) {
        $estados[$row['id']] = [
            'estado' => $row['estado_cocina'],
            'fecha_estado' => $row['fecha_estado']
        ];
    }
    
    sendJsonResponse($estados);
}

function getResumenEstados($conn) {
    $fecha = $_GET['fecha'] ?? FECHA_ACTUAL;
    
    $stmt = $conn->prepare("SELECT estado_cocina, COUNT(*) as total FROM pedidos WHERE fecha_desayuno = ? GROUP BY estado_cocina");
    $stmt->bind_param("s", $fecha);
    $stmt->execute();
    $result = $stmt->get_result();
    
    $resumen = ['nuevo' => 0, 'preparacion' => 0, 'listo' => 0, 'completado' => 0];
    while ($row = $result->fetch_assoc()) {
        $resumen[$row['estado_cocina']] = (int)$row['total'];
    }
    
    sendJsonResponse($resumen);
}

$conn->close();
?>