To solve this optimization problem, we can model it as a linear programming problem. The goal is to maximize profit given the constraints on time available for mixing ingredients and assembling sandwiches.

Let's define the variables:
- $x$: Number of tuna salad sandwiches made
- $y$: Number of chicken salad sandwiches made

The objective function (profit) can be represented as $2x + 3y$ since each tuna salad sandwich contributes $2 to profit and each chicken salad sandwich contributes $3.

Constraints are based on the time available:
1. For mixing ingredients: $3x + 5y \leq 300$
2. For assembling sandwiches: $5x + 6y \leq 400$

Additionally, we have non-negativity constraints since we cannot make a negative number of sandwiches:
- $x \geq 0$
- $y \geq 0$

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

```python
from gurobipy import *

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

# Define variables
x = m.addVar(vtype=GRB.CONTINUOUS, name="tuna_salad_sandwiches", lb=0)
y = m.addVar(vtype=GRB.CONTINUOUS, name="chicken_salad_sandwiches", lb=0)

# Set the objective function
m.setObjective(2*x + 3*y, GRB.MAXIMIZE)

# Add constraints
m.addConstr(3*x + 5*y <= 300, "mixing_time")
m.addConstr(5*x + 6*y <= 400, "assembling_time")

# Optimize the model
m.optimize()

# Print results
if m.status == GRB.OPTIMAL:
    print("Optimal solution found:")
    print(f"Number of tuna salad sandwiches: {x.x}")
    print(f"Number of chicken salad sandwiches: {y.x}")
    print(f"Maximum profit: ${2*x.x + 3*y.x:.2f}")
else:
    print("No optimal solution found")
```