"This will be the main file for the FastAPI app"
from contextlib import asynccontextmanager
import redis.asyncio as redis

from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware
from controllers.auth_router import auth
from controllers.buyers_targets import buyers_targets

# import routers
from controllers.company_profile_router import company_profile
from controllers.payment_router import payments
from controllers.presentation import presentation
from controllers.recommender import recommendation
from controllers.stock_performance_router import stock_info
from controllers.team_router import team
from controllers.user_router import user
from controllers.utilities import utilities
from controllers.financial_info import financial_info
from dependencies.require_auth import AuthMiddleware

# from utils.redis_cache import redis_client


@asynccontextmanager
async def startup(fast_api_app: FastAPI):
    # TODO : add a proper redis connection
    fast_api_app.state.redis = redis.Redis(
        host="redis", port=6379, decode_responses=True
    )
    try:
        yield
    finally:
        await fast_api_app.state.redis.close()


app = FastAPI(lifespan=startup)

# include routers
app.add_middleware(AuthMiddleware)


app.include_router(company_profile)
app.include_router(presentation)
app.include_router(stock_info)
app.include_router(recommendation)
app.include_router(utilities)
app.include_router(auth)
app.include_router(user)
app.include_router(team)
app.include_router(payments)
app.include_router(buyers_targets)
app.include_router(financial_info)

# apply_auth_to_all_routes(app)

app.add_middleware(
    CORSMiddleware,
    allow_origins=[
        "http://localhost:5173",
        "http://localhost",
    ],  # Update this as needed
    allow_credentials=True,
    allow_methods=["*"],
    allow_headers=["*"],
)


@app.get("/")
def root():
    "Function to check if the app is running"
    return {"message": "API is running"}


if __name__ == "__main__":
    import uvicorn

    uvicorn.run(
        app,
        port=7000,
    )

    # To run this file using uvicorn from terminal, use:
    # uvicorn fast_api_app:app --port 7000 --reload
