To solve Tom's Florist problem using linear programming and Gurobi, we first need to define the decision variables, objective function, and constraints based on the given information.

- Decision Variables:
  - \(S\): The number of bouquets of sunflowers sold.
  - \(R\): The number of bouquets of roses sold.

- Objective Function: Maximize profit. Given that the profit per bouquet of sunflowers is $7 and per bouquet of roses is $12, the objective function can be written as:
  \[ \text{Maximize} \quad 7S + 12R \]

- Constraints:
  1. Clipping Time Constraint: Each bouquet of sunflowers needs 4 minutes of clipping, and each bouquet of roses requires 5 minutes of clipping. There are 1200 minutes available for clipping.
     \[ 4S + 5R \leq 1200 \]
  2. Packaging Time Constraint: Each bouquet of sunflowers needs 3 minutes of packaging, and each bouquet of roses requires 7 minutes of packaging. There are 800 minutes available for packaging.
     \[ 3S + 7R \leq 800 \]
  3. Minimum Sunflowers Constraint: At least 30 bouquets of sunflowers must be sold.
     \[ S \geq 30 \]
  4. Non-Negativity Constraints: The number of bouquets of sunflowers and roses cannot be negative.
     \[ S \geq 0, R \geq 0 \]

Given these definitions, we can formulate the linear programming problem as follows:

Maximize \(7S + 12R\) subject to:
- \(4S + 5R \leq 1200\)
- \(3S + 7R \leq 800\)
- \(S \geq 30\)
- \(S, R \geq 0\)

Now, we can translate this formulation into Gurobi code in Python:

```python
from gurobipy import *

# Create a new model
model = Model("Tom's Florist")

# Add decision variables
S = model.addVar(vtype=GRB.CONTINUOUS, name="Sunflowers", lb=30)  # Minimum of 30 sunflowers
R = model.addVar(vtype=GRB.CONTINUOUS, name="Roses", lb=0)

# Set the objective function
model.setObjective(7*S + 12*R, GRB.MAXIMIZE)

# Add constraints
model.addConstr(4*S + 5*R <= 1200, "Clipping Time")
model.addConstr(3*S + 7*R <= 800, "Packaging Time")

# Optimize the model
model.optimize()

# Print results
if model.status == GRB.OPTIMAL:
    print("Optimal solution found.")
    print(f"Sunflowers: {S.x}, Roses: {R.x}")
    print(f"Profit: ${7*S.x + 12*R.x:.2f}")
else:
    print("No optimal solution found. The problem might be infeasible or unbounded.")

```