To solve this optimization problem, we need to maximize the profit from selling regular and premium phones while considering the constraints on demand and total sales. The objective function will be the sum of the profits from each type of phone.

Let's denote:
- \(x_1\) as the number of regular phones sold per day,
- \(x_2\) as the number of premium phones sold per day.

Given information:
- Profit per regular phone: $200
- Profit per premium phone: $300
- Maximum daily demand for regular phones: 20 units
- Maximum daily demand for premium phones: 15 units
- Maximum total daily sales (both types combined): 30 units

Constraints:
1. \(x_1 \geq 0\) (Non-negativity constraint for regular phones)
2. \(x_2 \geq 0\) (Non-negativity constraint for premium phones)
3. \(x_1 \leq 20\) (Demand limit for regular phones)
4. \(x_2 \leq 15\) (Demand limit for premium phones)
5. \(x_1 + x_2 \leq 30\) (Total sales limit)

Objective function: Maximize profit \(P = 200x_1 + 300x_2\).

We will use Gurobi, a powerful optimization solver, to find the optimal values of \(x_1\) and \(x_2\) that maximize the profit while satisfying all constraints.

```python
from gurobipy import *

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

# Define variables
x1 = m.addVar(name="regular_phones", lb=0, ub=20)  # Regular phones sold per day
x2 = m.addVar(name="premium_phones", lb=0, ub=15)  # Premium phones sold per day

# Objective function: Maximize profit
m.setObjective(200*x1 + 300*x2, GRB.MAXIMIZE)

# Constraint: Total sales limit
m.addConstr(x1 + x2 <= 30, name="total_sales_limit")

# Solve the model
m.optimize()

# Print results
if m.status == GRB.OPTIMAL:
    print(f"Optimal solution found.")
    print(f"Sell {x1.x} regular phones and {x2.x} premium phones per day to maximize profit.")
    print(f"Maximum profit: ${200*x1.x + 300*x2.x}")
else:
    print("No optimal solution found. The problem might be infeasible.")

```