# PostgreSQL Direct Connection Setup

This guide explains how to use the PostgreSQL database directly instead of Supabase.

## Architecture

Since Flutter web cannot connect directly to PostgreSQL from the browser (security restrictions), we use a two-tier architecture:

```
Flutter App (Web) → FastAPI Backend → PostgreSQL Database
```

The backend acts as an API layer that connects to PostgreSQL and exposes REST endpoints.

## Database Configuration

The PostgreSQL database is configured as:
- **Host**: localhost
- **Port**: 5432
- **Database**: sibu
- **Username**: sibu
- **Password**: sibu

Connection string: `postgresql+asyncpg://sibu:sibu@localhost:5432/sibu`

## Setup Steps

### 1. Ensure PostgreSQL is Running

Make sure your PostgreSQL database is running and accessible:

```bash
# Test connection (if you have psql installed)
psql -h localhost -p 5432 -U sibu -d sibu
```

### 2. Apply Database Migrations

The database schema needs to be created. You have two options:

#### Option A: Use Supabase Migrations

If you have the Supabase migrations in `supabase/migrations/`, you can apply them directly:

```bash
# Connect to PostgreSQL and run migrations
psql -h localhost -p 5432 -U sibu -d sibu -f supabase/migrations/20241019215951_sibu_transportation_system.sql
# ... apply other migrations
```

#### Option B: Use Alembic (Backend Migrations)

The backend uses Alembic for migrations:

```bash
cd backend
uv run alembic upgrade head
```

### 3. Start the Backend API

```bash
cd backend
uv run fastapi dev app/main.py
```

The API will be available at `http://localhost:8000`

### 4. Run Flutter App

```bash
cd old
./scripts/run-flutter-backend.sh
```

Or manually:

```bash
flutter run -d chrome --dart-define=API_BASE_URL=http://localhost:8000
```

## Backend API Endpoints

The backend provides the following endpoints:

- `GET /api/routes` - Get all routes
- `GET /api/routes/{route_id}` - Get specific route
- `GET /api/bus-stops` - Get all bus stops
- `GET /api/bus-stops/{stop_id}` - Get specific bus stop
- `GET /api/schedules` - Get schedules (with optional route_id, stop_id filters)
- `GET /api/coupons` - Get coupons (with optional category, is_active filters)
- `GET /api/taxis` - Get taxis (with optional filters)
- `GET /health` - Health check

## Configuration Files

### Backend Configuration

**File**: `backend/.env.development`
```env
DATABASE_URL=postgresql+asyncpg://sibu:sibu@localhost:5432/sibu
ENVIRONMENT=development
DEBUG=true
```

**File**: `backend/app/core/config.py`
- Default database URL is set to your PostgreSQL connection

### Flutter Configuration

The Flutter app uses `ApiClient` service which:
- Defaults to `http://localhost:8000`
- Can be configured via `--dart-define=API_BASE_URL=<url>`

## Switching Between Supabase and PostgreSQL

### Use PostgreSQL (via Backend API)
```bash
cd old
./scripts/run-flutter-backend.sh
```

### Use Supabase
```bash
cd old
./scripts/run-flutter-local.sh  # For local Supabase
# OR
flutter run -d chrome \
  --dart-define=SUPABASE_URL=<url> \
  --dart-define=SUPABASE_ANON_KEY=<key>
```

## Troubleshooting

### Backend Can't Connect to PostgreSQL

1. **Check PostgreSQL is running:**
   ```bash
   # macOS
   brew services list | grep postgresql
   
   # Or check if port is listening
   lsof -i :5432
   ```

2. **Verify credentials:**
   ```bash
   psql -h localhost -p 5432 -U sibu -d sibu
   ```

3. **Check database exists:**
   ```sql
   \l  -- List databases
   ```

### Flutter Can't Connect to Backend

1. **Check backend is running:**
   ```bash
   curl http://localhost:8000/health
   ```

2. **Check CORS settings** in `backend/app/main.py`

3. **Verify API URL** in Flutter:
   ```dart
   // Check ApiClient base URL
   print(ApiClient.instance._baseUrl);
   ```

### Database Schema Issues

If tables don't exist:

1. **Apply migrations:**
   ```bash
   cd backend
   uv run alembic upgrade head
   ```

2. **Or manually create from Supabase migrations:**
   ```bash
   psql -h localhost -p 5432 -U sibu -d sibu < supabase/migrations/20241019215951_sibu_transportation_system.sql
   ```

## Development Workflow

1. **Start PostgreSQL** (if not running as a service)
2. **Start Backend API:**
   ```bash
   cd backend
   uv run fastapi dev app/main.py
   ```
3. **Run Flutter App:**
   ```bash
   cd old
   ./scripts/run-flutter-backend.sh
   ```

## Next Steps

The Flutter app services need to be updated to use `ApiClient` instead of `SupabaseService`. Currently, the app still uses Supabase. To fully migrate:

1. Update `TransportationService` to use `ApiClient`
2. Update `CouponService` to use `ApiClient`
3. Update `TaxiService` to use `ApiClient`
4. Remove or make optional `SupabaseService`

This migration can be done incrementally.

