To solve this problem, we first need to define the decision variables and the objective function. Let's denote the number of coffee tables produced as `x` and the number of bookcases produced as `y`. The profit from each coffee table is $200, and from each bookcase is $300. Therefore, the total profit, which is our objective function to maximize, can be represented as `200x + 300y`.

Next, we need to consider the constraints based on the availability of resources (lacquer and mahogany) and their usage by each product. For lacquer, we have 120 gallons available, with each coffee table requiring 5 gallons and each bookcase requiring 7 gallons. This gives us the constraint `5x + 7y <= 120`. For mahogany, we have 250 lengths available, with each coffee table needing 15 lengths and each bookcase needing 25 lengths, leading to the constraint `15x + 25y <= 250`.

Additionally, since we cannot produce a negative number of tables or bookcases, we have non-negativity constraints: `x >= 0` and `y >= 0`.

Now, let's translate this into Gurobi code in Python:

```python
from gurobipy import *

# Create a new model
m = Model("West_Moon_Designs")

# Define the decision variables
x = m.addVar(name="coffee_tables", vtype=GRB.CONTINUOUS, lb=0)
y = m.addVar(name="bookcases", vtype=GRB.CONTINUOUS, lb=0)

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

# Add constraints for lacquer and mahogany availability
m.addConstr(5*x + 7*y <= 120, name="lacquer_constraint")
m.addConstr(15*x + 25*y <= 250, name="mahogany_constraint")

# Optimize the model
m.optimize()

# Print the results
if m.status == GRB.OPTIMAL:
    print("Optimal solution found:")
    print(f"Coffee tables to produce: {x.x}")
    print(f"Bookcases to produce: {y.x}")
    print(f"Maximum profit: ${200*x.x + 300*y.x:.2f}")
else:
    print("No optimal solution found")
```