<?php
// ? Errores (quitar en produccion)
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);

// ? CORS y Headers
header("Access-Control-Allow-Origin: *");
header("Access-Control-Allow-Headers: Content-Type");
header("Access-Control-Allow-Methods: POST, OPTIONS");
header("Content-Type: application/json; charset=utf-8");

if ($_SERVER['REQUEST_METHOD'] === 'OPTIONS') { http_response_code(200); exit; }

// ? Conexion
require_once(__DIR__ . '/../../config.php');
 $mysqli->set_charset("utf8mb4");
 
// ? JSON
 $input = json_decode(file_get_contents('php://input'), true);
if (!$input) {
    echo json_encode(['success'=>false,'message'=>'JSON inválido']);
    exit;
}

// --- VALIDACION DE PARAMETROS ---
 $slug_tienda = isset($input['slug_tienda']) ? trim($input['slug_tienda']) : '';
 $apertura_id = isset($input['apertura_id']) ? (int)$input['apertura_id'] : 0;
 $monto_final_real = isset($input['monto_final_real']) ? floatval($input['monto_final_real']) : 0;

if (!$slug_tienda || !$apertura_id) {
    echo json_encode(['success' => false, 'message' => 'Faltan parámetros requeridos.']);
    exit;
}

try {
    // --- OBTENER DATOS DE LA APERTURA ---
    $sql_apertura = "SELECT * FROM cierres_de_caja WHERE id = ? AND slug_tienda = ? AND estado = 'abierto'";
    $stmt = $mysqli->prepare($sql_apertura);
    $stmt->bind_param('is', $apertura_id, $slug_tienda);
    $stmt->execute();
    $result_apertura = $stmt->get_result();
    
    if ($result_apertura->num_rows === 0) {
        throw new Exception("No se encontró un turno abierto con ese ID.");
    }
    $datos_apertura = $result_apertura->fetch_assoc();
    $stmt->close();

    // --- CALCULAR RESUMEN DE VENTAS DEL TURNO ---
    $fecha_apertura = $datos_apertura['fecha_apertura'];
    $sql_ventas = "SELECT metodo_pago, SUM(total) as total_metodo FROM facturas WHERE slug_tienda = ? AND cajero = ? AND fecha >= ? AND estado = 'pagada' GROUP BY metodo_pago";
    $stmt = $mysqli->prepare($sql_ventas);
    $stmt->bind_param('sss', $slug_tienda, $datos_apertura['cajero'], $fecha_apertura);
    $stmt->execute();
    $result_ventas = $stmt->get_result()->fetch_all(MYSQLI_ASSOC);
    $stmt->close();
    
    $resumen_ventas = [];
    $ventas_efectivo = 0;
    foreach($result_ventas as $venta) {
        $resumen_ventas[$venta['metodo_pago']] = $venta['total_metodo'];
        if ($venta['metodo_pago'] === 'efectivo') {
            $ventas_efectivo = $venta['total_metodo'];
        }
    }
    $resumen_json = json_encode($resumen_ventas);

    // --- NUEVO: CALCULAR TOTAL DE GASTOS DEL TURNO ---
    $sql_gastos = "SELECT COALESCE(SUM(monto), 0) AS total_gastos FROM gastos WHERE apertura_id = ?";
    $stmt = $mysqli->prepare($sql_gastos);
    $stmt->bind_param('i', $apertura_id);
    $stmt->execute();
    $total_gastos = (float) $stmt->get_result()->fetch_assoc()['total_gastos'];
    $stmt->close();

    // --- NUEVO: CALCULAR MONTOS FINALES (RESTANDO GASTOS) ---
    $monto_final_esperado = $datos_apertura['monto_inicial'] + $ventas_efectivo - $total_gastos;
    $diferencia = $monto_final_real - $monto_final_esperado;

    // --- ACTUALIZAR Y CERRAR EL TURNO ---
    $sql_cierre = "UPDATE cierres_de_caja SET fecha_cierre = NOW(), resumen_ventas = ?, monto_final_esperado = ?, monto_final_real = ?, diferencia = ?, estado = 'cerrado' WHERE id = ?";
    $stmt = $mysqli->prepare($sql_cierre);
    $stmt->bind_param('sdddi', $resumen_json, $monto_final_esperado, $monto_final_real, $diferencia, $apertura_id);
    
    if (!$stmt->execute()) {
        throw new Exception("Error al cerrar la caja: " . $stmt->error);
    }
    $stmt->close();

    echo json_encode([
        'success' => true, 
        'message' => 'Turno cerrado correctamente.',
        'resumen' => [
            'datos_apertura' => $datos_apertura,
            'resumen_ventas' => $resumen_ventas,
            'ventas_efectivo' => $ventas_efectivo,
            'total_gastos' => $total_gastos, // <-- NUEVO
            'monto_final_esperado' => $monto_final_esperado,
            'monto_final_real' => $monto_final_real,
            'diferencia' => $diferencia
        ]
    ]);

} catch (Exception $e) {
    http_response_code(500);
    echo json_encode(['success' => false, 'message' => $e->getMessage()]);
} finally {
    if (isset($mysqli) && $mysqli) { $mysqli->close(); }
}
?>