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

Let's denote:
- $x_1$ as the number of bookcases,
- $x_2$ as the number of computer desks.

The profit per bookcase is $500, and the profit per computer desk is $80. The objective function to maximize profit can be written as:
\[ \text{Maximize} \quad 500x_1 + 80x_2 \]

There are several constraints:
1. **Space Constraint**: Each bookcase requires 12 sq ft of floor space, and each computer desk requires 5 sq ft. The total available space is 1000 sq ft.
\[ 12x_1 + 5x_2 \leq 1000 \]
2. **Computer Desks Percentage Constraint**: At least 65% of all furniture must be computer desks.
\[ x_2 \geq 0.65(x_1 + x_2) \]
Simplifying, we get:
\[ 0.35x_2 \geq 0.65x_1 \]
\[ -0.65x_1 + 0.35x_2 \geq 0 \]
3. **Capital Constraint**: A bookcase ties up $1200 in capital, and a computer desk ties up $200 in capital. The maximum capital tied up at any time is $22000.
\[ 1200x_1 + 200x_2 \leq 22000 \]

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

```python
from gurobipy import *

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

# Define the decision variables
x1 = m.addVar(vtype=GRB.INTEGER, name="bookcases")
x2 = m.addVar(vtype=GRB.INTEGER, name="computer_desks")

# Set the objective function to maximize profit
m.setObjective(500*x1 + 80*x2, GRB.MAXIMIZE)

# Add constraints
m.addConstr(12*x1 + 5*x2 <= 1000, "space_constraint")
m.addConstr(-0.65*x1 + 0.35*x2 >= 0, "computer_desks_percentage_constraint")
m.addConstr(1200*x1 + 200*x2 <= 22000, "capital_constraint")

# Optimize the model
m.optimize()

# Print the results
if m.status == GRB.OPTIMAL:
    print("Optimal solution found:")
    print(f"Bookcases: {x1.x}")
    print(f"Computer Desks: {x2.x}")
    print(f"Total Profit: ${500*x1.x + 80*x2.x}")
else:
    print("No optimal solution found")
```