<?php
// reversar_abono.php (Versión Final Corregida)

// --- FUNCIÓN DE LOGGING ---
function logMessage($message) {
    $logFile = __DIR__ . '/log.txt';
    $timestamp = date('Y-m-d H:i:s');
    $logEntry = "[{$timestamp}] - {$message}\n";
    file_put_contents($logFile, $logEntry, FILE_APPEND);
}

// Iniciar buffer de salida
ob_start();

// ? Errores (quitar en producción)
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; }

// ? Conexión
require_once(__DIR__ . '/../config.php');
 $mysqli->set_charset("utf8mb4");

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

// --- VALIDACIÓN DE PARÁMETROS ---
 $slug_tienda = isset($input['slug_tienda']) ? trim($input['slug_tienda']) : '';
 $abono_id = isset($input['abono_id']) ? (int)$input['abono_id'] : 0;
 $credito_id = isset($input['credito_id']) ? (int)$input['credito_id'] : 0;
 $cajero = trim($input['cajero'] ?? '');

logMessage("=== INICIO DE REVERSION DE ABONO ===");
logMessage("Parámetros recibidos: " . json_encode($input));

if (!$slug_tienda || !$abono_id || !$credito_id) {
    logMessage("ERROR: Faltan parámetros. slug_tienda={$slug_tienda}, abono_id={$abono_id}, credito_id={$credito_id}");
    echo json_encode(['success' => false, 'message' => 'Faltan parámetros para reversar el abono.']);
    exit;
}

 $mysqli->begin_transaction();
logMessage("Transacción iniciada.");

try {
    // 1. Obtener la información del abono a reversar
    logMessage("PASO 1: Buscando información del abono ID {$abono_id} para el crédito {$credito_id}...");
    $stmt = $mysqli->prepare("SELECT monto_abono, factura_id FROM abonos_creditos WHERE id = ? AND credito_id = ? AND slug_tienda = ?");
    $stmt->bind_param("iis", $abono_id, $credito_id, $slug_tienda);
    $stmt->execute();
    $abono = $stmt->get_result()->fetch_assoc();
    $stmt->close();

    if (!$abono) {
        logMessage("ERROR: Abono no encontrado o no pertenece a este crédito.");
        throw new Exception("Abono no encontrado o no pertenece a este crédito.");
    }
    $monto_a_devolver = $abono['monto_abono'];
    $factura_id = $abono['factura_id'];
    logMessage("Abono encontrado. Monto a devolver: {$monto_a_devolver}, Factura ID: {$factura_id}");

    // 2. Eliminar el abono
    logMessage("PASO 2: Eliminando el abono ID {$abono_id}...");
    $stmt = $mysqli->prepare("DELETE FROM abonos_creditos WHERE id = ?");
    $stmt->bind_param("i", $abono_id);
    $stmt->execute();
    $affected_rows = $stmt->affected_rows;
    $stmt->close();
    
    if ($affected_rows === 0) {
        logMessage("ERROR: No se pudo eliminar el abono. Filas afectadas: 0.");
        throw new Exception("No se pudo eliminar el abono. Es posible que ya haya sido reversado.");
    }
    logMessage("Abono eliminado correctamente. Filas afectadas: {$affected_rows}");

    // 3. Actualizar el saldo pendiente del crédito
    logMessage("PASO 3: Actualizando saldo del crédito ID {$credito_id}. Sumando {$monto_a_devolver}...");
    $stmt = $mysqli->prepare("UPDATE creditos SET saldo_pendiente = saldo_pendiente + ?, estado = 'activo' WHERE id = ?");
    $stmt->bind_param("di", $monto_a_devolver, $credito_id);
    $stmt->execute();
    $stmt->close();
    logMessage("Saldo del crédito actualizado.");

    // 4. Revertir los cambios en el plan de pagos (LÓGICA LIFO)
    logMessage("PASO 4: Revirtiendo plan de pagos...");
    // CORRECCIÓN: Buscar cuotas con el estado 'pagada' (palabra completa)
    $stmt = $mysqli->prepare("SELECT id, valor_cuota, monto_pagado FROM plan_pagos_creditos WHERE credito_id = ? AND estado = 'pagada' ORDER BY fecha_pago DESC, id DESC");
    $stmt->bind_param("i", $credito_id);
    $stmt->execute();
    $cuotas_pagadas = $stmt->get_result()->fetch_all(MYSQLI_ASSOC);
    $stmt->close();
    
    $restante_por_devolver = $monto_a_devolver;
    logMessage("Se encontraron " . count($cuotas_pagadas) . " cuotas pagadas. Monto restante por devolver: {$restante_por_devolver}");

    foreach ($cuotas_pagadas as $cuota) {
        if ($restante_por_devolver <= 0) break;

        $monto_pagado_actual = $cuota['monto_pagado'];
        $valor_cuota = $cuota['valor_cuota'];
        
        $monto_a_descontar = min($restante_por_devolver, $monto_pagado_actual);
        $nuevo_monto_pagado = $monto_pagado_actual - $monto_a_descontar;
        
        // CORRECCIÓN: Usar 'pendiente' y 'pagada' (palabras completas)
        $nuevo_estado = ($nuevo_monto_pagado <= 0) ? 'pendiente' : 'pagada';
        $fecha_pago = ($nuevo_estado === 'pendiente') ? null : $cuota['fecha_pago'];

        logMessage("Actualizando cuota ID {$cuota['id']}: Monto a descontar={$monto_a_descontar}, Nuevo monto pagado={$nuevo_monto_pagado}, Nuevo estado={$nuevo_estado}");

        $stmt = $mysqli->prepare("UPDATE plan_pagos_creditos SET monto_pagado = ?, estado = ?, fecha_pago = ? WHERE id = ?");
        $stmt->bind_param("dssi", $nuevo_monto_pagado, $nuevo_estado, $fecha_pago, $cuota['id']);
        $stmt->execute();
        $stmt->close();
        
        $restante_por_devolver -= $monto_a_descontar;
    }
    logMessage("Reversión del plan de pagos completada. Restante por devolver final: {$restante_por_devolver}");

    // 5. Revertir el estado de la factura si es necesario
    logMessage("PASO 5: Verificando estado de la factura ID {$factura_id}...");
    // CORRECCIÓN: Buscar facturas con el estado 'pagada' (palabra completa)
    $stmt_factura = $mysqli->prepare("SELECT total FROM facturas WHERE id = ? AND estado = 'pagada'");
    $stmt_factura->bind_param("i", $factura_id);
    $stmt_factura->execute();
    $factura = $stmt_factura->get_result()->fetch_assoc();
    $stmt_factura->close();

    if ($factura) {
        $total_factura = $factura['total'];
        $stmt_sum_abonos = $mysqli->prepare("SELECT SUM(monto_abono) AS total_abonado FROM abonos_creditos WHERE factura_id = ?");
        $stmt_sum_abonos->bind_param("i", $factura_id);
        $stmt_sum_abonos->execute();
        $resultado_sum = $stmt_sum_abonos->get_result()->fetch_assoc();
        $stmt_sum_abonos->close();
        
        $total_abonado = $resultado_sum['total_abonado'] ?? 0;
        logMessage("Totales de factura - Total: {$total_factura}, Abonado: {$total_abonado}");

        if ($total_abonado < $total_factura) {
            logMessage("El total abonado es menor. Actualizando estado de factura a 'pendiente'.");
            // CORRECCIÓN: Usar 'pendiente' como estado lógico
            $stmt_update_factura = $mysqli->prepare("UPDATE facturas SET estado = 'pendiente' WHERE id = ?");
            $stmt_update_factura->bind_param("i", $factura_id);
            $stmt_update_factura->execute();
            $stmt_update_factura->close();
        } else {
            logMessage("El estado de la factura no necesita cambios.");
        }
    } else {
        logMessage("La factura no estaba en estado 'pagada' o no se encontró. No se requiere acción.");
    }

    // 6. Registrar la reversión en el historial
    logMessage("PASO 6: Registrando la reversión en el historial...");
    $motivo = "Reversion del abono ID: " . $abono_id;
    logMessage("MOTIVO A GUARDAR: " . $motivo);
    $stmt_rev = $mysqli->prepare("INSERT INTO reversiones_abonos (abono_id, credito_id, slug_tienda, monto_reversado, cajero_reversion, motivo) VALUES (?, ?, ?, ?, ?, ?)");
    $stmt_rev->bind_param("iisdss", $abono_id, $credito_id, $slug_tienda, $monto_a_devolver, $cajero, $motivo);
    $stmt_rev->execute();
    $stmt_rev->close();
    logMessage("Reversión registrada en el historial.");

    $mysqli->commit();
    logMessage("Transacción commitiada con éxito.");

    $response = [
        'success' => true,
        'message' => 'Abono reversado con éxito.'
    ];

} catch (Exception $e) {
    $mysqli->rollback();
    logMessage("ERROR: " . $e->getMessage());
    logMessage("Transacción rollbackeada.");
    http_response_code(400); // Bad Request
    $response = [
        'success' => false, 
        'message' => $e->getMessage()
    ];
} finally {
    if (isset($mysqli) && $mysqli) { 
        $mysqli->close(); 
        logMessage("Conexión a la base de datos cerrada.");
    }
}

// --- LÓGICA DE DEPURACIÓN FINAL ---
logMessage("Respuesta final a enviar: " . json_encode($response));
 $php_output = ob_get_clean();

if (!empty($php_output)) {
    logMessage("ERROR DE SALIDA: Se detectó salida no deseada. " . $php_output);
    http_response_code(500);
    echo json_encode([
        'success' => false,
        'message' => 'Error de PHP inesperado.',
        'php_output' => $php_output
    ]);
} else {
    echo json_encode($response);
}
logMessage("=== FIN DE LA REVERSION DE ABONO ===\n");
?>