## Problem Description and Symbolic Representation

The problem is to maximize the profit of West Moon Designs by determining the optimal production plan for coffee tables and bookcases given the available resources (lacquer and mahogany).

### Symbolic Representation

Let's define the symbolic variables:
- $x_1$ : number of coffee tables produced
- $x_2$ : number of bookcases produced

The objective function to maximize profit is:
\[ \text{Maximize:} \quad 200x_1 + 300x_2 \]

The constraints based on the available resources are:
- Lacquer: $5x_1 + 7x_2 \leq 120$
- Mahogany: $15x_1 + 25x_2 \leq 250$
- Non-negativity: $x_1 \geq 0, x_2 \geq 0$

## Symbolic Representation in JSON Format

```json
{
    'sym_variables': [('x1', 'coffee tables'), ('x2', 'bookcases')],
    'objective_function': '200*x1 + 300*x2',
    'constraints': [
        '5*x1 + 7*x2 <= 120',
        '15*x1 + 25*x2 <= 250',
        'x1 >= 0',
        'x2 >= 0'
    ]
}
```

## Gurobi Code in Python

```python
import gurobipy as gp

# Create a new model
model = gp.Model("WestMoonDesigns")

# Define the variables
x1 = model.addVar(name="coffee_tables", lb=0, vtype=gp.GRB.CONTINUOUS)
x2 = model.addVar(name="bookcases", lb=0, vtype=gp.GRB.CONTINUOUS)

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

# Define the constraints
model.addConstr(5*x1 + 7*x2 <= 120, name="lacquer_constraint")
model.addConstr(15*x1 + 25*x2 <= 250, name="mahogany_constraint")

# Solve the model
model.optimize()

# Print the solution
if model.status == gp.GRB.OPTIMAL:
    print(f"Optimal production plan: {x1.varName} = {x1.x}, {x2.varName} = {x2.x}")
    print(f"Maximum profit: ${model.objVal:.2f}")
else:
    print("The model is infeasible or unbounded.")
```