To solve this problem, we first need to define the decision variables and the objective function. Let's denote the number of police officer costumes as \(P\) and the number of fireman costumes as \(F\).

The objective is to maximize profit. Given that the profit per police officer costume is $10 and per fireman costume is $12, the total profit can be represented as \(10P + 12F\).

There are two main constraints:
1. Time constraint: It takes 10 minutes to make a police officer costume and 12 minutes to make a fireman costume, with a total of 3000 minutes available. This can be represented as \(10P + 12F \leq 3000\).
2. Ratio constraint: The store must make at least 3 times as many fireman costumes as police officer costumes, which can be represented as \(F \geq 3P\).

Additionally, \(P\) and \(F\) must be non-negative since the store cannot produce a negative number of costumes.

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

```python
from gurobipy import *

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

# Define the decision variables
P = m.addVar(vtype=GRB.INTEGER, name="Police_Officer_Costumes")
F = m.addVar(vtype=GRB.INTEGER, name="Fireman_Costumes")

# Set the objective function to maximize profit
m.setObjective(10*P + 12*F, GRB.MAXIMIZE)

# Add constraints
m.addConstr(10*P + 12*F <= 3000, "Time_Constraint")
m.addConstr(F >= 3*P, "Ratio_Constraint")

# Optimize the model
m.optimize()

# Print the results
if m.status == GRB.OPTIMAL:
    print("Optimal solution found:")
    print(f"Police Officer Costumes: {P.x}")
    print(f"Fireman Costumes: {F.x}")
    print(f"Maximum Profit: ${10*P.x + 12*F.x}")
else:
    print("No optimal solution found")
```