import requests
import xmpp
from xmpp import cli
import config
from BotClass import JabberBot
import json
#раскомментировать, когда перейдем на разные пароли
import hashlib
from datetime import datetime, timedelta

import time
import threading

#test
import jsonAndRequest as jsreq

global tasklist

botname="open_student_handler"

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

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

print(JID, PASSWORD)

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

#тут хранится список jid, кому бот может отправлять сообщения в результате обработки заявки
proceed_to=[botname, "open_st_request_assigned@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:
            ticketObj = jsreq.jsonToTicket(text)
            print (ticketObj)
            tasklist.append(ticketObj)
            bot.bot_log(str(datetime.now())+" Поступивший Тикет успешно добавлен в очередь обработки\n")

def open_student_handler_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_student_handler_process(localtask):
    bot.bot_log(botname + " " + str(datetime.now()) + " " + "Тикет в обработчике\n")

    ticket = jsreq.jsonToTicket(localtask)
    
    if ticket.status == "Accepted":
        all_systems_registered = True
        
        if all_systems_registered:
            user = ticket.created_by
            if register_user_in_group():
                send_successful_registration_notification(ticket)
            else:
                all_systems_registered = False
                continue
        
        # Проверяем, прошла ли неделя с момента создания заявки
        if datetime.now() - ticket.created_at >= timedelta(weeks=1):
            # Если неделя прошла и не все галочки стоят, отправляем уведомление о частичной регистрации
            if not all_systems_registered:
                send_partial_registration_notification(ticket)
            # Закрываем заявку
            close_ticket(ticket)
        
        # Если все галочки стоят, отправляем уведомление об успешной регистрации во всех системах
        if all_systems_registered():
            send_all_systems_success_notification(ticket)

    elif ticket.status == "Declined":
        # Отправляем уведомление о том, что заявка отклонена
        send_declined_notification(ticket):
        # Удаляем запись в таблице Practice
        remove_from_practice(ticket):
            
        # Заявка уходит в архив через неделю
        if datetime.now() - ticket.created_at >= timedelta(weeks=1):
            archive_ticket(ticket)

    print(ticket)

def register_user_in_group(user_id):
    url = config.url+f"api/v1/platform/sharix-users/{user_id}/"
    
    payload = {
        "groups": [101]
    }
    
    headers = {
        "Content-Type": "application/json",
    }
    
    try:
        response = requests.put(url, data=json.dumps(payload), headers=headers)
        
        if response.status_code == 200:
            print("Группа успешно добавлена пользователю.")
            return True
        else:
            print(f"Ошибка: {response.status_code} - {response.text}")
            return False
    
    except requests.exceptions.RequestException as e:
        print(f"Ошибка запроса: {e}")
        return False


def send_all_systems_success_notification(ticket):
    
def send_successful_registration_notification(ticket):

def send_partial_registration_notification(ticket):
    
def send_declined_notification(ticket):
    
    
def close_ticket(ticket):

def archive_ticket(ticket):
    
def remove_from_practice(ticket):
    url = config.url+f"/{ticket.id}/"
    
    headers = {
        "Content-Type": "application/json",
    }
    
    try:
        response = requests.delete(url, headers=headers)
        
        if response.status_code == 204:
            print(f"Тикет с ID {ticket.id} успешно удалён.")
        else:
            print(f"Ошибка: {response.status_code} - {response.text}")
    
    except requests.exceptions.RequestException as e:
        print(f"Ошибка запроса: {e}")


def open_student_handler_assigned(localtask):
    bot.proceed_status(proceed_to[1],localtask)


def open_student_handler_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=oopen_student_handler_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/ticket_list/1303")

bot = JabberBot(JID, PASSWORD, PORT)

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



