<?php
// backend/cron/actualizar_monto_cubierto.php
// Script para sumar monto_por_parcialidad a monto_cubierto cada quincena
date_default_timezone_set('America/Mexico_City');
require_once __DIR__ . '/../db/conexion.php';

// Seleccionar deducciones activas
$sql = "SELECT id, monto, interes_fijo, parcialidades, parcialidadesPendientes, monto_por_parcialidad, saldo_aportacion, aportacionVoluntaria, nuevo_monto_a_pagar, periodicidad, fecha_inicio_pago, fecha_fin, monto_cubierto FROM deducciones WHERE activo = 1";
$res = $conn->query($sql);
$actualizadas = 0;
if ($res) {
    while ($row = $res->fetch_assoc()) {
        $id = intval($row['id']);
        $monto = floatval($row['monto']);
        $interes = floatval($row['interes_fijo']);
        $parcialidades = intval($row['parcialidades']);
        $pendientes = intval($row['parcialidadesPendientes']);
        $monto_por_parcialidad = floatval($row['monto_por_parcialidad']);
        $nuevo_monto_a_pagar = isset($row['nuevo_monto_a_pagar']) ? floatval($row['nuevo_monto_a_pagar']) : 0;
        $saldo_aportacion = floatval($row['saldo_aportacion']);
        $aportacionVoluntaria = floatval($row['aportacionVoluntaria']);
        $periodicidad = isset($row['periodicidad']) ? strtolower($row['periodicidad']) : '';
        $fecha_inicio_pago = isset($row['fecha_inicio_pago']) ? $row['fecha_inicio_pago'] : null;
        $fecha_fin = isset($row['fecha_fin']) ? $row['fecha_fin'] : null;
        $monto_cubierto_actual = isset($row['monto_cubierto']) ? floatval($row['monto_cubierto']) : 0;

        // Calcular cuántos pagos deben haberse hecho hasta hoy (incluyendo el primer pago en la fecha de inicio)
        $pagos_realizados = 0;
        if ($fecha_inicio_pago) {
            $fecha_inicio = new DateTime($fecha_inicio_pago);
            $fecha_hoy = new DateTime();
            if ($fecha_hoy >= $fecha_inicio) {
                $intervalo = $fecha_inicio->diff($fecha_hoy);
                if ($periodicidad === 'quincenal') {
                    // Cada 15 días, contando el primer pago en la fecha de inicio
                    $dias = $intervalo->days;
                    $pagos_realizados = floor($dias / 15) + 1;
                } elseif ($periodicidad === 'mensual') {
                    // Lógica especial para mensual: solo cuenta un pago si no ha llegado el mismo día del mes siguiente
                    $fecha_inicio_dia = (int)$fecha_inicio->format('d');
                    $fecha_hoy_dia = (int)$fecha_hoy->format('d');
                    $pagos_realizados = 1; // Primer pago en la fecha de inicio
                    $fecha_pago = clone $fecha_inicio;
                    while (true) {
                        // Calcular siguiente fecha de pago
                        $anio = (int)$fecha_pago->format('Y');
                        $mes = (int)$fecha_pago->format('m') + 1;
                        if ($mes > 12) {
                            $mes = 1;
                            $anio++;
                        }
                        // Obtener último día del mes
                        $ultimo_dia_mes = (int)date('t', strtotime($anio.'-'.$mes.'-01'));
                        $dia_pago = min($fecha_inicio_dia, $ultimo_dia_mes);
                        $fecha_pago_siguiente = DateTime::createFromFormat('Y-m-d', sprintf('%04d-%02d-%02d', $anio, $mes, $dia_pago));
                        if ($fecha_pago_siguiente <= $fecha_hoy) {
                            $pagos_realizados++;
                            $fecha_pago = $fecha_pago_siguiente;
                        } else {
                            break;
                        }
                    }
                }
            }
        }

        // Calcular cuántos pagos ya se han descontado
        $pagos_descuento = $parcialidades - $pendientes;
        $pagos_a_realizar = max(0, $pagos_realizados - $pagos_descuento);

        if ($pagos_a_realizar > 0 && $pendientes > 0) {
            $monto_base = ($nuevo_monto_a_pagar > 0) ? $nuevo_monto_a_pagar : $monto_por_parcialidad;
            $descuento = min($pagos_a_realizar, $pendientes);
            $nuevo_pendientes = $pendientes - $descuento;
            $nuevo_monto_cubierto = $monto_cubierto_actual + ($descuento * $monto_base);
            // Actualizar en base de datos
            $sqlU = "UPDATE deducciones SET parcialidadesPendientes = ?, monto_cubierto = ? WHERE id = ?";
            $stmt = $conn->prepare($sqlU);
            $stmt->bind_param('idi', $nuevo_pendientes, $nuevo_monto_cubierto, $id);
            $stmt->execute();
            $stmt->close();
            $actualizadas++;
        }
    }
}
echo json_encode([
    'success' => true,
    'message' => "Deducciones actualizadas: $actualizadas"
]);
?>
