#!/usr/bin/env bash
set -euo pipefail

# Optional: wait for Postgres to be reachable
if [[ -n "${DATABASE_HOST:-}" && -n "${DATABASE_PORT:-}" ]]; then
  echo "Waiting for Postgres at ${DATABASE_HOST}:${DATABASE_PORT}..."
  for i in {1..60}; do
    (echo > /dev/tcp/${DATABASE_HOST}/${DATABASE_PORT}) >/dev/null 2>&1 && break || true
    sleep 1
  done
fi

# Create own database + run own migrations
if [[ "${RUN_MIGRATIONS:-}" == "true" && -n "${ALEMBIC_DATABASE_URL:-}" ]]; then
  python3 -c "
import os, re
url = os.environ['ALEMBIC_DATABASE_URL']
m = re.match(r'postgresql\+\w+://([^:]+):([^@]+)@([^:]+):(\d+)/(.+)', url)
if not m:
    print('Could not parse ALEMBIC_DATABASE_URL, skipping DB creation')
    exit(0)
user, password, host, port, dbname = m.groups()

import psycopg
conn = psycopg.connect(
    f'postgresql://{user}:{password}@{host}:{port}/postgres',
    autocommit=True,
)
cur = conn.execute('SELECT 1 FROM pg_database WHERE datname = %s', (dbname,))
if not cur.fetchone():
    conn.execute(f'CREATE DATABASE {dbname}')
    print(f'Created database {dbname}')
else:
    print(f'Database {dbname} already exists')
conn.close()
" || echo "DB creation failed (non-fatal), continuing..."

  echo "Running orders Alembic migrations..."
  if [ -d orders ]; then (cd orders && alembic upgrade head); else alembic upgrade head; fi
fi

# Clear Redis page cache on deploy
if [[ -n "${REDIS_URL:-}" && "${REDIS_URL}" != "no" ]]; then
  echo "Flushing Redis cache..."
  python3 -c "
import redis, os
r = redis.from_url(os.environ['REDIS_URL'])
r.flushdb()
print('Redis cache cleared.')
" || echo "Redis flush failed (non-fatal), continuing..."
fi

# Start the app
RELOAD_FLAG=""
if [[ "${RELOAD:-}" == "true" ]]; then
  RELOAD_FLAG="--reload"
  python3 -m shared.dev_watcher &
  echo "Starting Hypercorn (${APP_MODULE:-app:app}) with auto-reload..."
else
  echo "Starting Hypercorn (${APP_MODULE:-app:app})..."
fi
PYTHONUNBUFFERED=1 exec hypercorn "${APP_MODULE:-app:app}" --bind 0.0.0.0:${PORT:-8000} --workers ${WORKERS:-2} --keep-alive 75 ${RELOAD_FLAG}
