from fastapi import FastAPI
from starlette.middleware.cors import CORSMiddleware
from dotenv import load_dotenv
from app.core.database.connections import SessionLocal, engine,Base
from app.core.database.events import initialize_db_tables
from app.core.events import execute_backend_server_event_handler, terminate_backend_server_event_handler

#, init_db
from app.core import auth
from app.routes import views
import os
from contextlib import asynccontextmanager

#from app.apis.apiV1.Controllers.MonitorController import monitor
import asyncio
from app.core.database.connections  import get_db,get_db_session_async

app = FastAPI()
#load_dotenv()
#initialize_db_tables(app)
# db_user = os.getenv("DB_USER")
# db_password = os.getenv("DB_PASSWORD")
# db_host = os.getenv("DB_HOST")
# db_port = os.getenv("DB_PORT")
# db_name = os.getenv("DB_NAME")

#database_url = f"postgresql+asyncpg://{db_user}:{db_password}@{db_host}:{db_port}/{db_name}"

#init_db()

# Set all CORS enabled origins
app.add_middleware(
    CORSMiddleware,
    allow_origins=["*"],
    allow_credentials=True,
    allow_methods=["*"],
    allow_headers=["*"],
)

"""
app.add_event_handler(
        "startup",
        execute_backend_server_event_handler(backend_app=app),
    )
app.add_event_handler(
        "shutdown",
        terminate_backend_server_event_handler(backend_app=app),
    )
"""
app.include_router(auth.router)
app.include_router(views.router)


@app.on_event("startup")
async def start_monitoring():
    """Inicia el monitoreo en segundo plano cuando arranca FastAPI."""
    #async with get_db_session_async() as session:
        #task = asyncio.create_task(monitor(session))  # Inicia monitoreo
"""
async def init_redis():
    global redis
    redis = await redis.from_url("redis://localhost:6379", decode_responses=True)
    #redis = await aioredis.from_url(f"redis://{config.REDIS_HOST}:{config.REDIS_PORT}", decode_responses=True)
    print("🔗 Conectado a Redis")

async def close_redis():
    global redis_client
    if redis_client:
        await redis_client.close()
        print("🔴 Conexión a Redis cerrada.")
"""   
@asynccontextmanager
async def lifespan(app: FastAPI):
    """Ciclo de vida de la aplicación."""
    #await init_redis()  # Inicia Redis
    """
    async with get_db() as session:
        task = asyncio.create_task(monitor(session))  # Inicia monitoreo
    try:
        yield
    finally:
        task.cancel()  # Cancela monitoreo
       # await close_redis()  # Cierra Redis
    """