## Step 1: Define the symbolic variables
Let's define the symbolic variables for the problem:
- $x_1$ represents the number of Combo X
- $x_2$ represents the number of Combo Y

## Step 2: Translate the objective function into symbolic notation
The objective is to maximize profit. Combo X yields a profit of $12 and Combo Y yields a profit of $15. Therefore, the objective function can be represented as:
\[ \text{Maximize:} \quad 12x_1 + 15x_2 \]

## 3: Define the constraints based on the inventory
- Eric has 25 wireless keyboards. Combo X contains 2 wireless keyboards and Combo Y contains 1 wireless keyboard. So, the constraint for wireless keyboards is:
\[ 2x_1 + x_2 \leq 25 \]
- He has 13 wired earbuds. Combo Y contains 3 wired earbuds, and Combo X contains none. So, the constraint for wired earbuds is:
\[ 3x_2 \leq 13 \]
- He has 19 USB hubs. Combo X contains 2 USB hubs and Combo Y contains 1 USB hub. So, the constraint for USB hubs is:
\[ 2x_1 + x_2 \leq 19 \]
- Additionally, $x_1 \geq 0$ and $x_2 \geq 0$ because the number of combos cannot be negative.

## 4: Symbolic representation of the problem
The symbolic representation is:
```json
{
'sym_variables': [('x1', 'Combo X'), ('x2', 'Combo Y')],
'objective_function': '12*x1 + 15*x2',
'constraints': [
    '2*x1 + x2 <= 25',
    '3*x2 <= 13',
    '2*x1 + x2 <= 19',
    'x1 >= 0',
    'x2 >= 0'
]
}
```

## 5: Convert the problem into Gurobi code
Now, let's convert this into Gurobi code in Python:
```python
import gurobipy as gp

# Create a new model
model = gp.Model("Eric's Combos")

# Define the variables
x1 = model.addVar(name="Combo_X", lb=0, vtype=gp.GRB.INTEGER)
x2 = model.addVar(name="Combo_Y", lb=0, vtype=gp.GRB.INTEGER)

# Define the objective function
model.setObjective(12*x1 + 15*x2, gp.GRB.MAXIMIZE)

# Add constraints
model.addConstr(2*x1 + x2 <= 25, name="Wireless_Keyboard_Constraint")
model.addConstr(3*x2 <= 13, name="Wired_Earbuds_Constraint")
model.addConstr(2*x1 + x2 <= 19, name="USB_Hubs_Constraint")

# Solve the model
model.optimize()

# Print the results
if model.status == gp.GRB.OPTIMAL:
    print(f"Optimal solution: x1 = {x1.varValue}, x2 = {x2.varValue}")
    print(f"Maximum profit: {model.objVal}")
else:
    print("No optimal solution found")
```