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

import requests

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

global tasklist

botname = "open_service_request_booked"

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

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

print(JID, PASSWORD)

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

# тут хранится список jid, кому бот может отправлять сообщения в результате обработки заявки
proceed_to = ["open_service_request_assigned@ej.sharix-app.org", "open_service_request_pending@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(text)
    print(user)
    print(f'This is text{text} and this is\n\n{user}')
    # print (str(user).split("/")[0])
    # print('good')
    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_booked_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_booked_process(localtask):
    bot.bot_log(botname + " " + str(datetime.now()) + " " + "Заказ в обработчике\n")

    order = jsreq.jsonToOrder(localtask)
    # Пока заглушка
    balance = get_balance(order.client)

    price = order.real_price

    if balance > price:
        # Заказ на основного водителя?
        if order.provider:
            bot.proceed_status(proceed_to[1], localtask)
            bot.bot_log(botname + " " + str(datetime.now()) + " " + "Заказ успешно обработан\n")
        else:
            # Проверка срочности заказа
            if order.asap:
                # Заглушка назначение исполнителя системой
                if set_provider(order.ticket, order.provider) == "success":
                    bot.proceed_status(proceed_to[0], localtask)
                else:
                    bot.bot_log(botname + " " + str(datetime.now()) + " " + "Ошибка назначения исполнителя\n")
            else:
                bot.proceed_status(proceed_to[1], localtask)

            bot.bot_log(botname + " " + str(datetime.now()) + " " + "Заказ успешно обработан\n")
    else:
        # Заглушка получения оплаты от клиента
        pass


def get_balance(client):
    headers = {'Authorization': f'Token {token}'}
    # Передаем id пользователя и получаем его баланс
    response = requests.get(config.API_URL + f"/api/example/{client}", headers=headers)
    print(response.json())
    ordertext = response.json()

    if not ordertext:
        print("Empty array")
    else:
        print(ordertext[0], "PROCESSING")
        try:
            balance = ordertext[0].get('balance')
            return balance
        except Exception as ex:
            print(ex)


def set_provider(ticket, provider):
    headers = {'Authorization': f'Token {token}'}
    data = {'ticket': ticket,
            'provider': provider}
    response = requests.post(config.API_URL + f"/api/example/set-provider", headers=headers, data=data)
    print(response.json())
    ordertext = response.json()

    if not ordertext:
        print("Empty array")
    else:
        print(ordertext[0], "PROCESSING")
        try:
            message = ordertext[0].get('message')
            return message
        except Exception as ex:
            print(ex)


def open_service_request_booked():
    # 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

    t1 = threading.Thread(target=open_service_request_booked_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 + "/base/auth/token/login/")
# ВАЖНО! Надо еще фильтровать список по статусу обработки заявки
tasklist = jsreq.requestGetList(token, config.API_URL + "/webservice/api/webservice/")

print(len(tasklist))

bot = JabberBot(JID, PASSWORD, PORT)

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