import json
import re
from aiogram.types import InlineKeyboardButton, KeyboardButton

# Mapping standard emojis to their Telegram Premium tg-emoji tag versions (for HTML message texts)
EMOJI_MAPPING = {
    "👑": '<tg-emoji emoji-id="4972406526183474660">👑</tg-emoji>',
    "💎": '<tg-emoji emoji-id="4974419933837394924">💎</tg-emoji>',
    "🔒": '<tg-emoji emoji-id="4974309102206321805">🔒</tg-emoji>',
    "✅": '<tg-emoji emoji-id="4974390358692594725">✅</tg-emoji>',
    "⚡️": '<tg-emoji emoji-id="4974586307985540125">⚡️</tg-emoji>',
    "⚡": '<tg-emoji emoji-id="4974586307985540125">⚡</tg-emoji>',
    "🌟": '<tg-emoji emoji-id="4974609724147237906">🌟</tg-emoji>',
    "👛": '<tg-emoji emoji-id="4974434416467117205">👛</tg-emoji>',
    "💵": '<tg-emoji emoji-id="5318970495314436977">💵</tg-emoji>',
    "🔥": '<tg-emoji emoji-id="6132145045832209231">🔥</tg-emoji>',
    "🚨": '<tg-emoji emoji-id="4974774466207810819">🚨</tg-emoji>',
    "⚠️": '<tg-emoji emoji-id="6132092002986103018">⚠️</tg-emoji>',
    "🚀": '<tg-emoji emoji-id="6131900808221955818">🚀</tg-emoji>',
    "💳": '<tg-emoji emoji-id="6131803260924727504">💳</tg-emoji>',
    "📢": '<tg-emoji emoji-id="6131860572968325058">📢</tg-emoji>',
    "🪙": '<tg-emoji emoji-id="6131918241494208231">🪙</tg-emoji>',
    "💸": '<tg-emoji emoji-id="5348533051565571689">💸</tg-emoji>',
    "💰": '<tg-emoji emoji-id="5316898581616035042">💰</tg-emoji>',
    
    # Newly expanded mapping for standard emojis used in menus/texts
    "🛒": '<tg-emoji emoji-id="5316898581616035042">🛒</tg-emoji>',
    "👤": '<tg-emoji emoji-id="5317006024517912643">👤</tg-emoji>',
    "📦": '<tg-emoji emoji-id="5316898581616035042">📦</tg-emoji>',
    "📚": '<tg-emoji emoji-id="4974609724147237906">📚</tg-emoji>',
    "👨‍💻": '<tg-emoji emoji-id="6131900808221955818">👨‍💻</tg-emoji>',
    "🔙": '<tg-emoji emoji-id="6131900808221955818">🔙</tg-emoji>',
    "❌": '<tg-emoji emoji-id="4974566529661142011">❌</tg-emoji>',
    "⏳": '<tg-emoji emoji-id="4972028457392276859">⏳</tg-emoji>',
    "🔄": '<tg-emoji emoji-id="4974586307985540125">🔄</tg-emoji>',
    "🎮": '<tg-emoji emoji-id="6131900808221955818">🎮</tg-emoji>',
    "📂": '<tg-emoji emoji-id="4974609724147237906">📂</tg-emoji>',
    "📁": '<tg-emoji emoji-id="4974609724147237906">📁</tg-emoji>',
    "➕": '<tg-emoji emoji-id="4974586307985540125">➕</tg-emoji>',
    "➖": '<tg-emoji emoji-id="4974586307985540125">➖</tg-emoji>',
    "⚙️": '<tg-emoji emoji-id="4974586307985540125">⚙️</tg-emoji>',
    "⚙": '<tg-emoji emoji-id="4974586307985540125">⚙</tg-emoji>',
    "📱": '<tg-emoji emoji-id="4972107617934508864">📱</tg-emoji>',
    "🧾": '<tg-emoji emoji-id="5318970495314436977">🧾</tg-emoji>',
    "🏷": '<tg-emoji emoji-id="6131918241494208231">🏷</tg-emoji>',
    "📋": '<tg-emoji emoji-id="4972371565149684937">📋</tg-emoji>',
    "📝": '<tg-emoji emoji-id="4972371565149684937">📝</tg-emoji>',
    "🆔": '<tg-emoji emoji-id="5334890573281114250">🆔</tg-emoji>',
    "✨": '<tg-emoji emoji-id="4974785242280756276">✨</tg-emoji>',
    "💡": '<tg-emoji emoji-id="6131706121649393963">💡</tg-emoji>',
    "🌐": '<tg-emoji emoji-id="4974458210585937148">🌐</tg-emoji>',
    "📊": '<tg-emoji emoji-id="4974609724147237906">📊</tg-emoji>',
    "👥": '<tg-emoji emoji-id="4972406526183474660">👥</tg-emoji>',
    "🛠": '<tg-emoji emoji-id="4974586307985540125">🛠</tg-emoji>',
    "🗑": '<tg-emoji emoji-id="6132092002986103018">🗑</tg-emoji>',
    "✏️": '<tg-emoji emoji-id="4974586307985540125">✏️</tg-emoji>',
    "🕒": '<tg-emoji emoji-id="4974586307985540125">🕒</tg-emoji>',
    "📅": '<tg-emoji emoji-id="4974609724147237906">📅</tg-emoji>',
    "📆": '<tg-emoji emoji-id="4974609724147237906">📆</tg-emoji>',
    "📜": '<tg-emoji emoji-id="4974609724147237906">📜</tg-emoji>'
}

# Mapping standard emoji characters to raw custom emoji IDs for InlineKeyboardButton and KeyboardButton
EMOJI_ID_MAPPING = {
    "👑": "4972406526183474660",
    "💎": "4974419933837394924",
    "🔒": "4974309102206321805",
    "✅": "4974390358692594725",
    "⚡️": "4974586307985540125",
    "⚡": "4974586307985540125",
    "🌟": "4974609724147237906",
    "👛": "4974434416467117205",
    "💵": "5318970495314436977",
    "🔥": "6132145045832209231",
    "🚨": "4974774466207810819",
    "⚠️": "6132092002986103018",
    "🚀": "6131900808221955818",
    "💳": "6131803260924727504",
    "📢": "6131860572968325058",
    "🪙": "6131918241494208231",
    "💸": "5348533051565571689",
    "💰": "5316898581616035042",
    
    # Extra button emoji mapping equivalents
    "🛒": "5316898581616035042",
    "👤": "5317006024517912643",
    "📦": "5316898581616035042",
    "📚": "4974609724147237906",
    "👨‍💻": "6131900808221955818",
    "🔙": "6131900808221955818",
    "❌": "4974566529661142011",
    "⏳": "4972028457392276859",
    "🔄": "4974586307985540125",
    "🎮": "6131900808221955818",
    "📂": "4974609724147237906",
    "📁": "4974609724147237906",
    "➕": "4974586307985540125",
    "➖": "4974586307985540125",
    "⚙️": "4974586307985540125",
    "⚙": "4974586307985540125",
    "📱": "4972107617934508864",
    "🧾": "5318970495314436977",
    "🏷": "6131918241494208231",
    "📋": "4972371565149684937",
    "📝": "4972371565149684937",
    "🆔": "5334890573281114250",
    "✨": "4974785242280756276",
    "💡": "6131706121649393963",
    "🌐": "4974458210585937148",
    "📊": "4974609724147237906",
    "👥": "4972406526183474660",
    "🛠": "4974586307985540125",
    "🗑": "6132092002986103018",
    "✏️": "4974586307985540125",
    "🕒": "4974586307985540125",
    "📅": "4974609724147237906",
    "📆": "4974609724147237906",
    "📜": "4974609724147237906"
}

# Preferred custom emoji pack:
# https://t.me/addemoji/Typical_Indigo_Bandicoot_by_fStikBot
TYPICAL_INDIGO_EMOJI_IDS = {
    "👑": "6257971296794057056",
    "💎": "6260209219568409663",
    "🔒": "6258078975919133199",
    "✅": "6260349948466828028",
    "⚡️": "6253738456199992791",
    "⚡": "6253738456199992791",
    "🌟": "6257891341682872837",
    "👛": "6257905682578674887",
    "💵": "6258216247368880708",
    "🔥": "6257918649084940776",
    "🚨": "6339133761938003028",
    "⚠️": "6258151397657678591",
    "⚠": "6258151397657678591",
    "🚀": "6338875316575932763",
    "💳": "6122853472497834110",
    "📢": "6257952222844294686",
    "🪙": "6339201961723696066",
    "💸": "6260483981511233469",
    "💰": "6257905682578674887",
    "🛒": "6253453966156240467",
    "🛍": "6253453966156240467",
    "👤": "6064503013182019795",
    "📦": "6253453966156240467",
    "📚": "6260286189677319152",
    "👨‍💻": "6064503013182019795",
    "🔙": "6053065506682836264",
    "❌": "6053225240811540857",
    "⏳": "6260136553016725875",
    "🔄": "6258061040135706479",
    "🎮": "6222265893632611734",
    "📂": "6337068672942610171",
    "📁": "6337068672942610171",
    "➕": "6273693926524196526",
    "➖": "6257898664602112893",
    "⚙️": "6219902282935311082",
    "⚙": "6219902282935311082",
    "📱": "6258230313386776331",
    "🧾": "6260286189677319152",
    "🏷": "6197436606090057282",
    "📋": "6260286189677319152",
    "📝": "6260286189677319152",
    "🆔": "6260286189677319152",
    "✨": "6257891341682872837",
    "💡": "6257891341682872837",
    "🌐": "6197356852842337443",
    "📊": "6257870936293251906",
    "📈": "6257870936293251906",
    "👥": "6064503013182019795",
    "🛠": "6219902282935311082",
    "🗑": "6053225240811540857",
    "✏️": "6260286189677319152",
    "🕒": "6197327921942631971",
    "📅": "6197327921942631971",
    "📆": "6197327921942631971",
    "📜": "6260286189677319152",
    "🎁": "6260176972953949338",
    "🎉": "6219786297343483841",
    "👇": "6258247141068640679",
    "👍": "6255861986815382383",
    "❤️": "6307651655953292684",
    "⭐": "6257907623903892878",
    "⭐️": "6257907623903892878",
    "🇮🇷": "6172386054717313748",
    "🇦🇫": "6170092447691970535",
    "🔗": "6260119914313422111",
    "❓": "6197443825930081245",
    "‼️": "6258151397657678591",
    "⁉️": "6339095618333446835",
    "✔️": "6257845123539801499",
    "🔝": "6258129562043944991",
}

EMOJI_ID_MAPPING.update(TYPICAL_INDIGO_EMOJI_IDS)
EMOJI_MAPPING.update({
    emoji: f'<tg-emoji emoji-id="{emoji_id}">{emoji}</tg-emoji>'
    for emoji, emoji_id in TYPICAL_INDIGO_EMOJI_IDS.items()
})

# Preferred channel source:
# https://t.me/CustomEmojiPack
CUSTOM_EMOJI_PACK_IDS = {
    "‼️": "6032762208432166952",
    "⁉️": "5435994300997443130",
    "⏳": "5848166296461517089",
    "☀️": "5318861536289108970",
    "⚙": "5258096772776991776",
    "⚙️": "5316977664848837418",
    "⚠️": "5841500627477206443",
    "⚡": "6032761031611128647",
    "⚡️": "5841415930722128655",
    "✅": "5841383031272641845",
    "✏️": "5334673106202010226",
    "✔️": "5454154938848400188",
    "✨": "5319201848022808495",
    "❌": "5841197488685455118",
    "❓": "6032838293777814916",
    "❤️": "5841576261851288727",
    "➕": "5940582340425159463",
    "➖": "6060138016444257155",
    "➡️": "6260348883314938628",
    "⭐": "5335014599051731395",
    "⭐️": "5852770467043089990",
    "🆔": "5413605869139022016",
    "🇦🇫": "5915825019354618199",
    "🇮🇷": "5062298886018696652",
    "🌅": "5190647266330824422",
    "🌐": "6032862160911080021",
    "🌙": "5316710702566619149",
    "🌟": "5852594914549834478",
    "🌤": "5283075860188898177",
    "🎁": "5766993136849000790",
    "🎉": "5836919400610929811",
    "🎨": "5413457619752867585",
    "🎮": "5316728625465146646",
    "🎯": "5845940459725135862",
    "🏠": "5344051712753694155",
    "🏷": "5296348778012361146",
    "👁‍🗨": "5228686859663585439",
    "👇": "5224641356953050625",
    "👋": "5852780646115582498",
    "👍": "5850527089660273029",
    "👑": "5841511175916889376",
    "👛": "5316979275461573049",
    "👤": "5316705578670636235",
    "👥": "5204259258937403283",
    "👨‍💻": "6100687958031993953",
    "💎": "5832525820865814142",
    "💠": "6205965994528086727",
    "💡": "5316637280100693932",
    "💫": "5316883317302246413",
    "💰": "5927019417819943957",
    "💳": "5841684559451657812",
    "💵": "5845871456780555615",
    "💸": "5897931777577587776",
    "💾": "5884448719889240368",
    "📁": "5257965810634202885",
    "📂": "5258514780469075716",
    "📄": "5296781208204620006",
    "📅": "5841259465063535694",
    "📆": "5276475281433973810",
    "📈": "5456190710397031903",
    "📊": "5841397651341318113",
    "📋": "5435970940670320222",
    "📌": "5316650525779835016",
    "📚": "5436262556064817413",
    "📜": "5269316348340612870",
    "📝": "5960705567876979312",
    "📢": "6059685262466748313",
    "📤": "5433614747381538714",
    "📥": "5433811242135331842",
    "📦": "5821136061518060371",
    "📧": "5454384560684948141",
    "📱": "5846117524046877889",
    "📸": "5258205968025525531",
    "🔄": "5449381602389925131",
    "🔊": "5463207896684706519",
    "🔌": "5816625186216090280",
    "🔍": "5301171528069561042",
    "🔎": "5818897412894233827",
    "🔐": "6050646916109179497",
    "🔑": "5190810548102516273",
    "🔒": "5316858509571144216",
    "🔔": "5841254620340425161",
    "🔕": "5317012990954847445",
    "🔗": "5803014250171469676",
    "🔘": "5316770651720137011",
    "🔙": "6206505206197261313",
    "🔝": "5983351379945592829",
    "🔢": "5334927883662027664",
    "🔥": "5900131642646730168",
    "🔴": "5841380870904092048",
    "🔸": "5983051105897027582",
    "🔹": "6030603819862202349",
    "🕒": "5850701284943859287",
    "🗑": "5935949943318516172",
    "🚀": "5881925697185781113",
    "🚦": "6050827132936921157",
    "🚨": "6032896116922521920",
    "🛍": "6098435638527266289",
    "🛒": "6003375647055945783",
    "🛠": "5249233549415963857",
    "🟢": "5841423923656267668",
    "🤖": "5077850846633395704",
    "🧑‍💻": "4900124588823807732",
    "🧩": "6280772006858199840",
    "🧹": "5845947563601041174",
    "🧾": "5938473670396612250",
    "🪙": "5848381667596571520",
}

EMOJI_ID_MAPPING.update(CUSTOM_EMOJI_PACK_IDS)
EMOJI_MAPPING.update({
    emoji: f'<tg-emoji emoji-id="{emoji_id}">{emoji}</tg-emoji>'
    for emoji, emoji_id in CUSTOM_EMOJI_PACK_IDS.items()
})

# Forced pack source per shop preference:
# https://t.me/addemoji/Emoji_fan103_by_TgEmodziBot
# https://t.me/addemoji/emj_7ad48_by_TgEmodziBot
# https://t.me/addemoji/yasno_zadrot
FORCED_SHOP_EMOJI_IDS = {
    "👑": "4972406526183474660",
    "💎": "4974419933837394924",
    "🔒": "4974309102206321805",
    "✅": "4974390358692594725",
    "⚡️": "4974586307985540125",
    "⚡": "4974586307985540125",
    "🌟": "4974609724147237906",
    "👛": "4974434416467117205",
    "💵": "5318970495314436977",
    "🔥": "6132145045832209231",
    "🚨": "4974774466207810819",
    "⚠️": "4974320144567239752",
    "⚠": "4974320144567239752",
    "🚀": "4974235563776279494",
    "💳": "6131803260924727504",
    "📢": "6131860572968325058",
    "🪙": "6131918241494208231",
    "💸": "5348533051565571689",
    "💰": "5316898581616035042",
    "🛒": "4974318916206593106",
    "👤": "5317006024517912643",
    "📦": "5316898581616035042",
    "📚": "4974609724147237906",
    "👨‍💻": "4972428232948188067",
    "🔙": "4974235563776279494",
    "❌": "4974566529661142011",
    "⏳": "4972028457392276859",
    "🔄": "4974415969582580665",
    "🎮": "4974289341061792798",
    "📂": "4974609724147237906",
    "📁": "4974609724147237906",
    "➕": "4974586307985540125",
    "➖": "4974747171690644564",
    "⚙️": "4974586307985540125",
    "⚙": "4974586307985540125",
    "📱": "4972107617934508864",
    "🧾": "5318970495314436977",
    "🏷": "4974592801976091879",
    "📋": "4972371565149684937",
    "📝": "4972371565149684937",
    "🆔": "5334890573281114250",
    "✨": "4974785242280756276",
    "💡": "6131706121649393963",
    "🌐": "4974458210585937148",
    "📊": "4974609724147237906",
    "📈": "4974609724147237906",
    "👥": "4972406526183474660",
    "🛠": "4974586307985540125",
    "🗑": "4974566529661142011",
    "✏️": "4974311271164806490",
    "🕒": "4974586307985540125",
    "📅": "4974378337079133190",
    "📆": "4974378337079133190",
    "📜": "4974609724147237906",
    "🎁": "4974414728337032308",
    "🎉": "4974609724147237906",
    "👇": "4974586307985540125",
    "👍": "5316773937370132101",
    "❤️": "4974463381726561612",
    "⭐": "4972234633002354016",
    "⭐️": "4974708903532037438",
    "🔗": "5316959011805889258",
    "❓": "4971986160554345777",
    "‼️": "4974320144567239752",
    "⁉️": "4971986160554345777",
    "✔️": "5317020017521359483",
    "🔝": "4974609724147237906",
    "🔹": "4974609724147237906",
    "🔑": "4974586307985540125",
    "🔍": "4974353348959405083",
    "📧": "4974448933456577602",
    "💫": "4972052964475667334",
    "🟢": "4972151508205307221",
    "☀️": "4972243446275245352",
    "🌙": "4974640162580464712",
    "🌤": "4972243446275245352",
    "🌅": "4974640162580464712",
}

EMOJI_ID_MAPPING.update(FORCED_SHOP_EMOJI_IDS)
EMOJI_MAPPING.update({
    emoji: f'<tg-emoji emoji-id="{emoji_id}">{emoji}</tg-emoji>'
    for emoji, emoji_id in FORCED_SHOP_EMOJI_IDS.items()
})

EMOJI_ID_MAPPING = dict(FORCED_SHOP_EMOJI_IDS)
EMOJI_MAPPING = {
    emoji: f'<tg-emoji emoji-id="{emoji_id}">{emoji}</tg-emoji>'
    for emoji, emoji_id in FORCED_SHOP_EMOJI_IDS.items()
}

# Final curated style from scanned packs. Primary style: RestrictedEmoji.
# Fallbacks are only used when the primary pack does not provide the needed emoji.
STYLED_SCAN_EMOJI_IDS = {
    "‼️": "5467890025217661107",
    "⁉️": "5467596412663372909",
    "⏳": "5451732530048802485",
    "☀️": "5469947168523558652",
    "⚙": "5877260593903177342",
    "⚙️": "5467687036473336725",
    "⚠️": "5881702736843511327",
    "⚠": "5881702736843511327",
    "⚡": "6253738456199992791",
    "⚡️": "5431449001532594346",
    "✅": "5427009714745517609",
    "✏️": "5334673106202010226",
    "✔️": "5188216731453103384",
    "✨": "5472164874886846699",
    "❌": "5465665476971471368",
    "❓": "5467666648263564704",
    "❤️": "5449505950283078474",
    "➕": "5226945370684140473",
    "➖": "5229113891081956317",
    "➡️": "5877468380125990242",
    "⭐": "6206144385994725109",
    "⭐️": "5435957248314579621",
    "🆔": "5836782704686798781",
    "🇦🇫": "5341723801824541640",
    "🇮🇷": "5271878966347601947",
    "🌐": "5879585266426973039",
    "🌙": "4974640162580464712",
    "🌅": "4974640162580464712",
    "🌟": "5458799228719472718",
    "🌤": "5283075860188898177",
    "🎁": "5199749070830197566",
    "🎉": "5436040291507247633",
    "🎨": "5431456208487716895",
    "🎮": "5467583879948803288",
    "🎯": "5350460637182993292",
    "🏠": "5465226866321268133",
    "🏷": "5854776233950188167",
    "👁‍🗨": "5228686859663585439",
    "👇": "5470177992950946662",
    "👋": "5472055112702629499",
    "👍": "5469770542288478598",
    "👑": "5467406098367521267",
    "👛": "5472363448404809929",
    "👤": "5373012449597335010",
    "👥": "5372926953978341366",
    "👨‍💻": "5190498849440931467",
    "🧑‍💻": "5190458330719461749",
    "💎": "5471952986970267163",
    "💠": "6205965994528086727",
    "💡": "5472146462362048818",
    "💫": "5469741319330996757",
    "💰": "5375296873982604963",
    "💳": "5967548335542767952",
    "💵": "5967390100357648692",
    "💸": "5472030678633684592",
    "💾": "5884448719889240368",
    "📁": "5433653135799228968",
    "📂": "5431721976769027887",
    "📄": "5839323457015256759",
    "📅": "5967412305338568701",
    "📆": "5431897022456145283",
    "📈": "5373001317042101552",
    "📊": "5431577498364158238",
    "📋": "4972371565149684937",
    "📌": "5908961403917570106",
    "📚": "5373098009640836781",
    "📜": "5334882760735598374",
    "📝": "5334882760735598374",
    "📢": "5771695636411847302",
    "📤": "5433614747381538714",
    "📥": "5433811242135331842",
    "📦": "5924720918826848520",
    "📧": "5454384560684948141",
    "📱": "5407025283456835913",
    "📸": "5884290437459480896",
    "🔄": "5264727218734524899",
    "🔊": "5890997763331591703",
    "🔌": "5816625186216090280",
    "🔍": "5188217332748527444",
    "🔎": "5188311512791393083",
    "🔐": "5472308992514464048",
    "🔑": "5330115548900501467",
    "🔒": "5832546462478635761",
    "🔔": "5242628160297641831",
    "🔕": "5244807637157029775",
    "🔗": "5375129357373165375",
    "🔘": "5316770651720137011",
    "🔙": "6206505206197261313",
    "🔝": "5422354988103901774",
    "🔢": "5226513232549664618",
    "🔥": "5420315771991497307",
    "🔴": "5967333011652350314",
    "🔸": "6307313006371936255",
    "🔹": "6307313006371936255",
    "🕒": "5778605968208170641",
    "🗑": "5879896690210639947",
    "🚀": "5445284980978621387",
    "🚦": "6050827132936921157",
    "🚨": "6339133761938003028",
    "🛍": "5373052667671093676",
    "🛒": "5431499171045581032",
    "🛠": "5988023995125993550",
    "🟢": "6257824988733117444",
    "🤖": "5372981976804366741",
    "🧩": "5335019808847051236",
    "🧹": "5845947563601041174",
    "🧾": "5334882760735598374",
    "🪙": "5379600444098093058",
}

EMOJI_ID_MAPPING = dict(STYLED_SCAN_EMOJI_IDS)
EMOJI_MAPPING = {
    emoji: f'<tg-emoji emoji-id="{emoji_id}">{emoji}</tg-emoji>'
    for emoji, emoji_id in STYLED_SCAN_EMOJI_IDS.items()
}
BASE_EMOJI_ID_MAPPING = dict(STYLED_SCAN_EMOJI_IDS)
CUSTOM_EMOJI_OVERRIDES = {}
CUSTOM_EMOJI_SETTING_KEY = "custom_emoji_overrides"

def _is_valid_custom_emoji_id(value: str) -> bool:
    return bool(value and value.strip().isdigit() and len(value.strip()) >= 10)

def _rebuild_emoji_mappings():
    global EMOJI_ID_MAPPING, EMOJI_MAPPING
    merged = dict(BASE_EMOJI_ID_MAPPING)
    merged.update({
        emoji: emoji_id
        for emoji, emoji_id in CUSTOM_EMOJI_OVERRIDES.items()
        if emoji and _is_valid_custom_emoji_id(str(emoji_id))
    })
    EMOJI_ID_MAPPING = merged
    EMOJI_MAPPING = {
        emoji: f'<tg-emoji emoji-id="{emoji_id}">{emoji}</tg-emoji>'
        for emoji, emoji_id in merged.items()
    }

def get_custom_emoji_overrides() -> dict[str, str]:
    return dict(CUSTOM_EMOJI_OVERRIDES)

def get_effective_emoji_id(emoji: str) -> str | None:
    return EMOJI_ID_MAPPING.get(emoji)

def set_custom_emoji_overrides(overrides: dict[str, str]):
    global CUSTOM_EMOJI_OVERRIDES
    CUSTOM_EMOJI_OVERRIDES = {
        str(emoji): str(emoji_id).strip()
        for emoji, emoji_id in overrides.items()
        if emoji and _is_valid_custom_emoji_id(str(emoji_id))
    }
    _rebuild_emoji_mappings()

def set_custom_emoji_override(emoji: str, emoji_id: str):
    if not emoji:
        return
    if _is_valid_custom_emoji_id(emoji_id):
        CUSTOM_EMOJI_OVERRIDES[emoji] = emoji_id.strip()
    else:
        CUSTOM_EMOJI_OVERRIDES.pop(emoji, None)
    _rebuild_emoji_mappings()

async def load_custom_emoji_overrides_from_db(session):
    from database.crud import get_setting
    raw = await get_setting(session, CUSTOM_EMOJI_SETTING_KEY, "{}")
    try:
        overrides = json.loads(raw)
    except Exception:
        overrides = {}
    if not isinstance(overrides, dict):
        overrides = {}
    set_custom_emoji_overrides(overrides)

def p_em(text: str) -> str:
    """
    Replaces standard emojis with their custom Telegram Premium tg-emoji tag versions.
    Safe for HTML format.
    """
    if not text:
        return text
    
    # Matches any existing <tg-emoji> tag (group 1) or target emojis (group 2)
    pattern = re.compile(
        r'(<tg-emoji[^>]*>.*?</tg-emoji>)|(' + 
        '|'.join(re.escape(k) for k in EMOJI_MAPPING.keys()) + 
        r')'
    )
    
    def replacer(match):
        if match.group(1):
            return match.group(1)
        emoji = match.group(2)
        return EMOJI_MAPPING.get(emoji, emoji)
        
    return pattern.sub(replacer, text)


def patch_button_class(cls):
    """
    Monkeypatches InlineKeyboardButton and KeyboardButton initialization.
    Assigns icon_custom_emoji_id based on standard emojis present in the text,
    and strips the standard emoji from the text (leaving a space if empty)
    to prevent displaying both the standard and custom emoji.
    """
    original_init = cls.__init__
    
    def patched_init(self, *args, **kwargs):
        text = kwargs.get("text", "")
        if text:
            for emoji_char, emoji_id in sorted(EMOJI_ID_MAPPING.items(), key=lambda x: len(x[0]), reverse=True):
                if text.startswith(emoji_char):
                    stripped = text[len(emoji_char):].strip()
                    kwargs["text"] = stripped or " "
                    kwargs["icon_custom_emoji_id"] = emoji_id
                    break
                elif text.endswith(emoji_char):
                    stripped = text[:-len(emoji_char)].strip()
                    kwargs["text"] = stripped or " "
                    kwargs["icon_custom_emoji_id"] = emoji_id
                    break
        original_init(self, *args, **kwargs)
        
    cls.__init__ = patched_init

# Dynamically patch button initialization to automatically inject custom emojis for Telegram Bot API 10
patch_button_class(InlineKeyboardButton)
patch_button_class(KeyboardButton)
