from services.stats import format_stats_report


def _base(**over):
    args = dict(
        title="Архив", event_type="idle", started=340, started_24h=12, started_7d=58,
        subscribed=0, total=512, blocked=8,
        material_rows=[("Скилл на GitHub", 87, 62), ("Запись", 54, 40)],
        gate_channel="@chan", gate_delivered=71, gate_stuck=25,
        recent_broadcasts=[{"kind": "всем", "delivered": 480, "skipped": 12, "errors": 3,
                            "created_at": "2026-07-22T09:00:00+00:00"}],
    )
    args.update(over)
    return args


def test_idle_shows_material_tops():
    out = format_stats_report(**_base())
    assert "Скилл на GitHub" in out
    assert "87" in out and "62" in out


def test_idle_shows_gate_conversion():
    out = format_stats_report(**_base())
    # 71 / (71+25) = 74%
    assert "74%" in out
    assert "@chan" in out


def test_idle_gate_hidden_when_no_channel():
    out = format_stats_report(**_base(gate_channel=None, gate_delivered=0, gate_stuck=0))
    assert "конверси" not in out.lower()


def test_time_windows_present():
    out = format_stats_report(**_base())
    assert "12" in out and "58" in out


def test_conference_shows_subscribed_not_materials():
    out = format_stats_report(**_base(
        event_type="conference", title="Конфа", subscribed=120, material_rows=[], gate_channel=None))
    assert "проверку" in out.lower() or "подписк" in out.lower()
    assert "Скилл на GitHub" not in out


def test_recent_broadcasts_rendered():
    out = format_stats_report(**_base())
    assert "22.07" in out
    assert "480" in out


def test_no_broadcasts_section_when_empty():
    out = format_stats_report(**_base(recent_broadcasts=[]))
    assert "Последние рассылки" not in out


def test_material_zero_conversion_no_crash():
    out = format_stats_report(**_base(gate_delivered=0, gate_stuck=0))
    assert "0%" in out  # 0/(0) guarded → 0%


def test_idle_no_clicks_message():
    out = format_stats_report(**_base(material_rows=[]))
    assert "кликов пока нет" in out
