"""
✘ Get a Shareable Link for any file.

✘ **CMD**
>>  `{i}share`  <reply to media>
>>  `{i}share -fl` - to send files with forward lock.
"""

from asyncio import gather
from base64 import b64decode, b64encode
from random import choice
from string import ascii_lowercase, digits

from . import asst, make_mention, ultroid_cmd, asst_cmd, udB, LOG_CHANNEL


def _commit_to_db(data):
    key = "CUSTOM_FILESHARE_DB"  # don't change
    n = udB.get_key(key)
    x = n | data if n else data
    udB.set_key(key, x)


def ids_handler(msg_id, fwd_lock=False):
    chars = tuple(ascii_lowercase + digits)
    random_str = "lock" if fwd_lock else ""
    random_str += "".join(choice(chars) for _ in range(14))
    _commit_to_db({random_str: msg_id})
    return "fileshare_" + b64encode(random_str.encode()).decode()


@ultroid_cmd(pattern="share( -fl|)$")
async def custom_fileshare(e):
    reply = await e.get_reply_message()
    eris = await e.eor("...")
    if not reply:
        return await eris.edit("`Reply to any Message, to get its Shareable Link..`")
    media = await reply.forward_to(LOG_CHANNEL)
    pattern = ids_handler(media.id, "-fl" in e.pattern_match.group(1))
    link = f"https://t.me/{asst.me.username}?start={pattern}"
    out = f"**__Shareable Link for this File.__ \n>>** __{link}__"
    log_msg = f"**Do NOT Delete this File.. \n\nFileShare Link: {link}**"
    await gather(eris.edit(out), media.reply(log_msg))


@asst_cmd(pattern=r"start fileshare_(.+)")
async def asst_fileshare(e):
    args = e.pattern_match.group(1)
    db = udB.get_key("CUSTOM_FILESHARE_DB")
    if not db:
        return
    try:
        inpt = b64decode(args).decode()
    except:
        return
    if not db.get(inpt):
        return await e.eor("Nothing to see Here.. 🍥")
    try:
        msg = await asst.get_messages(LOG_CHANNEL, ids=db.get(inpt))
    except Exception:
        await e.eor("**FILE DOESN'T EXISTS**")
    else:
        log_msg = f"#FileShareLogs \n\n• {make_mention(e.sender)} Opened [This File]({msg.message_link})."
        await gather(
            e.reply(msg, noforwards=inpt.startswith("lock")),
            asst.send_message(LOG_CHANNEL, log_msg),
        )
