# This Python file uses the following encoding: utf-8
# trunk-ignore-all(bandit/B311)
# pylint: disable=line-too-long
# pylint: disable=too-many-lines
"""
Module of a python bot named Conjurer - used to work on BDSM discord servers.
"""
import logging

# *=========================================== Standard Library Imports
import random
import threading
from logging import handlers

# *==============Imported libraries
import discord
from discord.ext import commands

from communication_subroutine import comm_subroutine
from constants import ENCODING, LOGFILE, TOKEN

# *=========================================== Initializations
intents = discord.Intents.default()
intents.message_content = True
intents.typing = True
intents.presences = True
intents.members = True
intents.messages = True
intents.voice_states = True
intents.moderation = True

# on_member_ban - wyswietl na glownym kanale pieczatke "Niech spierdala"
# on_member_unban - "mam wyjebane"

logger = logging.getLogger("discord")
logger.setLevel(logging.DEBUG)
handler = handlers.RotatingFileHandler(
    filename=LOGFILE,
    encoding=ENCODING,
    mode="a",
    maxBytes=6 * 1024 * 1024,
    backupCount=6,
)
formatter = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s")
handler.setFormatter(formatter)
logger.addHandler(handler)
random.seed()
client = commands.Bot(intents=intents, command_prefix="$")


# *=========================================== Define Events
@client.event
async def on_ready():
    """Metoda wywoływana przy połączeniu do serwera."""
    logger.debug("%s has connected to Discord!", client.user)
    # TODO: load vs reload
    await client.load_extension("administration_commands")

    await client.load_extension("librarian_commands")
    await client.load_extension("music_commands")
    await client.load_extension("radio_commands")

    await client.load_extension("ai_commands")

    await client.load_extension("other_commands")
    await client.load_extension("voice_recognition_commands")

    logger.info(client.cogs)
    await client.tree.sync()
    for com in client.commands:
        logger.info("Command %s is awejleble", com.qualified_name)
    logger.info("Logged in as ---->", client.user)
    logger.info("ID:", client.user.id)


# TODO: ADMINISTRATION


# *================================== Run
if __name__ == "__main__":
    logger.info("Starting discord bot")
    threads = []
    logger.info("Starting discord bot: Creating threads")
    threads.append(threading.Thread(target=client.run, args=(TOKEN,)))
    threads.append(threading.Thread(target=comm_subroutine))
    logger.info("Starting discord bot: Starting threads")
    WRK_CNT = 0
    for worker in threads:
        WRK_CNT += 1
        logger.info("Starting discord bot: Starting thread %s", WRK_CNT)
        worker.start()
    logger.info("Starting discord bot: Joining threads")
    WRK_CNT = 0
    for worker in threads:
        WRK_CNT += 1
        logger.info("Starting discord bot: Joining thread %s", WRK_CNT)
        worker.join()
