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

Let's denote:
- \(L\) as the number of low-quality face washes produced,
- \(M\) as the number of medium-quality face washes produced,
- \(H\) as the number of high-quality face washes produced.

The objective is to maximize profits. The profit per low-quality face wash is $3, per medium-quality face wash is $7, and per high-quality face wash is $9. Therefore, the objective function can be written as:
\[ \text{Maximize:} \quad 3L + 7M + 9H \]

Now, let's consider the constraints:

1. **Rare Ingredients Constraint:** Each low-quality face wash contains 1 unit of rare ingredients, each medium-quality face wash contains 3 units, and each high-quality face wash contains 4 units. The company has available 100 units of rare ingredients. This constraint can be written as:
\[ L + 3M + 4H \leq 100 \]

2. **Water Constraint:** Each low-quality face wash contains 4 units of water, each medium-quality face wash contains 2 units, and each high-quality face wash contains 1 unit. The company has available 200 units of water. This constraint can be written as:
\[ 4L + 2M + H \leq 200 \]

3. **Non-Negativity Constraints:** Since the number of face washes produced cannot be negative, we have:
\[ L \geq 0, M \geq 0, H \geq 0 \]

Now, let's translate this problem into Gurobi code in Python:

```python
from gurobipy import *

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

# Define the decision variables
L = m.addVar(vtype=GRB.CONTINUOUS, name="LowQuality")
M = m.addVar(vtype=GRB.CONTINUOUS, name="MediumQuality")
H = m.addVar(vtype=GRB.CONTINUOUS, name="HighQuality")

# Set the objective function
m.setObjective(3*L + 7*M + 9*H, GRB.MAXIMIZE)

# Add constraints
m.addConstr(L + 3*M + 4*H <= 100, "RareIngredients")
m.addConstr(4*L + 2*M + H <= 200, "Water")

# Optimize the model
m.optimize()

# Print the solution
if m.status == GRB.OPTIMAL:
    print("Optimal Solution Found:")
    print(f"Low Quality: {L.x}")
    print(f"Medium Quality: {M.x}")
    print(f"High Quality: {H.x}")
else:
    print("No optimal solution found")
```