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

// ? CORS
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");
header("Access-Control-Max-Age: 86400");

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

// ? CAMBIO CLAVE: Iniciar buffer de salida para capturar cualquier error o warning
// y no corrupter la respuesta JSON.
ob_start();

// Forzar que mysqli lance excepciones en errores
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);

function log_step($step) {
    // En producción, podrías enviar estos logs a un archivo en lugar del error_log por defecto
    error_log("REFINANCIAR STEP: " . $step);
}

// Inicializar la respuesta por defecto
 $response = ['success' => false, 'message' => ''];

try {
    log_step("Script started.");

    // ? CAMBIO 2: Incluir y verificar la conexión de forma segura
    require_once(__DIR__ . '/../config.php');
    log_step("config.php included.");

    if (!isset($mysqli) || !$mysqli instanceof mysqli) {
        throw new Exception("Error crítico: No se pudo establecer la conexión a la base de datos desde config.php.");
    }

    // ? CAMBIO 3: Establecer el charset justo después de verificar la conexión
    $mysqli->set_charset("utf8mb4");
    log_step("Charset set to utf8mb4.");

    $data = json_decode(file_get_contents("php://input"));

    if (isset($data->slug_tienda) && isset($data->credito_id) && isset($data->saldo_pendiente_actual) && isset($data->nuevas_cuotas) && isset($data->nuevo_interes)) {
        
        log_step("Inside main IF block.");
        
        // Iniciar la transacción principal
        $mysqli->begin_transaction();
        log_step("Transaction started.");

        // 1. Validar y limpiar datos de entrada
        log_step("Validating input data.");
        $slug_tienda = $mysqli->real_escape_string($data->slug_tienda);
        $credito_id = (int)$data->credito_id;
        $saldo_pendiente_actual = (float)$data->saldo_pendiente_actual;
        $nuevas_cuotas = (int)$data->nuevas_cuotas;
        $nuevo_interes = (float)$data->nuevo_interes;
        
        if ($credito_id <= 0 || $saldo_pendiente_actual <= 0 || $nuevas_cuotas <= 0 || $nuevo_interes < 0) {
            throw new Exception("Datos inválidos. Todos los valores numéricos deben ser positivos.");
        }
        log_step("Input data validated.");
        
        // 2. Verificar que el crédito existe y está activo
        log_step("Checking credit existence and status.");
        $query = "SELECT id, estado FROM creditos WHERE id = ? AND slug_tienda = ?";
        $stmt = $mysqli->prepare($query);
        $stmt->bind_param("is", $credito_id, $slug_tienda);
        $stmt->execute();
        $result = $stmt->get_result();
        
        if ($result->num_rows === 0) {
            throw new Exception("El crédito especificado no existe o no pertenece a esta tienda.");
        }
        
        $credito = $result->fetch_assoc();
        if ($credito['estado'] !== 'activo') {
            throw new Exception("Solo se pueden refinanciar créditos con estado 'activo'. Estado actual: " . $credito['estado']);
        }
        log_step("Credit is active and valid.");

        // 3. Calcular nuevo valor de cuota y total
        log_step("Calculating new values.");
        $total_con_interes = $saldo_pendiente_actual * (1 + $nuevo_interes / 100);
        $nuevo_valor_cuota = $total_con_interes / $nuevas_cuotas;
        log_step("New values calculated. Total: " . $total_con_interes . ", Cuota: " . $nuevo_valor_cuota);
        
        // 4. Actualizar el crédito
        log_step("Updating credit table.");
        $update_query = "UPDATE creditos SET cuotas_totales = ?, valor_cuota = ?, valor_interes = ?, saldo_pendiente = ? WHERE id = ?";
        $update_stmt = $mysqli->prepare($update_query);
        $update_stmt->bind_param("idddi", $nuevas_cuotas, $nuevo_valor_cuota, $nuevo_interes, $total_con_interes, $credito_id);
        $update_stmt->execute();
        log_step("Credit table updated.");
        
        // 5. Eliminar el plan de pago anterior
        log_step("Deleting old payment plan.");
        $delete_plan = "DELETE FROM plan_pagos_creditos WHERE credito_id = ?";
        $delete_stmt = $mysqli->prepare($delete_plan);
        $delete_stmt->bind_param("i", $credito_id);
        $delete_stmt->execute();
        log_step("Old payment plan deleted.");
        
        // 6. Crear nuevo plan de pago
        log_step("Creating new payment plan.");
        $fecha_actual = date('Y-m-d');
        $insert_plan = "INSERT INTO plan_pagos_creditos (credito_id, numero_cuota, valor_cuota, fecha_vencimiento, estado) VALUES (?, ?, ?, ?, 'pendiente')";
        $insert_stmt = $mysqli->prepare($insert_plan);
        
        for ($i = 1; $i <= $nuevas_cuotas; $i++) {
            $fecha_vencimiento = date('Y-m-d', strtotime($fecha_actual . ' + ' . $i . ' month'));
            $insert_stmt->bind_param("iids", $credito_id, $i, $nuevo_valor_cuota, $fecha_vencimiento);
            $insert_stmt->execute();
        }
        log_step("New payment plan created.");
        
        // 7. Registrar en el historial
        log_step("Inserting into history.");
        $insert_historial = "INSERT INTO historial_crediticio (credito_id, tipo_movimiento, descripcion, fecha_movimiento, usuario_id) VALUES (?, 'refinanciamiento', ?, NOW(), 1)";
        $descripcion = "Crédito refinanciado a {$nuevas_cuotas} cuotas con interés del {$nuevo_interes}%. Saldo anterior: " . $saldo_pendiente_actual;
        $descripcion = utf8_encode($descripcion);
        $historial_stmt = $mysqli->prepare($insert_historial);
        $historial_stmt->bind_param("is", $credito_id, $descripcion);
        $historial_stmt->execute();
        log_step("Inserted into history.");
        
        // 8. Confirmar transacción
        $mysqli->commit();
        log_step("Transaction committed.");
        
        // Si todo salió bien, preparamos la respuesta de éxito
        $response['success'] = true;
        $response['message'] = "Crédito refinanciado correctamente.";
        $response['data'] = [
            'nuevo_valor_cuota' => $nuevo_valor_cuota,
            'nuevo_saldo_pendiente' => $total_con_interes
        ];
        
    } else {
        log_step("ERROR: Missing required data in request.");
        throw new Exception("Faltan datos requeridos para el refinanciamiento (slug_tienda, credito_id, saldo_pendiente_actual, nuevas_cuotas, nuevo_interes).");
    }

} catch (Throwable $e) { // Throwable captura errores y excepciones
    log_step("CATCH block activated. Rolling back. Error: " . $e->getMessage());
    
    // Si la transacción fue iniciada, hacer rollback
    if (isset($mysqli) && $mysqli->ping()) {
        $mysqli->rollback();
    }
    
    // ? CAMBIO 4: Limpiar el buffer de salida para eliminar cualquier error/warning de PHP
    ob_clean();
    
    // Establecer código de respuesta de error del servidor
    http_response_code(500); // Internal Server Error
    
    // Asegurar que el content-type es JSON
    header('Content-Type: application/json');
    
    // Preparar y enviar la respuesta de error
    $response['message'] = $e->getMessage();
    // Opcional: en desarrollo, puedes incluir el trace para más detalles
    // $response['trace'] = $e->getTraceAsString();
    
    echo json_encode($response);
    exit; // Detener la ejecución del script
} finally {
    // ? CAMBIO 5: Cerrar siempre la conexión en el bloque finally
    log_step("FINALLY block: Closing connection.");
    if (isset($mysqli) && $mysqli) {
        $mysqli->close();
    }
}

// Si no hubo excepciones, limpiamos el buffer (que debería estar vacío) y enviamos la respuesta de éxito
ob_end_clean();
header('Content-Type: application/json');
echo json_encode($response);

log_step("Script finished successfully.");
?>