## Problem Description and Formulation

The problem is a classic example of a linear programming problem. West Moon Designs wants to maximize its profit by producing the optimal number of coffee tables and bookcases given the constraints on lacquer and mahogany availability.

Let's define the decision variables:
- \(x\): the number of coffee tables produced
- \(y\): the number of bookcases produced

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

Subject to the constraints:
1. Lacquer constraint: \( 5x + 7y \leq 120 \)
2. Mahogany constraint: \( 15x + 25y \leq 250 \)
3. Non-negativity constraints: \( x \geq 0, y \geq 0 \)

## Gurobi Code

To solve this problem using Gurobi in Python, we will use the Gurobi Python API. First, ensure you have Gurobi installed in your Python environment. You can install it via pip if you have the Gurobi license and the Gurobi solver installed on your machine.

```python
import gurobi as gp
from gurobi import GRB

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

# Define the variables
x = model.addVar(vtype=GRB.CONTINUOUS, name="coffee_tables")
y = model.addVar(vtype=GRB.CONTINUOUS, name="bookcases")

# Objective function: Maximize profit
model.setObjective(200*x + 300*y, GRB.MAXIMIZE)

# Add constraints
model.addConstr(5*x + 7*y <= 120, name="lacquer_constraint")
model.addConstr(15*x + 25*y <= 250, name="mahogany_constraint")

# Non-negativity constraints are inherently considered with CONTINUOUS variables
# But we explicitly add them for clarity
model.addConstr(x >= 0, name="x_non_negativity")
model.addConstr(y >= 0, name="y_non_negativity")

# Optimize the model
model.optimize()

# Print the results
if model.status == GRB.OPTIMAL:
    print(f"Optimal profit: ${model.objVal:.2f}")
    print(f"Coffee tables to produce: {x.varValue:.2f}")
    print(f"Bookcases to produce: {y.varValue:.2f}")
else:
    print("The problem is infeasible or unbounded.")
```