#!/bin/bash
set -e

# Ожидание готовности PostgreSQL
wait_for_postgres() {
    echo "Waiting for PostgreSQL..."
    while ! python -c "
import psycopg2
import os
try:
    conn = psycopg2.connect(
        dbname=os.environ.get('DB_NAME', 'inventory_db'),
        user=os.environ.get('DB_USER', 'postgres'),
        password=os.environ.get('DB_PASSWORD', 'postgres'),
        host=os.environ.get('DB_HOST', 'db'),
        port=os.environ.get('DB_PORT', '5432')
    )
    conn.close()
    exit(0)
except:
    exit(1)
" 2>/dev/null; do
        echo "PostgreSQL is unavailable - sleeping"
        sleep 2
    done
    echo "PostgreSQL is up!"
}

# Ожидание готовности Redis
wait_for_redis() {
    echo "Waiting for Redis..."
    while ! python -c "
import redis
import os
try:
    r = redis.Redis(
        host=os.environ.get('REDIS_HOST', 'redis'),
        port=int(os.environ.get('REDIS_PORT', '6379')),
        db=int(os.environ.get('REDIS_DB', '0'))
    )
    r.ping()
    exit(0)
except:
    exit(1)
" 2>/dev/null; do
        echo "Redis is unavailable - sleeping"
        sleep 2
    done
    echo "Redis is up!"
}

# Применение миграций и создание суперпользователя
run_migrations() {
    echo "Running migrations for shared apps..."
    python manage.py migrate_schemas --shared

    echo "Running migrations for tenant schemas..."
    python manage.py migrate_schemas --tenant

    echo "Collecting static files..."
    python manage.py collectstatic --noinput
}

# Создание суперпользователя если не существует
create_superuser() {
    echo "Creating superuser if not exists..."
    python manage.py shell << EOF
from django.contrib.auth import get_user_model
from django.db import connection
from django_tenants.utils import schema_context
import os

User = get_user_model()

# Создаём суперпользователя в public схеме из переменных окружения
with schema_context('public'):
    email = os.environ.get('TENANT_ADMIN_EMAIL', 'admin@example.com')
    password = os.environ.get('TENANT_ADMIN_PASSWORD', 'changeme')
    first_name = os.environ.get('TENANT_ADMIN_NAME', 'Admin')

    if not User.objects.filter(email=email).exists():
        user = User.objects.create_superuser(
            email=email,
            password=password,
            first_name=first_name
        )
        print(f'Superuser {email} created successfully!')
    else:
        print(f'Superuser {email} already exists.')
EOF
}

case "$1" in
    web)
        wait_for_postgres
        wait_for_redis
        run_migrations
        create_superuser
        echo "Starting Gunicorn..."
        exec gunicorn myproject.wsgi:application \
            --bind 0.0.0.0:8000 \
            --workers 3 \
            --threads 2 \
            --timeout 120 \
            --access-logfile - \
            --error-logfile - \
            --capture-output
        ;;
    celery-worker)
        wait_for_postgres
        wait_for_redis
        echo "Starting Celery Worker..."
        exec celery -A myproject worker \
            -l info \
            -Q celery,photo_processing \
            --concurrency=2
        ;;
    celery-beat)
        wait_for_postgres
        wait_for_redis
        echo "Starting Celery Beat..."
        exec celery -A myproject beat -l info
        ;;
    migrate)
        wait_for_postgres
        run_migrations
        create_superuser
        ;;
    shell)
        exec python manage.py shell
        ;;
    *)
        exec "$@"
        ;;
esac
