To solve the given problem, we first need to define the decision variables and the objective function. Let's denote the number of bags of type A used as \(x_A\) and the number of bags of type B used as \(x_B\). The objective is to minimize the total cost of the mixture.

Given:
- Bag A contains 3 units of protein and 4 units of calcium per bag, costing $3.50.
- Bag B contains 4 units of protein and 2 units of calcium per bag, costing $2.50.
- The mixture must contain at least 30 units of protein and 35 units of calcium.

The objective function to minimize is the total cost: \(3.50x_A + 2.50x_B\).

The constraints based on the given requirements are:
1. Protein constraint: \(3x_A + 4x_B \geq 30\)
2. Calcium constraint: \(4x_A + 2x_B \geq 35\)
3. Non-negativity constraints: \(x_A \geq 0, x_B \geq 0\), since we cannot use a negative number of bags.

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

```python
from gurobipy import *

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

# Define the decision variables
x_A = m.addVar(name="bags_of_type_A", lb=0)
x_B = m.addVar(name="bags_of_type_B", lb=0)

# Set the objective function to minimize the total cost
m.setObjective(3.50*x_A + 2.50*x_B, GRB.MINIMIZE)

# Add constraints
m.addConstr(3*x_A + 4*x_B >= 30, name="protein_constraint")
m.addConstr(4*x_A + 2*x_B >= 35, name="calcium_constraint")

# Optimize the model
m.optimize()

# Print the results
if m.status == GRB.OPTIMAL:
    print(f"Optimal solution found: {x_A.varName} = {x_A.x}, {x_B.varName} = {x_B.x}")
    print(f"Total cost: ${3.50*x_A.x + 2.50*x_B.x:.2f}")
else:
    print("No optimal solution found")
```