To solve Emma's problem, we first need to convert the natural language description into a symbolic representation. Let's define:

- $x_1$ as the number of dresses produced in a week.
- $x_2$ as the number of suits produced in a week.

The objective function is to maximize profit, which can be represented algebraically as:
\[500x_1 + 800x_2\]

Given the constraints:
1. A dress requires 2 hours on the sewing machine and a suit requires 1 hour on the sewing machine, with 30 hours available in total.
2. A dress requires 4 hours on the embroidery machine and a suit requires 1 hour on the embroidery machine, with 50 hours available in total.

We can represent these constraints semi-algebraically as:
1. $2x_1 + x_2 \leq 30$ (sewing machine constraint)
2. $4x_1 + x_2 \leq 50$ (embroidery machine constraint)

Also, since the number of dresses and suits cannot be negative, we have:
3. $x_1 \geq 0$
4. $x_2 \geq 0$

Thus, our symbolic representation in JSON format is:

```json
{
    'sym_variables': [('x1', 'number of dresses'), ('x2', 'number of suits')],
    'objective_function': '500*x1 + 800*x2',
    'constraints': ['2*x1 + x2 <= 30', '4*x1 + x2 <= 50', 'x1 >= 0', 'x2 >= 0']
}
```

To solve this linear programming problem using Gurobi in Python, we'll write the following code:

```python
from gurobipy import *

# Create a new model
model = Model("Emma's Production Problem")

# Define variables
x1 = model.addVar(vtype=GRB.CONTINUOUS, name="dresses", lb=0)
x2 = model.addVar(vtype=GRB.CONTINUOUS, name="suits", lb=0)

# Set the objective function
model.setObjective(500*x1 + 800*x2, GRB.MAXIMIZE)

# Add constraints
model.addConstr(2*x1 + x2 <= 30, "sewing_machine")
model.addConstr(4*x1 + x2 <= 50, "embroidery_machine")

# Optimize the model
model.optimize()

# Print solution
if model.status == GRB.OPTIMAL:
    print("Optimal solution found:")
    print(f"Number of dresses: {x1.x}")
    print(f"Number of suits: {x2.x}")
    print(f"Maximum profit: ${model.objVal}")
else:
    print("No optimal solution found")
```