To solve this optimization problem, we need to define variables and constraints that capture the essence of the problem. Let's denote:

- $x_A$ as the number of Package A promotions sold.
- $x_B$ as the number of Package B promotions sold.

The objective is to maximize profit. The profit from selling $x_A$ units of Package A is $120x_A$, and from selling $x_B$ units of Package B is $200x_B$. Thus, the total profit to be maximized is given by:

\[ \text{Maximize:} \quad 120x_A + 200x_B \]

Now, let's consider the constraints. Each package contains a specific number of red and white wine bottles, and there are limited supplies of each.

1. **Red Wine Constraint**: Package A uses 2 bottles of red wine per package, and Package B also uses 2 bottles of red wine per package. Given that there are 1000 bottles of red wine available, the constraint can be written as:

\[ 2x_A + 2x_B \leq 1000 \]

Simplifying this gives:

\[ x_A + x_B \leq 500 \]

2. **White Wine Constraint**: Package A uses 1 bottle of white wine per package, and Package B uses 3 bottles of white wine per package. With 800 bottles of white wine available, the constraint is:

\[ x_A + 3x_B \leq 800 \]

3. **Non-Negativity Constraints**: Since we cannot sell a negative number of packages, both $x_A$ and $x_B$ must be non-negative:

\[ x_A \geq 0 \]
\[ x_B \geq 0 \]

Given these constraints and the objective function, we can formulate this problem as a linear programming problem. 

Here is how you could solve it using Gurobi in Python:
```python
from gurobipy import *

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

# Define variables
x_A = m.addVar(lb=0, vtype=GRB.CONTINUOUS, name="Package_A")
x_B = m.addVar(lb=0, vtype=GRB.CONTINUOUS, name="Package_B")

# Objective function: Maximize profit
m.setObjective(120*x_A + 200*x_B, GRB.MAXIMIZE)

# Red wine constraint
m.addConstr(2*x_A + 2*x_B <= 1000, "Red_Wine_Constraint")
# Simplified version of the red wine constraint (not necessary to add both)
# m.addConstr(x_A + x_B <= 500, "Simplified_Red_Wine_Constraint")

# White wine constraint
m.addConstr(x_A + 3*x_B <= 800, "White_Wine_Constraint")

# Optimize model
m.optimize()

# Print results
if m.status == GRB.OPTIMAL:
    print("Optimal solution found:")
    print(f"Package A: {x_A.x}")
    print(f"Package B: {x_B.x}")
    print(f"Maximum Profit: ${120*x_A.x + 200*x_B.x:.2f}")
else:
    print("No optimal solution found")
```