To solve this optimization problem, we need to maximize the profit from selling almond bubble tea and ginger bubble tea, given the constraints on demand and production capacity. Let's break down the problem into its components:

- Decision Variables: \(x_1\) (number of bottles of almond bubble tea) and \(x_2\) (number of bottles of ginger bubble tea).
- Objective Function: Maximize profit \(P = 5x_1 + 9x_2\), since each bottle of almond bubble tea contributes $5 to the profit and each bottle of ginger bubble tea contributes $9.
- Constraints:
  - Demand constraints: \(x_1 \leq 120\) (almond bubble tea) and \(x_2 \leq 200\) (ginger bubble tea).
  - Production capacity constraint: \(x_1 + x_2 \leq 300\).
  - Non-negativity constraints: \(x_1 \geq 0\) and \(x_2 \geq 0\), since the number of bottles produced cannot be negative.

Given these components, we can formulate this problem as a linear programming (LP) problem. Here's how we translate this into Gurobi code in Python:

```python
from gurobipy import *

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

# Decision variables
x1 = m.addVar(lb=0, name="almond_bubble_tea")
x2 = m.addVar(lb=0, name="ginger_bubble_tea")

# Objective function: Maximize profit
m.setObjective(5*x1 + 9*x2, GRB.MAXIMIZE)

# Demand constraints
m.addConstr(x1 <= 120, "almond_demand")
m.addConstr(x2 <= 200, "ginger_demand")

# Production capacity constraint
m.addConstr(x1 + x2 <= 300, "production_capacity")

# Optimize the model
m.optimize()

# Print the solution
if m.status == GRB.OPTIMAL:
    print("Optimal solution found:")
    print(f" Produce {x1.x} bottles of almond bubble tea")
    print(f" Produce {x2.x} bottles of ginger bubble tea")
    print(f" Maximum profit: ${m.objVal}")
else:
    print("No optimal solution found")
```