import asyncio
from apscheduler.schedulers.asyncio import AsyncIOScheduler

from .agents import AGENT_REGISTRY

scheduler = AsyncIOScheduler(timezone="Asia/Seoul")

async def _run_stock_schedule():
    agent = AGENT_REGISTRY.get("stock")
    if agent:
        await agent.on_schedule()

async def _run_stock_screener():
    agent = AGENT_REGISTRY.get("stock")
    if agent:
        await agent.on_screener_schedule()

async def _run_stock_ai_news():
    agent = AGENT_REGISTRY.get("stock")
    if agent:
        await agent.on_ai_news_schedule()

async def _run_insta_schedule():
    agent = AGENT_REGISTRY.get("insta")
    if agent:
        await agent.on_schedule()


async def _run_insta_trends_collect():
    agent = AGENT_REGISTRY.get("insta")
    if agent:
        await agent.on_command("collect_trends", {})

async def _run_lotto_schedule():
    agent = AGENT_REGISTRY.get("lotto")
    if agent:
        await agent.on_schedule()

async def _run_youtube_research():
    agent = AGENT_REGISTRY.get("youtube")
    if agent:
        await agent.on_schedule()

async def _send_youtube_weekly_report():
    agent = AGENT_REGISTRY.get("youtube")
    if agent:
        await agent.send_weekly_report()

async def _poll_pipelines():
    agent = AGENT_REGISTRY.get("youtube_publisher")
    if agent:
        await agent.poll_state_changes()

def init_scheduler():
    scheduler.add_job(_run_stock_schedule, "cron", hour=7, minute=30, id="stock_news")
    scheduler.add_job(
        _run_stock_screener,
        "cron",
        day_of_week="mon-fri",
        hour=16,
        minute=30,
        id="stock_screener",
    )
    scheduler.add_job(
        _run_stock_ai_news,
        "cron",
        day_of_week="mon-fri",
        hour=8,
        minute=0,
        id="stock_ai_news_sentiment",
    )
    scheduler.add_job(_run_insta_schedule, "cron", hour=9, minute=30, id="insta_pipeline")
    # 09:00 cron 스태거링 — Celeron 2C/2.0GHz에서 동시 실행 시 CPU 폭주 (CHECK_POINT FU-A)
    scheduler.add_job(_run_insta_trends_collect, "cron", hour=9, minute=0,  id="insta_trends_collect")
    scheduler.add_job(_run_lotto_schedule,       "cron", day_of_week="mon", hour=9, minute=5, id="lotto_curate")
    scheduler.add_job(_run_youtube_research,     "cron", hour=9, minute=10, id="youtube_research")
    scheduler.add_job(_send_youtube_weekly_report, "cron", day_of_week="mon", hour=8, minute=0, id="youtube_weekly_report")
    scheduler.add_job(_poll_pipelines, "interval", seconds=30, id="pipeline_poll")
    scheduler.start()
