To solve this optimization problem, we first need to define the symbolic representation of the variables and the problem itself.

Let's denote:
- $x_1$ as the number of batches of chocolate chip cookies made.
- $x_2$ as the number of batches of oatmeal cookies made.

The objective function is to maximize profit. Given that the profit per batch of chocolate chip cookies is $12 and the profit per batch of oatmeal cookies is $15, the objective function can be represented algebraically as:
\[ \text{Maximize} \quad 12x_1 + 15x_2 \]

The constraints are based on the time available for gathering ingredients, mixing, and baking. Specifically:
- For gathering ingredients: $10x_1 + 8x_2 \leq 1000$
- For mixing: $20x_1 + 15x_2 \leq 1200$
- For baking: $50x_1 + 30x_2 \leq 3000$

Additionally, since we cannot make a negative number of batches of cookies, we have:
- $x_1 \geq 0$ and $x_2 \geq 0$

So, the symbolic representation in JSON format is:
```json
{
    'sym_variables': [('x1', 'number of batches of chocolate chip cookies'), ('x2', 'number of batches of oatmeal cookies')],
    'objective_function': '12*x1 + 15*x2',
    'constraints': ['10*x1 + 8*x2 <= 1000', '20*x1 + 15*x2 <= 1200', '50*x1 + 30*x2 <= 3000', 'x1 >= 0', 'x2 >= 0']
}
```

Now, let's implement this problem in Gurobi using Python:

```python
from gurobipy import *

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

# Define the variables
x1 = m.addVar(vtype=GRB.CONTINUOUS, name="chocolate_chip_batches", lb=0)
x2 = m.addVar(vtype=GRB.CONTINUOUS, name="oatmeal_batches", lb=0)

# Set the objective function to maximize profit
m.setObjective(12*x1 + 15*x2, GRB.MAXIMIZE)

# Add constraints based on time availability
m.addConstr(10*x1 + 8*x2 <= 1000, "ingredient_gathering_time")
m.addConstr(20*x1 + 15*x2 <= 1200, "mixing_time")
m.addConstr(50*x1 + 30*x2 <= 3000, "baking_time")

# Optimize the model
m.optimize()

# Print the results if an optimal solution is found
if m.status == GRB.OPTIMAL:
    print("Optimal batches of chocolate chip cookies:", x1.x)
    print("Optimal batches of oatmeal cookies:", x2.x)
    print("Maximum profit: $", m.objVal)
else:
    print("No optimal solution found.")
```