<?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) {
        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'];

    // Verificar que la venta pertenezca a la empresa y obtener datos
    $stmtVenta = $conn->prepare("SELECT id, fecha_instalacion, cargo_fijo 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);
    }

    // Verificar que no exista ya un cronograma
    $stmtCronograma = $conn->prepare("SELECT COUNT(*) as count FROM tcronogramaventas WHERE id = ?");
    $stmtCronograma->execute([$ventaId]);
    $cronogramaExists = $stmtCronograma->fetch(PDO::FETCH_ASSOC)['count'] > 0;
    
    if ($cronogramaExists) {
        json_response(['success' => false, 'message' => 'Ya existe un cronograma para esta venta'], 400);
    }

    // Calcular fechas base
    $fechaInstalacion = $venta['fecha_instalacion'];
    if (!$fechaInstalacion) {
        json_response(['success' => false, 'message' => 'La venta no tiene fecha de instalación'], 400);
    }

    $fechaBase = new DateTime($fechaInstalacion);
    $monto = $venta['cargo_fijo'] ? (float)$venta['cargo_fijo'] : 0;

    // Generar cronograma
    $conn->beginTransaction();
    
    try {
        $mesesGenerados = 0;
        
        for ($i = 1; $i <= $cantidadMeses; $i++) {
            // Calcular fecha de pago (mes siguiente menos días último)
            $fechaPago = clone $fechaBase;
            $fechaPago->modify("+{$i} month");
            if ($diasUltimo > 0) {
                $fechaPago->modify("-{$diasUltimo} days");
            }
            
            // Calcular fecha de inicio de cobranza (mes siguiente menos días inicio cobro)
            $fechaInicioCobranza = clone $fechaBase;
            $fechaInicioCobranza->modify("+{$i} month");
            if ($diasInicioCobro > 0) {
                $fechaInicioCobranza->modify("-{$diasInicioCobro} days");
            }
            
            // Calcular fecha de entrega (mes actual)
            $fechaEntrega = clone $fechaBase;
            $fechaEntrega->modify("+" . ($i - 1) . " month");
            
            // Insertar cuota
            $stmt = $conn->prepare("INSERT INTO tcronogramaventas (
                id, nropago, fecha_entrega, fecha_iniciocobranza, fechapago, 
                estado, monto
            ) VALUES (?, ?, ?, ?, ?, 'PENDIENTE', ?)");
            
            $stmt->execute([
                $ventaId,
                $i,
                $fechaEntrega->format('Y-m-d'),
                $fechaInicioCobranza->format('Y-m-d'),
                $fechaPago->format('Y-m-d'),
                $monto
            ]);
            
            $mesesGenerados++;
        }
        
        $conn->commit();
        
        json_response([
            'success' => true, 
            'message' => 'Cronograma generado correctamente',
            'meses_generados' => $mesesGenerados
        ]);
        
    } catch (Exception $e) {
        $conn->rollBack();
        throw $e;
    }

} catch (Throwable $e) {
    json_response(['success' => false, 'message' => 'Error del servidor: ' . $e->getMessage()], 500);
}
