from telebot.types import InlineKeyboardButton, InlineKeyboardMarkup

from src.repositories import repo


# ID emoji premium yang ditampilkan di depan tulisan tombol.
# Ganti ID ini apabila ingin memakai emoji premium lain.
PREMIUM_BUTTON_ICON_ID = "5379703922745159290"


def kb(rows):
    """
    Membuat inline keyboard.

    Format tombol yang didukung:

    1. Tombol biasa:
       ("Teks", "callback_atau_url")

    2. Tombol dengan emoji premium:
       ("Teks", "callback_atau_url", "CUSTOM_EMOJI_ID")
    """
    markup = InlineKeyboardMarkup()

    callback_prefixes = (
        "adm:", "media:", "cat:", "tpl:", "fs:",
        "usr:", "set:", "verify:", "btn:", "donate:", "sys:",
    )

    for row in rows:
        buttons = []

        for item in row:
            if len(item) == 2:
                text, target = item
                icon_custom_emoji_id = None
            elif len(item) == 3:
                text, target, icon_custom_emoji_id = item
            else:
                raise ValueError(
                    "Format tombol harus berupa "
                    "(text, target) atau (text, target, custom_emoji_id)"
                )

            button_kwargs = {
                "text": text,
            }

            if icon_custom_emoji_id:
                button_kwargs["icon_custom_emoji_id"] = str(
                    icon_custom_emoji_id
                )

            if target.startswith(callback_prefixes):
                button_kwargs["callback_data"] = target
            else:
                button_kwargs["url"] = target

            buttons.append(InlineKeyboardButton(**button_kwargs))

        markup.row(*buttons)

    return markup


def admin_home():
    return kb([
        [
            ("Upload", "adm:upload", PREMIUM_BUTTON_ICON_ID),
            ("Media", "adm:media", PREMIUM_BUTTON_ICON_ID),
        ],
        [
            ("Kategori", "adm:categories", PREMIUM_BUTTON_ICON_ID),
            ("Template", "adm:templates", PREMIUM_BUTTON_ICON_ID),
        ],
        [
            ("Force Subscribe", "adm:fsubs", PREMIUM_BUTTON_ICON_ID),
            ("User", "adm:users", PREMIUM_BUTTON_ICON_ID),
        ],
        [
            ("Statistik", "adm:stats", PREMIUM_BUTTON_ICON_ID),
            ("Broadcast", "adm:broadcast", PREMIUM_BUTTON_ICON_ID),
        ],
        [
            ("Pengaturan Bot", "adm:settings", PREMIUM_BUTTON_ICON_ID),
            ("Sistem", "adm:system", PREMIUM_BUTTON_ICON_ID),
        ],
        [
            ("Backup", "adm:backup", PREMIUM_BUTTON_ICON_ID),
        ],
    ])


def back(cb="adm:home"):
    return kb([[("⬅️ Kembali", cb)]])


def cancel():
    return kb([[("❌ Batal", "adm:cancel")]])


def welcome():
    rows = []

    for button in repo.buttons():
        if button["setting_key"] == "donation_enabled":
            rows.append([(button["label"], "donate:menu")])
            continue

        url = button["resolved_url"] or button["url"]
        if url:
            rows.append([(button["label"], url)])

    return kb(rows)


def join(code):
    rows = [
        [(channel["button_text"], channel["invite_link"])]
        for channel in repo.fsubs()
    ]

    rows.append([
        ("✅ Saya Sudah Bergabung", f"verify:{code}")
    ])

    return kb(rows)


def media_actions(mid):
    return kb([
        [
            ("✏️ Judul", f"media:edit:title:{mid}"),
            ("📝 Caption", f"media:edit:user_caption:{mid}"),
        ],
        [
            ("🖼 Thumbnail", f"media:edit:thumbnail_file_id:{mid}"),
            ("📄 Nama File", f"media:edit:filename:{mid}"),
        ],
        [
            ("📂 Kategori", f"media:category:{mid}"),
            ("🔄 Posting Ulang", f"media:repost:{mid}"),
        ],
        [
            ("🗑 Hapus", f"media:delete:{mid}"),
        ],
        [
            ("⬅️ Kembali", "adm:media"),
        ],
    ])


def donation_menu():
    return kb([
        [
            ("⭐ 10", "donate:10"),
            ("⭐ 25", "donate:25"),
        ],
        [
            ("⭐ 50", "donate:50"),
            ("⭐ 100", "donate:100"),
        ],
        [
            ("⭐ 250", "donate:250"),
            ("⭐ 500", "donate:500"),
        ],
        [
            ("⬅️ Kembali", "donate:back"),
        ],
    ])
