from fastapi import APIRouter, Depends, HTTPException, Request from fastapi.responses import JSONResponse from sqlalchemy.orm import Session from app.auth.dependencies import get_current_user, require_roles from app.iptv.scheduler import StreamScheduler from app.models.auth import CognitoUser from app.utils.database import get_db router = APIRouter( prefix="/scheduler", tags=["scheduler"], responses={404: {"description": "Not found"}}, ) async def get_scheduler(request: Request) -> StreamScheduler: """Get the scheduler instance from the app state.""" if not hasattr(request.app.state.scheduler, "scheduler"): raise HTTPException(status_code=500, detail="Scheduler not initialized") return request.app.state.scheduler @router.get("/health") @require_roles("admin") def scheduler_health( scheduler: StreamScheduler = Depends(get_scheduler), user: CognitoUser = Depends(get_current_user), db: Session = Depends(get_db), ): """Check scheduler health status (admin only).""" try: job = scheduler.scheduler.get_job("daily_stream_validation") next_run = str(job.next_run_time) if job and job.next_run_time else None return { "status": "running" if scheduler.scheduler.running else "stopped", "next_run": next_run, } except Exception as e: raise HTTPException( status_code=500, detail=f"Failed to check scheduler health: {str(e)}" ) @router.post("/trigger") @require_roles("admin") def trigger_validation( scheduler: StreamScheduler = Depends(get_scheduler), user: CognitoUser = Depends(get_current_user), db: Session = Depends(get_db), ): """Manually trigger stream validation (admin only).""" scheduler.trigger_manual_validation() return JSONResponse( status_code=202, content={"message": "Stream validation triggered"} )