To solve Eric's problem, we first need to define the decision variables and the objective function. Let's denote the number of Combo X as $x$ and the number of Combo Y as $y$. The objective is to maximize profit, which can be calculated based on the profits from each combo.

The profit from selling $x$ Combo X units is $12x$, and the profit from selling $y$ Combo Y units is $15y$. Therefore, the total profit $P$ is given by:
\[ P = 12x + 15y \]

Now, we need to consider the constraints. Eric has a limited inventory of each item:

1. **Wireless Keyboards:** Each Combo X requires 2 wireless keyboards, and each Combo Y requires 1 wireless keyboard. Since Eric has 25 wireless keyboards, we have:
\[ 2x + y \leq 25 \]

2. **Wired Earbuds:** Only Combo Y uses wired earbuds, with each combo requiring 3 earbuds. Given that Eric has 13 wired earbuds, the constraint is:
\[ 3y \leq 13 \]

3. **USB Hubs:** Each Combo X requires 2 USB hubs, and each Combo Y requires 1 USB hub. With 19 USB hubs available, we get:
\[ 2x + y \leq 19 \]

4. **Non-Negativity Constraints:** Since Eric cannot prepare a negative number of combos, both $x$ and $y$ must be non-negative.

To solve this problem using Gurobi in Python, we'll define the model, add the variables, set up the objective function, and apply the constraints.

```python
from gurobipy import *

# Create a new model
m = Model("Eric's Combo Problem")

# Define the decision variables
x = m.addVar(name='Combo_X', vtype=GRB.INTEGER, lb=0)
y = m.addVar(name='Combo_Y', vtype=GRB.INTEGER, lb=0)

# Set the objective function to maximize profit
m.setObjective(12*x + 15*y, GRB.MAXIMIZE)

# Add constraints
m.addConstr(2*x + y <= 25, name='Wireless_Keyboards')
m.addConstr(3*y <= 13, name='Wired_Earbuds')
m.addConstr(2*x + y <= 19, name='USB_Hubs')

# Optimize the model
m.optimize()

# Print the solution
if m.status == GRB.OPTIMAL:
    print(f"Optimal Solution: Combo X = {x.x}, Combo Y = {y.x}")
    print(f"Total Profit: ${12*x.x + 15*y.x}")
else:
    print("No optimal solution found")
```