from __future__ import annotations

from datetime import datetime
from typing import List, Optional, Tuple


def _fmt_date(iso: str) -> str:
    """ISO → DD.MM. Best-effort; unparseable → raw string."""
    try:
        return datetime.fromisoformat(iso).strftime("%d.%m")
    except (ValueError, TypeError):
        return iso


def format_stats_report(
    *,
    title: str,
    event_type: str,
    started: int,
    started_24h: int,
    started_7d: int,
    subscribed: int,
    total: int,
    blocked: int,
    material_rows: "List[Tuple[str, int, int]]",
    gate_channel: "Optional[str]",
    gate_delivered: int,
    gate_stuck: int,
    recent_broadcasts: "List[dict]",
) -> str:
    """Assemble the HTML /stats message. Pure — no db, no aiogram.

    material_rows / gate section render only for event_type == 'idle';
    the subscription line only for 'conference'; time windows and the
    recent-broadcasts section render for every type.
    """
    parts = [f"📊 <b>Статистика: {title}</b>"]

    window = f"  (+{started_24h} за 24ч, +{started_7d} за 7 дней)"
    if event_type == "conference":
        parts.append(
            f"\n\nВоронка по конференции:\n"
            f"• Запустили бота: {started}{window}\n"
            f"• Прошли проверку подписки: {subscribed}"
        )
    elif event_type == "webinar":
        parts.append(f"\n\nВебинар.\n• Запустили бота: {started}{window}")
    else:  # idle / archive
        parts.append(f"\n\nАрхив активен.\n• Запустили бота: {started}{window}")
        if material_rows:
            lines = "\n".join(
                f"• {t} — {clicks} / {uniques} чел." for t, clicks, uniques in material_rows
            )
            parts.append(f"\n\nМатериалы (клики / уник. людей):\n{lines}")
        else:
            parts.append("\n\nМатериалы: кликов пока нет.")
        if gate_channel:
            denom = gate_delivered + gate_stuck
            conv = round(gate_delivered / denom * 100) if denom else 0
            parts.append(
                f"\n\nГейт ({gate_channel}):\n"
                f"• Открыли материал: {gate_delivered} чел.\n"
                f"• Застряли на подписке: {gate_stuck} чел.\n"
                f"• Конверсия в подписку: {conv}%"
            )

    parts.append(
        f"\n\n📦 Всего по боту:\n"
        f"• Уникальных пользователей: {total}\n"
        f"• Заблокировали бота: {blocked}"
    )

    if recent_broadcasts:
        lines = "\n".join(
            f"• {b['kind']} · {_fmt_date(b['created_at'])} · "
            f"{b['delivered']}✓ {b['skipped']}⊘ {b['errors']}✗"
            for b in recent_broadcasts
        )
        parts.append(f"\n\nПоследние рассылки:\n{lines}")

    return "".join(parts)
