from uuid import uuid4

from telegram import Update, InlineKeyboardButton, InlineQueryResultArticle, InputTextMessageContent, \
    InlineKeyboardMarkup
from telegram.constants import ParseMode
from telegram.ext import ContextTypes

from config import *
from extensions import humanize_tags_from_json, format_rating


# noinspection PyUnusedLocal
async def inline_query(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None:
    query = update.inline_query.query

    if not query:
        return

    if not query.isdigit():
        return

    response = requests.get(f"http://{app.host}/posts/{query}.json")

    if response.status_code != 200:
        await invalid_query(update, query)
        return

    data = response.json()

    await answer_query(update, query, data)


async def answer_query(update: Update, query: str, data) -> None:
    characters = humanize_tags_from_json(data['tag_string_character'], "no characters")
    copyrights = humanize_tags_from_json(data['tag_string_copyright'], "unknown copyright")
    artists = humanize_tags_from_json(data['tag_string_artist'], "unknown artist")
    rating = format_rating(data['rating'])

    if data['is_banned']:
        results = [
            InlineQueryResultArticle(
                id=str(uuid4()),
                title=f"ID: {query}",
                description=f"{characters} ({copyrights}) drawn by {artists}",
                input_message_content=InputTextMessageContent(
                    f"ID: <code>{query}</code> {rating}\n"
                    f"<s><b>{characters} ({copyrights})</b> drawn by <b>{artists}</b></s>\n"
                    f"This post has been removed because of a takedown request or rule violation.",
                    parse_mode=ParseMode.HTML
                )
            )
        ]

        await update.inline_query.answer(results)
        return

    keyboard = [
        [
            InlineKeyboardButton(f"Open in {app.name}",
                                 url=f"https://{app.hostname}/posts/{query}"),
            InlineKeyboardButton("View original", url=data['file_url'])
        ]
    ]

    results = [
        InlineQueryResultArticle(
            id=str(uuid4()),
            title=f"ID: {query}",
            description=f"{characters} ({copyrights}) drawn by {artists}",
            thumbnail_url=data['preview_file_url'],
            input_message_content=InputTextMessageContent(
                f"ID: <code>{query}</code> {rating}\n"
                f"<a href='{data['large_file_url']}'><b>{characters} ({copyrights})</b> "
                f"drawn by <b>{artists}</b></a>",
                parse_mode=ParseMode.HTML
            ),
            reply_markup=InlineKeyboardMarkup(keyboard)
        )
    ]

    await update.inline_query.answer(results)


async def invalid_query(update: Update, query: str) -> None:
    results = [
        InlineQueryResultArticle(
            id=str(uuid4()),
            title=f"ID: {query}",
            description="Error",
            input_message_content=InputTextMessageContent(
                f"ID: <code>{query}</code>\n"
                f"That record was not found.",
                parse_mode=ParseMode.HTML
            )
        )
    ]

    await update.inline_query.answer(results)