import logging
import sys
import inspect
import socket
import logs.configs.server_log_config
import logs.configs.client_log_config

sys.path.append('../')

# метод определения модуля, источника запуска.
if sys.argv[0].find('client') == -1:
    # если не клиент то сервер!
    LOGGER = logging.getLogger('server')
else:
    # иначе сервер
    LOGGER = logging.getLogger('client')


def log(func_to_log):
    """
    Декоратор, выполняющий логирование вызовов функций.
    Сохраняет события типа debug, содержащие
    информацию о имени вызываемой функиции, параметры с которыми
    вызывается функция, и модуль, вызывающий функцию.
    """

    def log_saver(*args, **kwargs):
        rtrn = func_to_log(*args, **kwargs)
        LOGGER.debug(f'Вызвана функция: {func_to_log.__name__}'
                     f' с параметрами: {args}, {kwargs}. '
                     f'Результат работы функции: {rtrn}. '
                     f'Вызов из функции: {inspect.stack()[1][3]} '
                     , stacklevel=2)
        return rtrn

    return log_saver


# def login_required(func):
#     """
#     Декоратор, проверяющий, что клиент авторизован на сервере.
#     Проверяет, что передаваемый объект сокета находится в
#     списке авторизованных клиентов.
#     За исключением передачи словаря-запроса
#     на авторизацию. Если клиент не авторизован,
#     генерирует исключение TypeError
#     """
#
#     def checker(*args, **kwargs):
#         # проверяем, что первый аргумент - экземпляр MessageProcessor
#         # Импортить необходимо тут, иначе ошибка рекурсивного импорта.
#         from server_pack.core import MessageProcessor
#         from common.variables import ACTION, PRESENCE
#         if isinstance(args[0], MessageProcessor):
#             found = False
#             for arg in args:
#                 if isinstance(arg, socket.socket):
#                     # Проверяем, что данный сокет есть в списке names класса
#                     # MessageProcessor
#                     for client in args[0].names:
#                         if args[0].names[client] == arg:
#                             found = True
#
#             # Теперь надо проверить, что передаваемые аргументы не presence
#             # сообщение. Если presense, то разрешаем
#             for arg in args:
#                 if isinstance(arg, dict):
#                     if ACTION in arg and arg[ACTION] == PRESENCE:
#                         found = True
#             # Если не не авторизован и не сообщение начала авторизации, то
#             # вызываем исключение.
#             if not found:
#                 raise TypeError
#         return func(*args, **kwargs)
#
#     return checker
