## Problem Description and Formulation

The problem is a linear programming optimization problem. The goal is to maximize the profit of a watch company that produces digital and analog watches. The company faces the following constraints:

- Demand constraints: at least 150 digital watches and at least 120 analog watches per day.
- Production limits: at most 200 digital watches and at most 180 analog watches per day.
- Contractual obligation: at least 300 watches of either type per day.

Let's denote:
- \(D\) as the number of digital watches produced per day,
- \(A\) as the number of analog watches produced per day.

The objective function to maximize profit is: \(15D + 10A\).

Subject to:
1. \(D \geq 150\)
2. \(A \geq 120\)
3. \(D \leq 200\)
4. \(A \leq 180\)
5. \(D + A \geq 300\)

## Gurobi Code

To solve this problem using Gurobi in Python, we will follow these steps:

```python
import gurobi

def solve_watch_problem():
    # Create a new model
    model = gurobi.Model()

    # Define variables
    D = model.addVar(lb=150, ub=200, name="Digital_Watches")  # Digital watches
    A = model.addVar(lb=120, ub=180, name="Analog_Watches")  # Analog watches

    # Objective function: Maximize profit
    model.setObjective(15*D + 10*A, gurobi.GRB.MAXIMIZE)

    # Constraints
    # Demand and production limits are already considered in variable definitions
    # Contractual obligation: D + A >= 300
    model.addConstr(D + A >= 300, name="Contract_Obligation")

    # Solve the model
    model.optimize()

    # Print solution
    if model.status == gurobi.GRB.OPTIMAL:
        print(f"Optimal production levels: Digital = {D.varValue}, Analog = {A.varValue}")
        print(f"Max Profit: ${15*D.varValue + 10*A.varValue}")
    else:
        print("No optimal solution found.")

# Run the function
solve_watch_problem()
```

However, the above formulation implicitly considers the demand and production limits as bounds of the variables. Let's adjust it for clarity and completeness:

```python
import gurobi

def solve_watch_problem():
    # Create a new model
    model = gurobi.Model()

    # Define variables
    D = model.addVar(name="Digital_Watches")
    A = model.addVar(name="Analog_Watches")

    # Objective function: Maximize profit
    model.setObjective(15*D + 10*A, gurobi.GRB.MAXIMIZE)

    # Constraints
    model.addConstr(D >= 150, name="Digital_Demand")
    model.addConstr(A >= 120, name="Analog_Demand")
    model.addConstr(D <= 200, name="Digital_Production_Limit")
    model.addConstr(A <= 180, name="Analog_Production_Limit")
    model.addConstr(D + A >= 300, name="Contract_Obligation")

    # Solve the model
    model.optimize()

    # Print solution
    if model.status == gurobi.GRB.OPTIMAL:
        print(f"Optimal production levels: Digital = {D.varValue}, Analog = {A.varValue}")
        print(f"Max Profit: ${15*D.varValue + 10*A.varValue}")
    else:
        print("No optimal solution found.")

# Run the function
solve_watch_problem()
```