<?php

function generarJsonFactura($pdo, $clienteId, $ventaId, $usuarioId) {
    // Obtener configuración de facturación y número de factura
    $stmtConfig = $pdo->prepare("SELECT * FROM configuracion_facturacion LIMIT 1");
    $stmtConfig->execute();
    $config = $stmtConfig->fetch(PDO::FETCH_ASSOC);
    
    // Usar el siguiente número de factura pero sin actualizarlo aún
    $numeroFactura = $config['factura_numero'] + 1;

    // Obtener datos del cliente
    $stmtCliente = $pdo->prepare("SELECT * FROM clientes WHERE id_cliente = ?");
    $stmtCliente->execute([$clienteId]);
    $cliente = $stmtCliente->fetch(PDO::FETCH_ASSOC);

    // Obtener datos del usuario
    $stmtUsuario = $pdo->prepare("SELECT * FROM usuarios WHERE id = ?");
    $stmtUsuario->execute([$usuarioId]);
    $usuario = $stmtUsuario->fetch(PDO::FETCH_ASSOC);

    // Depurar la consulta de items
    $stmtItems = $pdo->prepare("
        SELECT 
            vi.*, 
            p.codigo, 
            p.titulo, 
            p.iva,
            vi.dias_credito 
        FROM venta_items vi 
        INNER JOIN productos p ON vi.producto_id = p.id  -- Corregido de p.id_producto a p.id
        WHERE vi.venta_id = ?
    ");
    
   
    $stmtItems->execute([$ventaId]);
    $items = $stmtItems->fetchAll(PDO::FETCH_ASSOC);
    
   
    if (empty($items)) {
        // Verificar si la venta existe
        $stmtVenta = $pdo->prepare("SELECT COUNT(*) FROM ventas WHERE id = ?");
        $stmtVenta->execute([$ventaId]);
        $ventaExiste = $stmtVenta->fetchColumn();
        
        if ($ventaExiste) {
            throw new Exception("La venta existe pero no tiene items asociados");
        } else {
            throw new Exception("No se encontró la venta en la base de datos");
        }
    }

    // Calcular total de la venta
    $total = 0;
    foreach ($items as $item) {
        $total += $item['cantidad'] * $item['precio_unitario'];
    }

    // Construir array de items
    $jsonItems = [];
    foreach ($items as $item) {
        $jsonItems[] = [
            "codigo" => str_pad($item['codigo'], 7, "0", STR_PAD_LEFT),
            "descripcion" => $item['titulo'],
            "unidadMedida" => 77,
            "cantidad" => (float)$item['cantidad'],
            "precioUnitario" => (float)$item['precio_unitario'],
            "ivaTipo" => 1,
            "ivaBase" => 100,
            "iva" => (int)$item['iva']
        ];
    }

    // Obtener el tipo de condición del POST (1=contado, 2=crédito)
    $condicionTipo = isset($_POST['condicion_tipo']) ? (int)$_POST['condicion_tipo'] : 1;
    
    // Calcular días de crédito (usando el primer elemento de los items como referencia)
    $diasCredito = 0;
    if (!empty($items) && isset($items[0]['dias_credito'])) {
        $diasCredito = (int)$items[0]['dias_credito'];
    }
    
    // Calcular número de cuotas dividiendo los días de crédito por 30
    $numeroCuotas = $diasCredito > 0 ? ceil($diasCredito / 30) : 2; // Mínimo 1 cuota, por defecto 2
    
    // Asegurar que sea al menos 1 cuota
    $numeroCuotas = max(1, $numeroCuotas);
    
    // Para calcular el monto por cuota
    $montoEntrega = $condicionTipo == 2 ? (float)($total * 0.5) : 0; // 50% de entrada por defecto
    $montoPendiente = $total - $montoEntrega;
    $montoPorCuota = $numeroCuotas > 0 ? $montoPendiente / $numeroCuotas : $montoPendiente;

    // Construir el JSON completo
    $jsonData = [
        "tipoDocumento" => 1,
        "establecimiento" => (int)$config['establecimiento'],
        "punto" => $config['punto'],
        "numero" => $numeroFactura,  // Usar el nuevo número
        "descripcion" => "Factura de venta",
        "observacion" => "",
        "fecha" => date('Y-m-d\TH:i:s'),
        "tipoEmision" => 1,
        "tipoTransaccion" => 3,
        "tipoImpuesto" => 1,
        "moneda" => "PYG",
        "cliente" => [
            "contribuyente" => $cliente['tipo_contribuyente'] != 'No Contribuyente',
            "ruc" => $cliente['numero_documento'],
            "razonSocial" => $cliente['razon_social'],
            "nombreFantasia" => $cliente['razon_social'],
            "tipoOperacion" => $cliente['tipo_contribuyente'] != 'No Contribuyente' ? 1 : 2,
            "direccion" => "",
            "numeroCasa" => "",
            "departamento" => 0,
            "departamentoDescripcion" => "",
            "distrito" => 0,
            "distritoDescripcion" => "",
            "ciudad" => 0,
            "ciudadDescripcion" => "",
            "pais" => "PRY",
            "paisDescripcion" => "Paraguay",
            "tipoContribuyente" => $cliente['tipo_contribuyente'] == 'Persona Jurídica' ? 2 : 1,
            "documentoTipo" => determinarTipoDocumento($cliente['tipo_documento'], $cliente['numero_documento']),
            "documentoNumero" => $cliente['numero_documento'],
            "telefono" => $cliente['telefono_principal'],
            "celular" => $cliente['telefono_principal'],
            "email" => $cliente['email'],
            "codigo" => str_pad($cliente['id_cliente'], 5, "0", STR_PAD_LEFT)
        ],
        "usuario" => [
            "documentoTipo" => 1,
            "documentoNumero" => $usuario['documento'],
            "nombre" => $usuario['nombre'],
            "cargo" => "Vendedor"
        ],
        "factura" => [
            "presencia" => 1
        ],
        "condicion" => [
            "tipo" => $condicionTipo,  // 1=contado, 2=crédito
            "entregas" => $condicionTipo == 1 ? [
                [
                    "fecha" => date("Y-m-d"),
                    "monto" => (float)$total,
                    "tipo" => 1,  // 1=Efectivo
                    "moneda" => "PYG"  // Guaraníes
                ]
            ] : null,
            "credito" => $condicionTipo == 2 ? [
                "tipo" => 1,
                "plazo" => $diasCredito . " días",
                "cuotas" => $numeroCuotas,
                "montoEntrega" => (float)$montoEntrega,
                "infoCuotas" => generarInfoCuotas($numeroCuotas, $montoPorCuota, $diasCredito)
            ] : null
        ],
        "items" => $jsonItems
    ];

    return $jsonData;
}

function determinarTipoDocumento($tipoDoc, $numeroDoc) {
    if ($numeroDoc == 'x' || $numeroDoc == 'X') return 5;
    switch ($tipoDoc) {
        case 'CI': return 1;
        case 'Pasaporte': return 2;
        default: return 3;
    }
}

/**
 * Genera la información de cuotas para el JSON de la factura
 * 
 * @param int $numeroCuotas El número de cuotas a generar
 * @param float $montoPorCuota El monto de cada cuota
 * @param int $diasCredito Total de días de crédito
 * @return array Arreglo con la información de las cuotas
 */
function generarInfoCuotas($numeroCuotas, $montoPorCuota, $diasCredito) {
    $infoCuotas = [];
    
    // Calcular intervalo de días entre cada cuota
    $intervaloDias = ceil($diasCredito / $numeroCuotas);
    
    for ($i = 0; $i < $numeroCuotas; $i++) {
        $diasVencimiento = ($i + 1) * $intervaloDias;
        
        $infoCuotas[] = [
            "moneda" => "PYG",
            "monto" => (float)$montoPorCuota,
            "vencimiento" => date('Y-m-d', strtotime("+{$diasVencimiento} days"))
        ];
    }
    
    return $infoCuotas;
}