To solve this optimization problem, we need to define the decision variables, the objective function, and the constraints. 

Let's denote:
- \(x_A\) as the number of Juice A units produced,
- \(x_B\) as the number of Juice B units produced.

The objective is to maximize profit. Given that the profit per unit of Juice A is $5 and per unit of Juice B is $7, the total profit \(P\) can be represented by the equation:
\[ P = 5x_A + 7x_B \]

Now, let's consider the constraints based on the availability of raspberries, blueberries, and blackberries:
1. Raspberries: Each unit of Juice A uses 20g, and each unit of Juice B uses 15g. The store has 2000g available.
\[ 20x_A + 15x_B \leq 2000 \]
2. Blueberries: Each unit of Juice A uses 10g, and each unit of Juice B uses 15g. The store has 1500g available.
\[ 10x_A + 15x_B \leq 1500 \]
3. Blackberries: Each unit of Juice A uses 10g, and each unit of Juice B uses 5g. The store has 1400g available.
\[ 10x_A + 5x_B \leq 1400 \]

Also, the production quantities cannot be negative:
\[ x_A \geq 0 \]
\[ x_B \geq 0 \]

To implement this in Gurobi using Python, we use the following code:

```python
from gurobipy import *

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

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

# Set the objective function
m.setObjective(5*x_A + 7*x_B, GRB.MAXIMIZE)

# Add constraints
m.addConstr(20*x_A + 15*x_B <= 2000, "Raspberries")
m.addConstr(10*x_A + 15*x_B <= 1500, "Blueberries")
m.addConstr(10*x_A + 5*x_B <= 1400, "Blackberries")

# Optimize model
m.optimize()

# Print solution
if m.status == GRB.OPTIMAL:
    print("Optimal solution found:")
    print(f"Juice A: {x_A.x}")
    print(f"Juice B: {x_B.x}")
    print(f"Total Profit: ${5*x_A.x + 7*x_B.x:.2f}")
else:
    print("No optimal solution found")
```