<?php
require_once __DIR__ . '/../config/database.php';
require_once __DIR__ . '/../includes/helpers.php';

require_post();
$data = json_input();
require_fields($data, ['cuenta_pagar_id', 'monto_abono', 'fecha_pago']);

$pdo = getConnection();

try {
    $pdo->beginTransaction();

    $cuenta_id = (int)$data['cuenta_pagar_id'];
    $monto = (float)$data['monto_abono'];
    $fecha_pago = $data['fecha_pago'];
    $tipo_pago = $data['tipo_pago'] ?? 'efectivo';
    $referencia = $data['referencia_pago'] ?? null;
    $notas = $data['notas'] ?? null;
    $usuario_id = (int)($data['usuario_id'] ?? 0);

    // Obtener la cuenta
    $stmt = $pdo->prepare("SELECT * FROM cuentas_pagar WHERE id = ? FOR UPDATE");
    $stmt->execute([$cuenta_id]);
    $cuenta = $stmt->fetch(PDO::FETCH_ASSOC);

    if (!$cuenta) {
        throw new Exception('Cuenta no encontrada');
    }

    if ($monto <= 0) {
        throw new Exception('El monto del abono debe ser mayor a cero');
    }

    if ($monto > (float)$cuenta['saldo_pendiente']) {
        throw new Exception('El abono no puede ser mayor al saldo pendiente (Q ' . number_format($cuenta['saldo_pendiente'], 2) . ')');
    }

    // Registrar abono
    $stmtAbono = $pdo->prepare("INSERT INTO abonos_proveedores (cuenta_pagar_id, compra_id, proveedor_id, monto_abono, tipo_pago, referencia_pago, fecha_pago, notas, usuario_id)
        VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)");
    $stmtAbono->execute([
        $cuenta_id,
        $cuenta['compra_id'],
        $cuenta['proveedor_id'],
        $monto,
        $tipo_pago,
        $referencia,
        $fecha_pago,
        $notas,
        $usuario_id ?: null
    ]);

    // Actualizar saldo pendiente
    $nuevo_saldo = round((float)$cuenta['saldo_pendiente'] - $monto, 2);
    $nuevo_estado = $nuevo_saldo <= 0 ? 'pagada' : 'parcial';

    $stmtUpdate = $pdo->prepare("UPDATE cuentas_pagar SET saldo_pendiente = ?, estado = ?, fecha_ultimo_pago = ? WHERE id = ?");
    $stmtUpdate->execute([$nuevo_saldo, $nuevo_estado, $fecha_pago, $cuenta_id]);

    // Si la compra asociada queda pagada, actualizar estado_pago en compras
    if ($nuevo_estado === 'pagada') {
        $pdo->prepare("UPDATE compras SET estado_pago = 'pagado' WHERE id = ?")->execute([$cuenta['compra_id']]);
    } elseif ($nuevo_estado === 'parcial') {
        $pdo->prepare("UPDATE compras SET estado_pago = 'pendiente' WHERE id = ? AND estado_pago = 'pagado'")->execute([$cuenta['compra_id']]);
    }

    $pdo->commit();
    json_success([
        'abono_id' => (int)$pdo->lastInsertId(),
        'nuevo_saldo' => $nuevo_saldo,
        'nuevo_estado' => $nuevo_estado
    ], 'Abono registrado correctamente');

} catch (Exception $e) {
    if ($pdo->inTransaction()) $pdo->rollBack();
    json_error($e->getMessage());
}
