## Problem Description and Formulation

The problem is a classic example of a linear programming problem. The goal is to maximize the profit by finding the optimal mix of promotion packages A and B, given the constraints on the availability of red and white wines.

Let's define the decision variables:

* `x`: the number of packages A to produce
* `y`: the number of packages B to produce

The objective function is to maximize the total profit:

* Profit = 120x + 200y

The constraints are:

* 2x + 2y ≤ 1000 (red wine constraint)
* x + 3y ≤ 800 (white wine constraint)
* x ≥ 0, y ≥ 0 (non-negativity constraints)

## Gurobi Code

```python
import gurobi

def solve_wine_promotion_problem():
    # Create a new Gurobi model
    model = gurobi.Model()

    # Define the decision variables
    x = model.addVar(name="x", obj=120, vtype=gurobi.GRB.CONTINUOUS)
    y = model.addVar(name="y", obj=200, vtype=gurobi.GRB.CONTINUOUS)

    # Add the constraints
    model.addConstr(2*x + 2*y <= 1000, name="red_wine_constraint")
    model.addConstr(x + 3*y <= 800, name="white_wine_constraint")
    model.addConstr(x >= 0, name="x_non_negativity")
    model.addConstr(y >= 0, name="y_non_negativity")

    # Set the objective function to maximize profit
    model.setObjective(x.obj * x + y.obj * y, gurobi.GRB.MAXIMIZE)

    # Optimize the model
    model.optimize()

    # Print the solution
    if model.status == gurobi.GRB.OPTIMAL:
        print("Optimal solution found.")
        print(f"Package A: {x.varValue}")
        print(f"Package B: {y.varValue}")
        print(f"Maximum profit: {model.objVal}")
    else:
        print("No optimal solution found.")

solve_wine_promotion_problem()
```

However, the more pythonic way is 

```python
import gurobi as grb

def solve_wine_promotion_problem():
    model = grb.Model()

    x = model.addVar(obj=120, name="Package_A", vtype=grb.GRB.CONTINUOUS)
    y = model.addVar(obj=200, name="Package_B", vtype=grb.GRB.CONTINUOUS)

    model.addConstr(2*x + 2*y <= 1000, name="red_wine")
    model.addConstr(x + 3*y <= 800, name="white_wine")
    model.addConstr(x >= 0, name="x_non_negative")
    model.addConstr(y >= 0, name="y_non_negative")

    model.setObjective(x + y, grb.GRB.MAXIMIZE)

    model.optimize()

    if model.status == grb.GRB.OPTIMAL:
        print("Optimal solution found.")
        print(f"Package A: {x.varValue}")
        print(f"Package B: {y.varValue}")
        print(f"Maximum profit: {model.objVal}")
    else:
        print("No optimal solution found.")

solve_wine_promotion_problem()
```