# < Source - t.me/testingpluginnn >
# < https://github.com/TeamUltroid/Ultroid >
#
# Thanks to @sipAK_OP for the API.

"""
✘ **Download Songs from Deezer!**

>  `{i}deezer <query>`
>  `{i}deezer -f <query>`  *for FLAC
"""

import os
import requests
from random import random_string

from json.decoder import JSONDecodeError
from urllib.request import urlretrieve
from urllib.parse import quote_plus as quote

from telethon.tl.types import DocumentAttributeAudio

from . import *


API = "https://jostapi.herokuapp.com/{0}deezer?query={1}&quality={2}"


def song_downloader(md, song, quality):
    link = md.get("raw_link")
    url = link if link else API.format("up", song, quality)
    fn = unquote(os.path.basename(link)) if link else f"{md.get('title')}.{quality}"
    return urlretrieve(link, fn)[0]


def get_attributes(path, md):
    metadata = [
        DocumentAttributeAudio(
            duration=md.get("duration") or 200,
            title=md.get("title") or "deezer",
            performer=md.get("artist").get("name") or "Unknown",
        )
    ]
    thumb = urlretrieve(md.get("album").get("cover_xl"), random_string(8) + ".jpg")
    return metadata, thumb[0]


@ultroid_cmd(pattern="deezer(?: (-f)?|$)(.*)")
async def siesace(e):
    song = e.pattern_match.group(2)
    if not song:
        reply = await e.get_reply_message()
        if reply and reply.text:
            song = reply.message
        else:
            return await e.eor("`Give me Something to Search.`", time=10)

    quality = "flac" if bool(e.pattern_match.group(1)) else "mp3"
    lol = await e.eor("`Searching on Deezer ...`")
    try:
        k = requests.get(API.format("", quote(song), quality)).json()[0]
    except (IndexError, TypeError):
        return await lol.edit(f"`No results for {song} on deezer.`")
    except JSONDecodeError:
        return await lol.edit("Bad Response from API, quitting!")

    dlx = song_downloader(k, quote(song), quality)
    await lol.edit("`Now uploading ...`")
    size = humanbytes(os.path.getsize(dlx))
    attr, thumb = get_attributes(dlx, k)
    upp, _ = await e.client.fast_uploader(dlx, to_delete=True)
    cap = f"<b>> <a href='{k.get('link')}'>{dlx} – {size}</a></b>"

    try:
        await e.client.send_file(
            e.chat_id,
            upp,
            caption=cap,
            attributes=attr,
            supports_streaming=True,
            thumb=thumb,
            parse_mode="html",
            silent=True,
            reply_to=e.reply_to_msg_id,
        )
        os.remove(thumb)
        await lol.delete()
    except Exception as ex:
        return await lol.edit(f"#ERROR – `{ex}`")
