<?php
// backend/deducciones/abonar_capital.php
header('Content-Type: application/json');
require_once __DIR__ . '/../db/conexion.php';

$data = json_decode(file_get_contents('php://input'), true);
if (!isset($data['id'], $data['abono'], $data['opcion'])) {
    echo json_encode(['success' => false, 'message' => 'Datos incompletos']);
    exit;
}

$id = intval($data['id']);
$abono = floatval($data['abono']);
$opcion = $data['opcion'];

// Obtener datos actuales de la deducción

$sql = "SELECT monto, interes_fijo, parcialidades, fecha_inicio_pago, fecha_fin, periodicidad, monto_por_parcialidad FROM deducciones WHERE id = ? LIMIT 1";
$stmt = $conn->prepare($sql);
$stmt->bind_param('i', $id);
$stmt->execute();
$result = $stmt->get_result();
if (!$row = $result->fetch_assoc()) {
    echo json_encode(['success' => false, 'message' => 'Deducción no encontrada']);
    exit;
}
$stmt->close();

$monto = floatval($row['monto']);
$interes = floatval($row['interes_fijo']);
$parcialidades = intval($row['parcialidades']);
$fecha_inicio = $row['fecha_inicio_pago'];
$fecha_fin = $row['fecha_fin'];
$periodicidad = isset($row['periodicidad']) ? strtolower($row['periodicidad']) : 'mensual';
$monto_por_parcialidad = isset($row['monto_por_parcialidad']) ? floatval($row['monto_por_parcialidad']) : 0;

$total = $monto + ($monto * ($interes / 100));

// Calcular el número real de parcialidades entre fecha_inicio y fecha_fin según periodicidad
function calcularPeriodosEntreFechas($fecha_inicio, $fecha_fin, $periodicidad) {
    $inicio = new DateTime($fecha_inicio);
    $fin = new DateTime($fecha_fin);
    if ($fin < $inicio) return 0;
    if (strpos($periodicidad, 'quincenal') !== false) {
        // Calcular quincenas
        $dias = $inicio->diff($fin)->days;
        return intval(round($dias / 15));
    } else {
        // Mensual
        $meses = ($fin->format('Y') - $inicio->format('Y')) * 12 + ($fin->format('m') - $inicio->format('m'));
        if ($fin->format('d') >= $inicio->format('d')) $meses++;
        return $meses;
    }
}

// Calcular pagos realizados hasta hoy

function calcularPagadas($fecha_inicio, $periodicidad, $parcialidades) {
    $hoy = new DateTime();
    $inicio = new DateTime($fecha_inicio);
    if ($hoy < $inicio) return 0;
    if (strpos($periodicidad, 'quincenal') !== false) {
        $dias = $inicio->diff($hoy)->days;
        $quincenas = intval(floor($dias / 15));
        return min($quincenas, $parcialidades);
    } else {
        $diff = $hoy->diff($inicio);
        $meses = ($diff->y * 12) + $diff->m;
        if ($hoy->d >= $inicio->d) $meses++;
        return min($meses, $parcialidades);
    }
}

$pagadas = calcularPagadas($fecha_inicio, $periodicidad, $parcialidades);
$pendientes = $parcialidades - $pagadas;
$saldo_pendiente = $total - (($total / $parcialidades) * $pagadas);
if ($abono > $saldo_pendiente) $abono = $saldo_pendiente;

if ($opcion === 'adelantar') {


    // Adelantar fecha fin: reducir número de pagos manteniendo el monto por pago (parcialidad fija)
    $nuevo_saldo = $saldo_pendiente - $abono;
    // Calcular monto real de la parcialidad considerando el interés fijo
    // Calcular la parcialidad real: (monto + (monto * (interes_fijo / 100))) / parcialidades
    $monto_real_parcialidad = $parcialidades > 0 ? ($monto + ($monto * ($interes / 100))) / $parcialidades : 0;
    // Si existe un nuevo monto a pagar, usarlo como referencia para los múltiplos
    $sql = "SELECT saldo_aportacion, parcialidadesPendientes, nuevo_monto_a_pagar FROM deducciones WHERE id = ? LIMIT 1";
    $stmt = $conn->prepare($sql);
    $stmt->bind_param('i', $id);
    $stmt->execute();
    $result = $stmt->get_result();
    $rowPend = $result->fetch_assoc();
    $stmt->close();
    $saldoAportacion = isset($rowPend['saldo_aportacion']) ? floatval($rowPend['saldo_aportacion']) : 0;
    $parcialidadesPendientesActual = isset($rowPend['parcialidadesPendientes']) ? intval($rowPend['parcialidadesPendientes']) : $pendientes;
    $nuevo_monto_a_pagar = isset($rowPend['nuevo_monto_a_pagar']) && $rowPend['nuevo_monto_a_pagar'] > 0 ? floatval($rowPend['nuevo_monto_a_pagar']) : null;
    $monto_parcialidad_referencia = $nuevo_monto_a_pagar !== null ? $nuevo_monto_a_pagar : $monto_real_parcialidad;

    // Sumar el abono actual al saldo acumulado
    $saldoAportacionNuevo = $saldoAportacion + $abono;
    $restar_parcialidades = 0;
    if ($monto_parcialidad_referencia > 0) {
        $restar_parcialidades = floor($saldoAportacionNuevo / $monto_parcialidad_referencia);
    }
    $nuevas_pendientes = $parcialidadesPendientesActual - $restar_parcialidades;
    if ($nuevas_pendientes < 0) $nuevas_pendientes = 0;
    // El saldo_aportacion restante es el sobrante menor a una parcialidad
    $saldoAportacionRestante = $saldoAportacionNuevo - ($restar_parcialidades * $monto_parcialidad_referencia);

    if ($restar_parcialidades > 0) {
        // Solo cuando se cubre al menos una parcialidad, se mueve a aportacionVoluntaria y se actualizan los campos
        // Calcular nueva fecha_fin según periodicidad
        // Nueva lógica: partir de la fecha_fin actual y restar periodos según pagos adelantados
        $fecha = new DateTime($fecha_fin);
        $periodos_a_restar = $restar_parcialidades;
        if ($periodos_a_restar > 0) {
            if (strpos($periodicidad, 'quincenal') !== false) {
                $fecha->modify('-' . ($periodos_a_restar * 15) . ' days');
            } else {
                // Mensual
                $fecha->modify('-' . $periodos_a_restar . ' months');
                // Ajustar día si el mes no tiene ese día
                $dia_original = (new DateTime($fecha_fin))->format('d');
                $ultimo_dia_mes = $fecha->format('t');
                if ($dia_original > $ultimo_dia_mes) {
                    $fecha->setDate($fecha->format('Y'), $fecha->format('m'), $ultimo_dia_mes);
                }
            }
        }
        $nueva_fecha_fin = $fecha->format('Y-m-d');
        $sql = "UPDATE deducciones SET parcialidadesPendientes = ?, fecha_fin = ?, saldo_aportacion = ?, aportacionVoluntaria = aportacionVoluntaria + ?, monto_cubierto = monto_cubierto + ? WHERE id = ?";
        $aportacion_a_sumar = $restar_parcialidades * $monto_parcialidad_referencia;
        $stmt = $conn->prepare($sql);
        $stmt->bind_param('issddi', $nuevas_pendientes, $nueva_fecha_fin, $saldoAportacionRestante, $aportacion_a_sumar, $aportacion_a_sumar, $id);
        $stmt->execute();
        $stmt->close();
        echo json_encode([
            'success' => true,
            'message' => 'Abono aplicado y fecha fin adelantada',
            'nuevas_pendientes' => $nuevas_pendientes,
            'nueva_fecha_fin' => $nueva_fecha_fin,
            'parcialidad_fija' => $monto_parcialidad_referencia,
            'ultimo_pago' => $saldoAportacionRestante > 0 ? $saldoAportacionRestante : $monto_parcialidad_referencia,
            'saldo_aportacion_restante' => $saldoAportacionRestante
        ]);
        exit;
    } else {
        // Si no se cubre una parcialidad, solo se suma a saldo_aportacion
        $sql = "UPDATE deducciones SET saldo_aportacion = ? WHERE id = ?";
        $stmt = $conn->prepare($sql);
        $stmt->bind_param('di', $saldoAportacionNuevo, $id);
        $stmt->execute();
        $stmt->close();
        echo json_encode([
            'success' => true,
            'message' => 'Abono guardado como saldo_aportacion (no cubre una parcialidad)',
            'saldo_aportacion_restante' => $saldoAportacionNuevo
        ]);
        exit;
    }
} elseif ($opcion === 'reducir') {
    // Siempre recalcular el nuevo monto a pagar usando el saldo pendiente real y las parcialidades pendientes actuales
    // Obtener saldo_aportacion y parcialidadesPendientes actuales
    $sql = "SELECT saldo_aportacion, parcialidadesPendientes, aportacionVoluntaria FROM deducciones WHERE id = ? LIMIT 1";
    $stmt = $conn->prepare($sql);
    $stmt->bind_param('i', $id);
    $stmt->execute();
    $result = $stmt->get_result();
    $rowPend = $result->fetch_assoc();
    $stmt->close();
    $saldoAportacion = isset($rowPend['saldo_aportacion']) ? floatval($rowPend['saldo_aportacion']) : 0;
    $parcialidadesPendientesActual = isset($rowPend['parcialidadesPendientes']) ? intval($rowPend['parcialidadesPendientes']) : $pendientes;
    $aportacionVoluntaria = isset($rowPend['aportacionVoluntaria']) ? floatval($rowPend['aportacionVoluntaria']) : 0;

    // Calcular el saldo pendiente real considerando abono, saldo_aportacion y aportacionVoluntaria
    $saldo_pendiente_real = $total - $aportacionVoluntaria - $saldoAportacion - $abono;
    if ($saldo_pendiente_real < 0) $saldo_pendiente_real = 0;
    $nuevas_pendientes = $parcialidadesPendientesActual;
    $nuevo_monto_parcialidad = $nuevas_pendientes > 0 ? $saldo_pendiente_real / $nuevas_pendientes : 0;

    // Guardar el nuevo monto a pagar en el campo nuevo_monto_a_pagar, sobrescribiendo el valor anterior
    $sql = "UPDATE deducciones SET nuevo_monto_a_pagar = ?, aportacionVoluntaria = aportacionVoluntaria + ?, monto_cubierto = monto_cubierto + ? WHERE id = ?";
    $stmt = $conn->prepare($sql);
    $stmt->bind_param('dddi', $nuevo_monto_parcialidad, $abono, $abono, $id);
    $stmt->execute();
    $stmt->close();
    echo json_encode(['success' => true, 'message' => 'Abono aplicado y monto de pagos reducido', 'nuevo_monto_a_pagar' => $nuevo_monto_parcialidad]);
    exit;
} else {
    echo json_encode(['success' => false, 'message' => 'Opción no válida']);
    exit;
}
$conn->close();
