from apscheduler.schedulers.asyncio import AsyncIOScheduler from apscheduler.triggers.cron import CronTrigger from loguru import logger from app.scheduler.tasks.expire_subscriptions import expire_subscriptions from app.scheduler.tasks.send_reminders import send_reminders from app.scheduler.tasks.revoke_expired import revoke_expired from app.scheduler.tasks.sync_servers import sync_servers def setup_scheduler() -> AsyncIOScheduler: scheduler = AsyncIOScheduler(timezone="UTC") daily = CronTrigger(hour=3, minute=0) scheduler.add_job( expire_subscriptions, trigger=daily, id="expire_subscriptions", name="Check and expire subscriptions", replace_existing=True, ) scheduler.add_job( send_reminders, trigger=daily, id="send_reminders", name="Send subscription expiry reminders", replace_existing=True, ) scheduler.add_job( revoke_expired, trigger=daily, id="revoke_expired", name="Revoke VPN access for expired users", replace_existing=True, ) scheduler.add_job( sync_servers, trigger=daily, id="sync_servers", name="Sync server status and health", replace_existing=True, ) logger.info("Scheduler configured with {} daily jobs", len(scheduler.get_jobs())) return scheduler