from handlers.admin import build_admin_menu, MENU_ACTIONS, _MENU_ITEMS


def _actions(markup):
    return [btn.callback_data for row in markup.inline_keyboard for btn in row]


def _labels(markup):
    return [btn.text for row in markup.inline_keyboard for btn in row]


def test_menu_idle_has_broadcast_all_and_material_actions():
    actions = _actions(build_admin_menu("idle"))
    assert "menu:broadcast_all" in actions
    assert "menu:add_material" in actions
    assert "menu:list_materials" in actions
    assert "menu:remove_material" in actions
    assert "menu:set_archive_welcome" in actions
    assert "menu:set_gate_channel" in actions
    assert "menu:stats" in actions
    assert "menu:to_idle" not in actions  # уже в архиве


def test_menu_webinar_has_webinar_broadcasts_and_to_idle():
    actions = _actions(build_admin_menu("webinar"))
    assert "menu:broadcast_invite_all" in actions
    assert "menu:broadcast_zoom" in actions
    assert "menu:set_welcome" in actions
    assert "menu:to_idle" in actions
    assert "menu:add_material" not in actions


def test_menu_conference_has_conference_broadcasts_and_to_idle():
    actions = _actions(build_admin_menu("conference"))
    assert "menu:broadcast_stream" in actions
    assert "menu:broadcast_record" in actions
    assert "menu:broadcast_unsubscribed" in actions
    assert "menu:set_welcome" in actions
    assert "menu:to_idle" in actions


def test_menu_unknown_type_is_empty():
    assert build_admin_menu("nonsense").inline_keyboard == []


def test_menu_callback_data_within_telegram_limit():
    for t in ("idle", "webinar", "conference"):
        for cd in _actions(build_admin_menu(t)):
            assert len(cd.encode("utf-8")) <= 64


def test_menu_labels_nonempty():
    for t in ("idle", "webinar", "conference"):
        assert all(lbl.strip() for lbl in _labels(build_admin_menu(t)))


def test_every_menu_action_is_dispatchable():
    # Защита от мёртвых кнопок: каждая кнопка меню обязана иметь ветку в диспатче.
    # MENU_ACTIONS зеркалит ветки on_menu_action (handlers/admin.py).
    for items in _MENU_ITEMS.values():
        for _label, action in items:
            assert action in MENU_ACTIONS
