<?php
session_start();
header('Content-Type: application/json; charset=UTF-8');

require_once __DIR__ . '/../config/database.php';

function json_response($data, $code = 200) {
    http_response_code($code);
    echo json_encode($data, JSON_UNESCAPED_UNICODE);
    exit;
}

try {
    if (!isset($_SESSION['user']['codempleado'])) {
        json_response(['success' => false, 'message' => 'No autorizado'], 401);
    }

    $ventaId = isset($_POST['venta_id']) ? (int)$_POST['venta_id'] : 0;
    $cantidadMeses = isset($_POST['cantidad_meses']) ? (int)$_POST['cantidad_meses'] : 0;
    $diasInicioCobro = isset($_POST['dias_inicio_cobro']) ? (int)$_POST['dias_inicio_cobro'] : 0;
    $diasUltimo = isset($_POST['dias_ultimo']) ? (int)$_POST['dias_ultimo'] : 0;

    if ($ventaId <= 0 || $cantidadMeses <= 0 || $cantidadMeses > 120) {
        json_response(['success' => false, 'message' => 'Parámetros inválidos'], 400);
    }

    $database = new Database();
    $conn = $database->getConnection();

    // Verificar empresa del usuario
    $stmtEmpresa = $conn->prepare("SELECT codempresa FROM templeado WHERE codempleado = ?");
    $stmtEmpresa->execute([$_SESSION['user']['codempleado']]);
    $empresa = $stmtEmpresa->fetch(PDO::FETCH_ASSOC);
    if (!$empresa || !$empresa['codempresa']) {
        json_response(['success' => false, 'message' => 'No se encontró empresa del usuario'], 403);
    }
    $codempresaUsuario = $empresa['codempresa'];

    // Si no se enviaron días, obtener configuración desde la empresa
    if ($diasInicioCobro <= 0 || $diasUltimo <= 0) {
        $stmtCfg = $conn->prepare("SELECT iniciocobro, diasultimo FROM tempresa WHERE codempresa = ? LIMIT 1");
        $stmtCfg->execute([$codempresaUsuario]);
        $cfg = $stmtCfg->fetch(PDO::FETCH_ASSOC);
        if ($cfg) {
            if ($diasInicioCobro <= 0) { $diasInicioCobro = (int)($cfg['iniciocobro'] ?? 0); }
            if ($diasUltimo <= 0) { $diasUltimo = (int)($cfg['diasultimo'] ?? 0); }
        }
    }

    // Traer venta y validar pertenencia
    $stmtVenta = $conn->prepare("SELECT id, fecha_instalacion FROM timportventas WHERE id = ? AND codempresa = ?");
    $stmtVenta->execute([$ventaId, $codempresaUsuario]);
    $venta = $stmtVenta->fetch(PDO::FETCH_ASSOC);
    if (!$venta) {
        json_response(['success' => false, 'message' => 'Venta no encontrada o sin permisos'], 404);
    }

    // Obtener el número máximo de cuota como valor numérico
    $stmtUlt = $conn->prepare("SELECT MAX(nropago) as max_nropago FROM tcronogramaventas WHERE id = ?");
    $stmtUlt->execute([$ventaId]);
    $resultado_max = $stmtUlt->fetch(PDO::FETCH_ASSOC);
    
    if (!$resultado_max || $resultado_max['max_nropago'] === null) {
        json_response(['success' => false, 'message' => 'No se encontró cronograma existente'], 404);
    }
    
    // Convertir el número máximo a entero
    $max_nropago = (int)$resultado_max['max_nropago'];
    
    // Obtener la última cuota completa para obtener fecha_entrega, fechapago, fecha_iniciocobranza y monto
    $stmtUltima = $conn->prepare("SELECT * FROM tcronogramaventas WHERE id = ? AND nropago = ? LIMIT 1");
    $stmtUltima->execute([$ventaId, $max_nropago]);
    $ultima_cuota = $stmtUltima->fetch(PDO::FETCH_ASSOC);
    
    if (!$ultima_cuota || !$ultima_cuota['fechapago']) {
        json_response(['success' => false, 'message' => 'No se pudo obtener la información de la última cuota'], 404);
    }
    
    // Obtener la fecha de pago de la última cuota como base
    $ultima_fecha_pago = new DateTime($ultima_cuota['fechapago']);
    
    // Obtener la fecha de entrega de la última cuota como base
    $ultima_fecha_entrega = null;
    if ($ultima_cuota['fecha_entrega']) {
        // Si fecha_entrega es datetime, convertir a date
        $ultima_fecha_entrega = new DateTime($ultima_cuota['fecha_entrega']);
    }
    
    // Obtener el monto de la última cuota
    $monto = $ultima_cuota['monto'] ?? null;
    
    // Calcular la diferencia entre fecha_iniciocobranza y fechapago de la última cuota
    // para mantener la misma diferencia en las nuevas cuotas
    $diferencia_dias = 0;
    if ($ultima_cuota['fecha_iniciocobranza']) {
        $ultima_fecha_cobranza = new DateTime($ultima_cuota['fecha_iniciocobranza']);
        $diferencia = $ultima_fecha_cobranza->diff($ultima_fecha_pago);
        $diferencia_dias = $diferencia->days;
        // Si fecha_iniciocobranza es anterior a fechapago, la diferencia será negativa
        if ($ultima_fecha_cobranza < $ultima_fecha_pago) {
            $diferencia_dias = -$diferencia_dias;
        }
    } else {
        // Si no hay fecha_iniciocobranza, calcular usando los días
        $diferencia_dias = $diasUltimo - $diasInicioCobro;
    }

    $conn->beginTransaction();

    try {
        $meses_agregados = 0;
        
        for ($i = 1; $i <= $cantidadMeses; $i++) {
            // Calcular el nuevo número de pago
            $nuevo_nropago = $max_nropago + $i;
            
            // Calcular fecha de pago: última fecha de pago + i meses
            $fechaPago = clone $ultima_fecha_pago;
            $fechaPago->modify('+' . $i . ' month');
            
            // Calcular fecha de inicio de cobranza: fecha_pago manteniendo la misma diferencia de días
            $fechaInicioCobranza = clone $fechaPago;
            if ($diferencia_dias != 0) {
                if ($diferencia_dias < 0) {
                    // Si la diferencia es negativa, fecha_iniciocobranza es anterior a fechapago
                    $fechaInicioCobranza->modify('-' . abs($diferencia_dias) . ' day');
                } else {
                    // Si la diferencia es positiva, fecha_iniciocobranza es posterior a fechapago
                    $fechaInicioCobranza->modify('+' . $diferencia_dias . ' day');
                }
            }
            
            // Calcular fecha de entrega: última fecha_entrega + i meses
            $fechaEntrega = null;
            if ($ultima_fecha_entrega) {
                $fechaEntrega = clone $ultima_fecha_entrega;
                $fechaEntrega->modify('+' . $i . ' month');
            }

            $stmtIns = $conn->prepare("INSERT INTO tcronogramaventas (nropago, fecha_entrega, fecha_iniciocobranza, fechapago, estado, monto, pagadofecha, id, codempleado)
                                        VALUES (?, ?, ?, ?, 'PENDIENTE', ?, NULL, ?, ?)");
            $stmtIns->execute([
                $nuevo_nropago,
                $fechaEntrega ? $fechaEntrega->format('Y-m-d') : null,
                $fechaInicioCobranza->format('Y-m-d'),
                $fechaPago->format('Y-m-d'),
                $monto,
                $ventaId,
                $_SESSION['user']['codempleado']
            ]);
            
            $meses_agregados++;
        }
        
        $conn->commit();
        json_response(['success' => true, 'meses_agregados' => $meses_agregados]);
    } catch (Exception $e) {
        $conn->rollBack();
        throw $e;
    }
} catch (Throwable $e) {
    if (isset($conn) && $conn->inTransaction()) { $conn->rollBack(); }
    json_response(['success' => false, 'message' => 'Error del servidor: ' . $e->getMessage()], 500);
}


