To solve this optimization problem, we first need to define the decision variables and the objective function. Let's denote the number of tuna salad sandwiches as \(T\) and the number of chicken salad sandwiches as \(C\). The objective is to minimize the total cost, which can be represented as \(5T + 7C\).

The constraints are:
1. Protein requirement: \(20T + 25C \geq 100\)
2. Fat requirement: \(25T + 15C \geq 150\)
3. Non-negativity constraint: \(T \geq 0, C \geq 0\) because the boy cannot eat a negative number of sandwiches.

Now, let's translate these constraints and the objective function into Gurobi code in Python:

```python
from gurobipy import *

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

# Define decision variables
T = m.addVar(vtype=GRB.CONTINUOUS, name="tuna_sandwiches")
C = m.addVar(vtype=GRB.CONTINUOUS, name="chicken_sandwiches")

# Set the objective function to minimize cost
m.setObjective(5*T + 7*C, GRB.MINIMIZE)

# Add constraints
m.addConstr(20*T + 25*C >= 100, "protein_requirement")
m.addConstr(25*T + 15*C >= 150, "fat_requirement")

# Optimize the model
m.optimize()

# Print results
if m.status == GRB.OPTIMAL:
    print("Optimal solution found:")
    print(f"Number of tuna salad sandwiches: {T.x}")
    print(f"Number of chicken salad sandwiches: {C.x}")
    print(f"Total cost: {m.objVal}")
else:
    print("No optimal solution found")
```