from apscheduler.schedulers.asyncio import AsyncIOScheduler
from sqlalchemy.ext.asyncio import AsyncSession

from src.bot.main import bot
from src.database.session import SessionLocal
from src.database.db_methods.strategy import get_due_for_daily_issue, ensure_today_issued
from src.bot.keyboards.daily import kb_daily_step

# вынеси в utils при желании
def _extract_day_html(steps: dict, day: int) -> str:
    if not isinstance(steps, dict):
        return ""
    val = steps.get(str(day))
    if isinstance(val, dict):
        return val.get("html", "")
    if isinstance(val, str):
        return val
    return ""

_scheduler: AsyncIOScheduler | None = None
_bot = bot

async def _issue_daily_steps():
    async with SessionLocal() as session:
        strategies = await get_due_for_daily_issue(session)
        for strat in strategies:
            try:
                chat_id = int(strat.user.tg_id)
                html = _extract_day_html(strat.steps or {}, strat.current_day or 1) or "Сегодняшний шаг недоступен."
                await _bot.send_message(chat_id, html, reply_markup=kb_daily_step())
                await ensure_today_issued(session, strat.id)
                await session.commit()
            except Exception:
                await session.rollback()
                # TODO: logger.exception("Failed daily issue", exc_info=True)

def init_scheduler(bot):
    global _scheduler, _bot
    _bot = bot
    if _scheduler:
        return _scheduler
    _scheduler = AsyncIOScheduler(timezone="UTC")
    _scheduler.add_job(_issue_daily_steps, "interval", minutes=1, id="issue_daily_steps")
    _scheduler.start()
    return _scheduler
