import json
import sys
from datetime import datetime

import xmpp


# Основной класс бота
class JabberBot:
    def __init__(self, jid, password, port):
        self.jidd = jid
        jid = xmpp.JID(jid)
        self.user, self.server, self.password, self.port = jid.getNode(), jid.getDomain(), password, port
        self.connect()
        self.auth()
        # TODO: Добавить поля
        #         botname

    # Метод проверки подключения к серверу xmpp
    def connect(self):
        self.conn = xmpp.Client(self.server, self.port, debug=[])
        conn_result = self.conn.connect()
        if not conn_result:
            print("Can't connect to server!\n")
            sys.exit(1)

    # Метод аутентификации
    def auth(self):
        # по идее, тут может быть актуально также передать информацию относительно порта, например
        auth_result = self.conn.auth(self.user, self.password)
        if not auth_result:
            print(self.user, self.password)
            print("Can't to authorize!\n")
            sys.exit(1)

    # Метод для привязки функций к событиям
    def register_handler(self, name, handler):
        self.conn.RegisterHandler(name, handler)

    def step_on(self):
        try:
            self.conn.Process(1)  # с какой частотой происходит подключение к серверу, в данном случае каждую секунду
        except KeyboardInterrupt:
            return 0
        return 1

    # TODO: Рефакторинг логов после добавления полей в JabbrBot
    # def bot_log(self, message):
    #     self.bot_basic_log(self.botname + " " + str(datetime.now()) + " " + "Заказ ожидает пользовательской реакции\n")

    # def bot_basic_log(self, message):
    #     # надо строчку лога сделать более информативной
    #     logfile = open("logs/" + datetime.now().strftime('%Y-%m-%d') + "-" + self.user + ".log", "a")
    #     logfile.write(message)
    #     logfile.close()
    #     print(message)

    def bot_log(self, message):
        # надо строчку лога сделать более информативной
        logfile = open("logs/" + datetime.now().strftime('%Y-%m-%d') + "-" + self.user + ".log", "a")
        logfile.write(message)
        logfile.close()
        print(message)

    def send_notification(self, recipient, message):
        self.conn.send(xmpp.Message(recipient, message))
        self.bot_log("Message sent successfully" + " " + recipient + " " + message)

    # recipient - это конкретный jid следующего обработчика заявки, ticket - json с заявкой.
    def proceed_status(self, recipient, ticket):
        # тут могут быть различные проверки дополнительные, а так вообще эта функция нужна для передачи заявки на обработку следующему
        jsonTicket = json.dumps(ticket.__dict__)
        self.conn.send(xmpp.Message(recipient, jsonTicket))
        self.bot_log("Message sent successfully" + " " + recipient + " " + jsonTicket)

    # сюда можно как параметры передавать переменную для значения Process в вызываемой функции, а также передавать информацию о том, какой из обработчиков ввызывать в бесконечном цикле
    def start(self, handler, *args):
        self.conn.sendInitPresence()  # статус аккаунта бота (активен или нет)
        print("Bot started!")
        while self.step_on():
            # это вызов конкретной функции для обработки статуса конкретным ботом
            # handler(args)
            handler()
            pass

    def stop(self):
        # Disconnect from the Jabber server
        self.client.disconnect()
