"""
integral_lib.CogsPrepare
~~~~~~~~~~~~~
Loads, unloads Cogs files
cog_list: return list of cog filenames
work_with_cogs: loads, reloads and unloads cogs files

"""
from os import listdir, rename
from typing import List

from disnake.ext.commands.interaction_bot_base import InteractionBotBase

from .Logger import logger


def cog_list(fold: str = './cogs') -> List[str]:
    """
    A function that generates a list of cog names based on the files present in a specified folder.

    Parameters:
    - fold (str): The directory path where the cog files are located. Defaults to './cogs'.

    Returns:
    - List[str]: A list of cog names without the '.py' extension.
    """
    cogs_list = []
    for _filename in listdir(fold):
        if _filename.endswith('.py'):
            cogs_list.append(_filename[:-3])
    return cogs_list


def work_with_cogs(what_do: str,
                   bot: InteractionBotBase,
                   cog: str | list):
    """
    Perform the specified action on the given cog or list of cogs.
    Args:
        what_do (str): The action to perform (load, unload, reload, disable, enable).
        src (InteractionBotBase): The src instance to work with.
        cog (str | list): The name of the cog or a list of cogs to work with.
    Raises:
        ValueError: If the action is not recognized.
    Returns:
        None
        --------
        :param cog: str | list
        :param bot: InteractionBotBase
        :param what_do: str = ['load', 'unload', 'reload', 'disable', 'enable']
    """

    if isinstance(cog, str):
        cog = cog.split()
    for _filename in cog:
        if _filename.endswith('.py'):
            _filename = _filename.split('.')[0]
        if what_do == "load":
            bot.load_extension(f'cogs.{_filename}')
            logger.info(f'Cog {_filename} loaded')
        elif what_do == 'unload':
            bot.unload_extension(f'cogs.{_filename}')
            logger.info(f'Cog {_filename} unloaded')
        elif what_do == 'reload':
            bot.reload_extension(f'cogs.{_filename}')
            logger.info(f'Cog {_filename} reloaded')
        elif what_do == 'disable':
            bot.unload_extension(f'cogs.{_filename}')
            rename(f'cogs/{_filename}.py',
                   f'cogs/disabled/{_filename}.py')
            logger.info(f'Cog {_filename} stopped and disabled')
        elif what_do == 'enable':
            rename(f'cogs/disabled/{_filename}.py',
                   f'cogs/{_filename}.py')
            bot.load_extension(f'cogs.{_filename}')
            logger.info(f'Cog {_filename} started and enabled')
        else:
            raise ValueError(f"Unrecognized action: {what_do}")
