To solve the optimization problem described, we need to define the decision variables, objective function, and constraints based on the given information.

Let's denote:
- $C$ as the number of coats sold,
- $S$ as the number of shirts sold.

The profit from selling one coat is $12, and the profit from selling one shirt is $8. Therefore, the total profit can be represented as $12C + 8S$.

The constraints are:
1. The store can spend at most $50,000 on coats and shirts. Given that a coat costs $55 and a shirt costs $25, this constraint can be written as $55C + 25S \leq 50,000$.
2. At least 60 but at most 100 coats are sold each month: $60 \leq C \leq 100$.
3. The number of shirts sold is at most four times the number of coats sold: $S \leq 4C$.

The objective is to maximize profit, which means we want to find the values of $C$ and $S$ that maximize $12C + 8S$ under these constraints.

Here's how this problem can be represented in Gurobi Python code:

```python
from gurobipy import *

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

# Define the decision variables
C = m.addVar(lb=60, ub=100, vtype=GRB.INTEGER, name="Coats")
S = m.addVar(vtype=GRB.INTEGER, name="Shirts")

# Objective function: Maximize profit
m.setObjective(12*C + 8*S, GRB.MAXIMIZE)

# Constraints
m.addConstr(55*C + 25*S <= 50000, "Budget_Constraint")
m.addConstr(S <= 4*C, "Shirt_vs_Coat_Constraint")

# Solve the model
m.optimize()

# Print solution
if m.status == GRB.OPTIMAL:
    print("Optimal solution found:")
    print(f"Coats to sell: {C.x}")
    print(f"Shirts to sell: {S.x}")
    print(f"Maximum Profit: {m.objVal}")
else:
    print("No optimal solution found")
```