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

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

 $data = json_decode(file_get_contents('php://input'), true);
 $credito_id = $data['credito_id'] ?? 0;
 $monto_abono = $data['monto_abono'] ?? 0;
 $metodo_abono = $data['metodo_abono'] ?? '';
 $cajero = $data['cajero'] ?? '';
 $slug_tienda = $data['slug_tienda'] ?? '';

if (empty($credito_id) || $monto_abono <= 0 || empty($metodo_abono) || empty($slug_tienda)) {
    echo json_encode(['success' => false, 'message' => 'Datos incompletos para el abono.']);
    exit;
}

// Limpia los valores de entrada para evitar problemas
 $metodo_abono = trim($metodo_abono);
 $cajero = trim($cajero);

try {
    $mysqli->begin_transaction();

    // 1. Obtener y bloquear el crédito para evitar concurrencia
    $stmt = $mysqli->prepare("SELECT * FROM creditos WHERE id = ? AND slug_tienda = ? FOR UPDATE");
    $stmt->bind_param("is", $credito_id, $slug_tienda);
    $stmt->execute();
    $credito = $stmt->get_result()->fetch_assoc();
    $stmt->close();

    if (!$credito) {
        throw new Exception("Crédito no encontrado.");
    }

    if ($monto_abono > $credito['saldo_pendiente']) {
        throw new Exception("El monto del abono no puede ser mayor al saldo pendiente.");
    }

    // 2. Registrar el abono
    $stmt = $mysqli->prepare("INSERT INTO abonos_creditos (credito_id, factura_id, slug_tienda, monto_abono, metodo_abono, cajero) VALUES (?, ?, ?, ?, ?, ?)");
    $stmt->bind_param("iissss", $credito_id, $credito['factura_id'], $slug_tienda, $monto_abono, $metodo_abono, $cajero);
    if (!$stmt->execute()) {
        throw new Exception("Error al registrar el abono: " . $stmt->error);
    }
    $stmt->close();

    // 3. Actualizar el saldo pendiente y el estado del crédito
    $nuevo_saldo = $credito['saldo_pendiente'] - $monto_abono;
    $nuevo_estado = ($nuevo_saldo <= 0) ? 'cancelado' : 'activo';

    $stmt = $mysqli->prepare("UPDATE creditos SET saldo_pendiente = ?, estado = ?, updated_at = NOW() WHERE id = ?");
    $stmt->bind_param("dsi", $nuevo_saldo, $nuevo_estado, $credito_id);
    if (!$stmt->execute()) {
        throw new Exception("Error al actualizar el saldo del crédito: " . $stmt->error);
    }
    $stmt->close();

    $mysqli->commit();

    echo json_encode(['success' => true, 'message' => 'Abono registrado correctamente.', 'nuevo_saldo' => $nuevo_saldo, 'nuevo_estado' => $nuevo_estado]);

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