To solve Angela's perfume mixture problem using linear programming, we need to define the decision variables, the objective function, and the constraints.

Let's denote:
- \(x_F\) as the number of bottles of French perfume Angela should buy.
- \(x_S\) as the number of bottles of Spanish perfume Angela should buy.

The objective is to minimize the total cost. The cost per bottle of French perfume is $50.00, and the cost per bottle of Spanish perfume is $45.00. Thus, the objective function can be written as:
\[ \text{Minimize} \quad 50x_F + 45x_S \]

The constraints are based on the requirements for flower scent and fruit scent in the mixture:
1. The mixture must contain at least 150 units of flower scent.
2. The mixture must contain at least 60 units of fruit scent.

Given that each bottle of French perfume contains 20 units of flower scent and 50 units of fruit scent, and each bottle of Spanish perfume contains 30 units of flower scent and 40 units of fruit scent, we can write the constraints as:
\[ 20x_F + 30x_S \geq 150 \] (flower scent constraint)
\[ 50x_F + 40x_S \geq 60 \] (fruit scent constraint)

Additionally, since Angela cannot buy a negative number of bottles of perfume, we have non-negativity constraints:
\[ x_F \geq 0 \]
\[ x_S \geq 0 \]

Now, let's express this problem in Gurobi code using Python:

```python
from gurobipy import *

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

# Define the decision variables
x_F = m.addVar(vtype=GRB.CONTINUOUS, name="French_Perfume", lb=0)
x_S = m.addVar(vtype=GRB.CONTINUOUS, name="Spanish_Perfume", lb=0)

# Set the objective function
m.setObjective(50*x_F + 45*x_S, GRB.MINIMIZE)

# Add constraints
m.addConstr(20*x_F + 30*x_S >= 150, name="Flower_Scent_Constraint")
m.addConstr(50*x_F + 40*x_S >= 60, name="Fruit_Scent_Constraint")

# Optimize the model
m.optimize()

# Print the results
if m.status == GRB.OPTIMAL:
    print("Optimal solution found:")
    print(f"French Perfume: {x_F.x}")
    print(f"Spanish Perfume: {x_S.x}")
    print(f"Total Cost: ${50*x_F.x + 45*x_S.x:.2f}")
else:
    print("No optimal solution found")
```