To solve this optimization problem, we need to define the decision variables, objective function, and constraints. Let's denote:
- $L$ as the number of large sandwiches made,
- $S$ as the number of small sandwiches made.

The objective is to maximize profit. The profit per large sandwich is $5, and the profit per small sandwich is $3.50. Therefore, the total profit can be represented as $5L + 3.50S$.

There are two main constraints:
1. Preparation time: Each large sandwich takes 4 minutes of preparation, and each small sandwich takes 3 minutes. The store has available 1000 minutes for preparation. This constraint can be written as $4L + 3S \leq 1000$.
2. Toasting time: Each large sandwich takes 5 minutes of toasting, and each small sandwich takes 4 minutes. The store has available 1200 minutes for toasting. This constraint can be written as $5L + 4S \leq 1200$.

Additionally, we have non-negativity constraints since the number of sandwiches cannot be negative: $L \geq 0$, $S \geq 0$.

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

```python
from gurobipy import *

# Create a model
m = Model("Sandwich_Optimization")

# Define variables
L = m.addVar(vtype=GRB.CONTINUOUS, name="Large_Sandwiches", lb=0)
S = m.addVar(vtype=GRB.CONTINUOUS, name="Small_Sandwiches", lb=0)

# Set objective function
m.setObjective(5*L + 3.50*S, GRB.MAXIMIZE)

# Add constraints
m.addConstr(4*L + 3*S <= 1000, name="Preparation_Time")
m.addConstr(5*L + 4*S <= 1200, name="Toasting_Time")

# Optimize model
m.optimize()

# Print results
if m.status == GRB.OPTIMAL:
    print("Optimal solution found:")
    print(f"Number of Large Sandwiches: {L.x}")
    print(f"Number of Small Sandwiches: {S.x}")
    print(f"Maximum Profit: ${5*L.x + 3.50*S.x:.2f}")
else:
    print("No optimal solution found")
```