import logging
from os import getpid
from time import time

import pyrogram
from libbot import config_get
from pyrogram.client import Client
from pyrogram.errors import BadRequest
from pyrogram.raw.all import layer
from pyrogram.types import BotCommand, BotCommandScopeChat
from ujson import loads

logger = logging.getLogger(__name__)


class PyroClient(Client):
    def __init__(self):
        with open("config.json", "r", encoding="utf-8") as f:
            config = loads(f.read())
        super().__init__(
            name="bwtbot",
            api_id=config["bot"]["api_id"],
            api_hash=config["bot"]["api_hash"],
            bot_token=config["bot"]["bot_token"],
            workers=config["bot"]["workers"],
            plugins=dict(root="plugins", exclude=config["disabled_plugins"]),
            sleep_threshold=120,
        )

    async def start(self):
        await super().start()

        self.start_time = time()

        logger.info(
            "Bot is running with Pyrogram v%s (Layer %s) and has started as @%s on PID %s.",
            pyrogram.__version__,
            layer,
            self.me.username,
            getpid(),
        )

        try:
            await self.send_message(
                chat_id=await config_get("chat_id", "reports"),
                text=f"Bot started PID `{getpid()}`",
            )
        except BadRequest:
            logger.warning("Unable to send message to report chat.")

        await self.set_bot_commands(
            [
                BotCommand("help", "Меню допомоги"),
                BotCommand("balance", "Баланс картки"),
                BotCommand("topup", "Поповнити картку"),
                BotCommand("setcard", "Прив'язати картку"),
                BotCommand("resetcard", "Відв'язати картку"),
            ],
            language_code="uk",
        )

        await self.set_bot_commands(
            [
                BotCommand("help", "Меню допомоги"),
                BotCommand("balance", "Баланс картки"),
                BotCommand("topup", "Поповнити картку"),
                BotCommand("setcard", "Прив'язати картку"),
                BotCommand("resetcard", "Відв'язати картку"),
            ],
            language_code="ru",
        )

        await self.set_bot_commands(
            [
                BotCommand("help", "Help menu"),
                BotCommand("balance", "Card's balance"),
                BotCommand("topup", "Refill card"),
                BotCommand("setcard", "Link card"),
                BotCommand("resetcard", "Unlink card"),
            ]
        )

        await self.set_bot_commands(
            [
                BotCommand("help", "Help menu"),
                BotCommand("balance", "Card's balance"),
                BotCommand("topup", "Refill card"),
                BotCommand("setcard", "Link card"),
                BotCommand("resetcard", "Unlink card"),
                BotCommand("shutdown", "Turn off the bot"),
            ],
            scope=BotCommandScopeChat(chat_id=await config_get("owner_id")),
        )

    async def stop(self):
        try:
            await self.send_message(
                chat_id=await config_get("chat_id", "reports"),
                text=f"Bot stopped with PID `{getpid()}`",
            )
        except BadRequest:
            logger.warning("Unable to send message to report chat.")
        await super().stop()
        logger.warning(f"Bot stopped with PID {getpid()}.")
