<?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");

// --- INICIO DE LOGGING ---
 $logFile = __DIR__ . '/realizar_cierre_debug.log';
file_put_contents($logFile, "=== NUEVA PETICIÓN DE CIERRE A " . date('Y-m-d H:i:s') . " ===\n");
function logMessage($message) {
    global $logFile;
    file_put_contents($logFile, date('Y-m-d H:i:s') . " - " . $message . "\n", FILE_APPEND);
}

 $input = json_decode(file_get_contents('php://input'), true);
logMessage("Datos recibidos para el cierre: " . print_r($input, true));

if (!$input) {
    logMessage("ERROR: JSON inválido o vacío.");
    echo json_encode(['success'=>false,'message'=>'JSON inválido']);
    exit;
}

// Validación de parámetros
 $id_cierre = isset($input['id_cierre']) ? intval($input['id_cierre']) : 0;
 $slug_tienda = isset($input['slug_tienda']) ? trim($input['slug_tienda']) : '';
 $monto_final_real = isset($input['monto_final_real']) ? floatval($input['monto_final_real']) : 0;
 $diferencia = isset($input['diferencia']) ? floatval($input['diferencia']) : 0;
 $resumen_json = isset($input['resumen_json']) ? $input['resumen_json'] : '';
 $notas_cierre = isset($input['notas_cierre']) ? trim($input['notas_cierre']) : '';

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

try {
    $mysqli->begin_transaction();
    
    // 1. Obtener fecha de apertura del cierre (solo para facturas)
    logMessage("Obteniendo fecha de apertura del cierre con ID: $id_cierre");
    $check_sql = "SELECT fecha_apertura FROM cierres_de_caja WHERE id = ? AND slug_tienda = ?";
    $check_stmt = $mysqli->prepare($check_sql);
    $check_stmt->bind_param('is', $id_cierre, $slug_tienda);
    $check_stmt->execute();
    $check_result = $check_stmt->get_result();
    
    if ($check_result->num_rows === 0) {
        throw new Exception("No se encontró el cierre de caja especificado.");
    }
    
    $cierre_info = $check_result->fetch_assoc();
    $fecha_apertura = $cierre_info['fecha_apertura'];
    $check_stmt->close();
    
    $fecha_inicio_dia = date('Y-m-d 00:00:00', strtotime($fecha_apertura));
    logMessage("INFO DEL TURNO: Fecha Apertura='$fecha_apertura'. Se usará '$fecha_inicio_dia' para buscar facturas del turno.");
    
    // 2. Actualizar el cierre de caja
    // CORRECCIÓN: Se añade la coma que faltaba antes de 'notas_cierre'
    $sql = "UPDATE cierres_de_caja 
            SET fecha_cierre = NOW(), 
                monto_final_real = ?, 
                diferencia = ?, 
                resumen_ventas = ?, 
                estado = 'cerrado',
                notas_cierre = ?
            WHERE id = ?";
    $stmt = $mysqli->prepare($sql);
    $stmt->bind_param('ddssi', $monto_final_real, $diferencia, $resumen_json, $notas_cierre, $id_cierre);
    
    if (!$stmt->execute()) {
        throw new Exception("Error al actualizar el cierre de caja: " . $stmt->error);
    }
    $stmt->close();
    
    // 3. Actualizar las facturas (SOLO las del turno actual)
    $update_facturas_sql = "UPDATE facturas 
                           SET cierre_id = ?
                           WHERE slug_tienda = ? 
                           AND fecha >= ? -- Se mantiene el filtro de fecha para facturas
                           AND (cierre_id IS NULL OR cierre_id = 0)";
    $update_facturas_stmt = $mysqli->prepare($update_facturas_sql);
    $update_facturas_stmt->bind_param('iss', $id_cierre, $slug_tienda, $fecha_inicio_dia);
    
    logMessage("Ejecutando consulta de actualización de facturas del turno.");
    
    if (!$update_facturas_stmt->execute()) {
        throw new Exception("Error al actualizar las facturas: " . $update_facturas_stmt->error);
    }
    
    $facturas_actualizadas = $update_facturas_stmt->affected_rows;
    $update_facturas_stmt->close();
    
    logMessage("RESULTADO: Se encontraron y actualizaron $facturas_actualizadas facturas.");

    // --- 4. Actualizar TODAS las notas de crédito pendientes (sin filtro de fecha) ---
    $update_notas_sql = "UPDATE notas_credito 
                         SET cierre_id = ?
                         WHERE slug_tienda = ? 
                         AND (cierre_id IS NULL OR cierre_id = 0)";
    $update_notas_stmt = $mysqli->prepare($update_notas_sql);
    $update_notas_stmt->bind_param('is', $id_cierre, $slug_tienda);

    logMessage("Ejecutando consulta de actualización de TODAS las notas de crédito pendientes.");

    if (!$update_notas_stmt->execute()) {
        throw new Exception("Error al actualizar las notas de crédito: " . $update_notas_stmt->error);
    }

    $notas_actualizadas = $update_notas_stmt->affected_rows;
    $update_notas_stmt->close();

    logMessage("RESULTADO: Se encontraron y actualizaron $notas_actualizadas notas de crédito.");

    // --- 5. Actualizar TODOS los abonos a créditos pendientes (sin filtro de fecha) ---
    $update_abonos_sql = "UPDATE abonos_creditos 
                           SET cierre_id = ?
                           WHERE slug_tienda = ? 
                           AND (cierre_id IS NULL OR cierre_id = 0)";
    $update_abonos_stmt = $mysqli->prepare($update_abonos_sql);
    $update_abonos_stmt->bind_param('is', $id_cierre, $slug_tienda);

    logMessage("Ejecutando consulta de actualización de TODOS los abonos a créditos pendientes.");

    if (!$update_abonos_stmt->execute()) {
        throw new Exception("Error al actualizar los abonos a créditos: " . $update_abonos_stmt->error);
    }

    $abonos_actualizados = $update_abonos_stmt->affected_rows;
    $update_abonos_stmt->close();

    logMessage("RESULTADO: Se encontraron y actualizaron $abonos_actualizados abonos a créditos.");

    // --- NUEVO: 6. Actualizar los métodos de pago de las facturas cerradas ---
    $update_pagos_sql = "UPDATE factura_pagos fp
                          JOIN facturas f ON fp.factura_id = f.id
                          SET fp.cierre_id = ?
                          WHERE f.slug_tienda = ? 
                          AND f.fecha >= ?
                          AND (fp.cierre_id IS NULL OR fp.cierre_id = 0)";
    $update_pagos_stmt = $mysqli->prepare($update_pagos_sql);
    $update_pagos_stmt->bind_param('iss', $id_cierre, $slug_tienda, $fecha_inicio_dia);

    logMessage("Ejecutando consulta de actualización de métodos de pago.");

    if (!$update_pagos_stmt->execute()) {
        throw new Exception("Error al actualizar los métodos de pago: " . $update_pagos_stmt->error);
    }

    $pagos_actualizados = $update_pagos_stmt->affected_rows;
    $update_pagos_stmt->close();

    logMessage("RESULTADO: Se encontraron y actualizaron $pagos_actualizados registros de pago.");
    
    $mysqli->commit();
    
    echo json_encode([
        'success' => true, 
        'message' => 'Cierre de caja realizado con éxito.',
        'facturas_procesadas' => $facturas_actualizadas,
        'notas_procesadas' => $notas_actualizadas,
        'abonos_procesados' => $abonos_actualizados,
        'pagos_procesados' => $pagos_actualizados // <-- NUEVO en la respuesta
    ]);

} catch (Exception $e) {
    $mysqli->rollback();
    logMessage("EXCEPCIÓN CAPTURADA: " . $e->getMessage());
    http_response_code(500);
    echo json_encode(['success' => false, 'message' => $e->getMessage()]);
} finally {
    if (isset($mysqli) && $mysqli) { $mysqli->close(); }
    logMessage("--- FIN DEL SCRIPT ---\n");
}
?>