import os
import uvicorn
from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware
from dotenv import load_dotenv
import asyncio
from contextlib import asynccontextmanager

# Import existing FastAPI apps
from fitness_app.app import app as meal_app
from workout_app.main import app as workout_app
from workout_app.main import startup_event as workout_startup_event

# Load environment variables
load_dotenv()

# Define lifespan for the main app to initialize mounted apps
@asynccontextmanager
async def lifespan(app: FastAPI):    
    print("Starting BloodFIT Combined API...")
    # Initialize workout app
    try:
        await workout_startup_event()
        print("Workout app initialized successfully")
    except Exception as e:
        print(f"Workout app initialization error: {e}")
        print("Continuing with limited workout functionality...")
    
    yield  # Run the application
    
    print("Shutting down BloodFIT Combined API...")

# Create main FastAPI app
app = FastAPI(
    title="BloodFIT Complete API",
    version="1.0.0",
    description="Combined Meal Plan and Workout Planner API",
    lifespan=lifespan,
)

# Add CORS middleware to main app
app.add_middleware(
    CORSMiddleware,
    allow_origins=["*"],
    allow_credentials=True,
    allow_methods=["*"],
    allow_headers=["*"],
)

# Mount meal app under /meal prefix
app.mount("/meal", meal_app)

# Mount workout app under /workout prefix
app.mount("/workout", workout_app)

# Root endpoint that shows available paths
@app.get("/")
async def root():
    return {
        "message": "BloodFIT Combined API",
        "endpoints": {
            "meal_api": {
                "url": "/meal",
                "description": "Meal plan generation and food scanning API"
            },
            "workout_api": {
                "url": "/workout",
                "description": "Workout planning and exercise video generation API"
            },
            "documentation": {
                "swagger": "/docs",
                "redoc": "/redoc"
            }
        }
    }

# Health check endpoint
@app.get("/health")
async def health_check():
    return {
        "status": "healthy",
        "meal_api": True,
        "workout_api": True
    }


if __name__ == "__main__":
    uvicorn.run(
        "run:app",
        host="0.0.0.0",
        port=8000,
        reload=True
    )