import dev.inmo.micro_utils.coroutines.subscribeSafelyWithoutExceptions
import dev.inmo.tgbotapi.extensions.api.answers.answer
import dev.inmo.tgbotapi.extensions.api.bot.getMe
import dev.inmo.tgbotapi.extensions.api.send.reply
import dev.inmo.tgbotapi.extensions.api.telegramBot
import dev.inmo.tgbotapi.extensions.behaviour_builder.buildBehaviourWithLongPolling
import dev.inmo.tgbotapi.extensions.behaviour_builder.triggers_handling.onBaseInlineQuery
import dev.inmo.tgbotapi.extensions.behaviour_builder.triggers_handling.onDeepLink
import dev.inmo.tgbotapi.requests.answers.InlineQueryResultsButton
import dev.inmo.tgbotapi.types.InlineQueries.InlineQueryResult.InlineQueryResultArticle
import dev.inmo.tgbotapi.types.InlineQueries.InputMessageContent.InputTextMessageContent
import dev.inmo.tgbotapi.types.inlineQueryAnswerResultsLimit
import dev.inmo.tgbotapi.utils.buildEntities

/**
 * This bot will send files inside of working directory OR from directory in the second argument.
 * You may send /send_file command to this bot to get random file from the directory OR
 * `/send_file $number` when you want to receive required number of files. For example,
 * /send_file and `/send_file 1` will have the same effect - bot will send one random file.
 * But if you will send `/send_file 5` it will choose 5 random files and send them as group
 */
suspend fun doInlineQueriesBot(token: String) {
    val bot = telegramBot(token)

    bot.buildBehaviourWithLongPolling(
        defaultExceptionsHandler = { it.printStackTrace() },
    ) {
        onBaseInlineQuery {
            val page = it.offset.toIntOrNull() ?: 0
            val results = (0 until inlineQueryAnswerResultsLimit.last).map {
                (page * inlineQueryAnswerResultsLimit.last) + it
            }

            answer(
                it,
                results = results.map { resultNumber ->
                    val resultAsString = resultNumber.toString()
                    InlineQueryResultArticle(
                        resultAsString,
                        "Title $resultNumber",
                        InputTextMessageContent(
                            buildEntities {
                                +"Result text of " + resultNumber.toString() + " result:\n"
                                +it.query
                            }
                        ),
                        description = "Description of $resultNumber result"
                    )
                },
                cachedTime = 0,
                isPersonal = true,
                button = InlineQueryResultsButton.Start(
                    "Text of button with page $page",
                    "deep_link_for_page_$page"
                ),
                nextOffset = (page + 1).toString()
            )
        }

        onDeepLink { (message, deepLink) ->
            reply(message, deepLink)
        }

        allUpdatesFlow.subscribeSafelyWithoutExceptions(this) {
            println(it)
        }

        println(getMe())
    }.join()
}