#!/usr/bin/env python3
"""
FastAPI Development Server Runner

This script runs the FastAPI application locally without Docker.
Make sure to configure your .env file with the appropriate database
and service connections before running.

Usage:
    python runserver.py                    # Run with default settings
    python runserver.py --host 0.0.0.0    # Run on all interfaces
    python runserver.py --port 8001       # Run on custom port
    python runserver.py --reload           # Enable auto-reload (dev mode)
    python runserver.py --no-reload       # Disable auto-reload
"""

import os
import sys
import argparse
import uvicorn
from pathlib import Path

# Add src directory to Python path
project_root = Path(__file__).parent
src_path = project_root / "src"
sys.path.insert(0, str(src_path))

# Import settings after adding src to path
try:
    from src.core.config import settings
except ImportError as e:
    print(f"Error importing settings: {e}")
    print("Make sure you have installed the required dependencies:")
    print("pip install -r requirements.txt")
    sys.exit(1)


def parse_arguments():
    """Parse command line arguments"""
    parser = argparse.ArgumentParser(
        description="Run FastAPI development server",
        formatter_class=argparse.RawDescriptionHelpFormatter,
        epilog="""
Examples:
  python runserver.py
  python runserver.py --host 127.0.0.1 --port 8080
  python runserver.py --reload --log-level debug
  python runserver.py --workers 4 --no-reload
        """
    )
    
    parser.add_argument(
        "--host",
        default=None,
        help=f"Host to bind the server to (default: {settings.APP_HOST})"
    )
    
    parser.add_argument(
        "--port",
        type=int,
        default=None,
        help=f"Port to bind the server to (default: {settings.APP_PORT})"
    )
    
    parser.add_argument(
        "--reload",
        action="store_true",
        default=None,
        help="Enable auto-reload (overrides config)"
    )
    
    parser.add_argument(
        "--no-reload",
        action="store_true",
        default=False,
        help="Disable auto-reload (overrides config)"
    )
    
    parser.add_argument(
        "--log-level",
        choices=["critical", "error", "warning", "info", "debug", "trace"],
        default=None,
        help=f"Log level (default: {settings.LOG_LEVEL.lower()})"
    )
    
    parser.add_argument(
        "--workers",
        type=int,
        default=1,
        help="Number of worker processes (default: 1, use >1 for production)"
    )
    
    parser.add_argument(
        "--env",
        default=None,
        help="Override APP_ENV setting"
    )
    
    parser.add_argument(
        "--check-config",
        action="store_true",
        help="Check configuration and exit"
    )
    
    return parser.parse_args()


def check_configuration():
    """Check if the configuration is valid"""
    print("=== Configuration Check ===")
    print(f"App Name: {settings.APP_NAME}")
    print(f"App Version: {settings.APP_VERSION}")
    print(f"Environment: {settings.APP_ENV}")
    print(f"Debug Mode: {settings.APP_DEBUG}")
    print(f"Host: {settings.APP_HOST}")
    print(f"Port: {settings.APP_PORT}")
    print(f"Log Level: {settings.LOG_LEVEL}")
    print()
    
    print("=== Database Configuration ===")
    try:
        db_url = settings.getDbConnectionUri()
        print(f"Database URL: {db_url}")
    except Exception as e:
        print(f"Database configuration error: {e}")
    print()
    
    print("=== RabbitMQ Configuration ===")
    try:
        rabbitmq_url = settings.get_rabbitmq_url()
        print(f"RabbitMQ URL: {rabbitmq_url}")
    except Exception as e:
        print(f"RabbitMQ configuration error: {e}")
    print()
    
    print("=== Redis Configuration ===")
    try:
        redis_url = settings.get_redis_url()
        print(f"Redis URL: {redis_url}")
    except Exception as e:
        print(f"Redis configuration error: {e}")
    print()
    
    print("=== Celery Configuration ===")
    try:
        broker_url = settings.get_celery_broker_url()
        result_backend = settings.get_celery_result_backend_url()
        print(f"Celery Broker URL: {broker_url}")
        print(f"Celery Result Backend URL: {result_backend}")
    except Exception as e:
        print(f"Celery configuration error: {e}")
    print()


def main():
    """Main entry point"""
    args = parse_arguments()
    
    # Override environment if specified
    if args.env:
        os.environ["APP_ENV"] = args.env
    
    # Check configuration and exit if requested
    if args.check_config:
        check_configuration()
        return
    
    # Determine configuration values
    host = args.host or settings.APP_HOST
    port = args.port or settings.APP_PORT
    log_level = args.log_level or settings.LOG_LEVEL.lower()
    
    # Determine reload setting
    if args.no_reload:
        reload = False
    elif args.reload:
        reload = True
    else:
        reload = settings.APP_DEBUG
    
    print("=== Starting FastAPI Development Server ===")
    print(f"Host: {host}")
    print(f"Port: {port}")
    print(f"Reload: {reload}")
    print(f"Log Level: {log_level}")
    print(f"Workers: {args.workers}")
    print(f"Environment: {settings.APP_ENV}")
    print()
    print("Press CTRL+C to stop the server")
    print("=" * 50)
    
    try:
        # Run the server
        if args.workers > 1:
            # Multi-worker mode (production-like)
            uvicorn.run(
                "src.main:app",
                host=host,
                port=port,
                workers=args.workers,
                log_level=log_level,
                access_log=True
            )
        else:
            # Single worker mode (development)
            uvicorn.run(
                "src.main:app",
                host=host,
                port=port,
                reload=reload,
                log_level=log_level,
                access_log=True,
                reload_dirs=[str(src_path)] if reload else None
            )
            
    except KeyboardInterrupt:
        print("\n\nServer stopped by user")
    except Exception as e:
        print(f"\nError starting server: {e}")
        sys.exit(1)


if __name__ == "__main__":
    main()