# раскомментировать, когда перейдем на разные пароли
import hashlib
import threading
import time
from datetime import datetime

import config
# test
import jsonAndRequest as jsreq
from BotClass import JabberBot

global tasklist

botname = "open_service_request_prestart"

operating_status = 222
JID = botname + "@" + config.JSERVER
PORT = config.PORT

PASSWORD = hashlib.md5((botname + config.PASSWORD).encode('utf-8')).hexdigest()

print(JID, PASSWORD)

# таким образом хранится список jid, от которых можно получать сообщения этому боту
listen_to = ["test@ej.sharix-app.org", "open_template_bot@ej.sharix-app.org"]

# тут хранится список jid, кому бот может отправлять сообщения в результате обработки заявки
proceed_to = [botname, "open_service_request_preforcemajeure@ej.sharix-app.org",
              "open_service_request_forcemajeure@ej.sharix-app.org"]

# максимальное значение попыток обработать заказ
idle_value = 10


# обработчик входящих сообщений
def message_handler(conn, mess):
    text = mess.getBody()  # текст сообщения боту
    user = mess.getFrom()  # отправитель сообщения

    print(str(user).split("/")[0])
    if (str(user).split("/")[0]) in listen_to:
        print(text)
        print(mess)

        if text is not None:
            orderObj = jsreq.jsonToOrderTicket(text)
            print(orderObj)
            tasklist.append(orderObj)
            bot.bot_log(str(datetime.now()) + " Поступивший заказ успешно добавлен в очередь обработки\n")


def open_service_request_prestart_wait(period, localtask):
    bot.bot_log(botname + " " + str(datetime.now()) + " " + "Заказ ожидает\n")
    time.sleep(period)

    # ВАЖНО! Надо скорее всего через API редактировать заказ, иначе возможна потеря данных
    localtask.title = localtask.title + "1"

    # обязательно данный обработчик должен заканчиваться передачей заказа куда-то на обработку дальше - обратно или другому, иначе оно потеряется
    bot.proceed_status(proceed_to[0], localtask)
    bot.bot_log(botname + " " + str(datetime.now()) + " " + "Заказ подождал и отправлен в очередь\n")


def open_service_request_prestart_process(localtask):
    bot.bot_log(botname + " " + str(datetime.now()) + " " + "Заказ в обработчике\n")

    order = jsreq.jsonToOrder(localtask)

    if order.asap:
        bot.proceed_status(proceed_to[1], localtask)
        bot.bot_log(botname + " " + str(datetime.now()) + " " + "Заказ отправлен\n")
    else:
        bot.proceed_status(proceed_to[0], localtask)
        bot.bot_log(botname + " " + str(datetime.now()) + " " + "Заказ отправлен\n")


def open_service_request_prestart():
    while (len(tasklist)):
        localtask = tasklist.pop(0)
        bot.bot_log(botname + " " + datetime.now().strftime('%Y-%m-%d') + " " + "Заказ в очереди на обработке\n")
        print("EACH TASKLIST", tasklist)

        if (localtask.status != operating_status):
            bot.proceed_status(proceed_to[-1], localtask)
            bot.bot_log(botname + " " + str(datetime.now()) + " " + "Заказ не по адресу, перенаправляем на форсмажор\n")
            continue

        # if (localtask.title!="10"):
        #     t1=threading.Thread(target=open_service_request_booked_wait, args=(5,localtask))
        #     t1.start()

        # if (localtask.title=="101"):
        #     t1=threading.Thread(target=open_service_request_booked_process, args=(10,localtask))
        #     t1.start()

        t1 = threading.Thread(target=open_service_request_prestart_process, args=(localtask))
        t1.start()

        # если никакие обработчики не подошли - отправляем обратно в очередь
        bot.proceed_status(proceed_to[0], localtask)
        print("Заказ возвращен в очередь\n")
        print(tasklist)


# Авторизация и запуск бота

# пустой список заказов
tasklist = []

# надо инициализировать tasklist при запуске из API
token = jsreq.requestGetToken(botname, PASSWORD, config.API_URL + "/auth/token/login/")

# ВАЖНО! Надо еще фильтровать список по статусу обработки заявки
tasklist = jsreq.requestGetList(token, config.API_URL + "/tickets/api/tickets/?list_id=10")
print(len(tasklist))

bot = JabberBot(JID, PASSWORD, PORT)

bot.register_handler('message', message_handler)
bot.start(open_service_request_prestart)
