"""
Обработка тикетов, составление списков тикетов для пользователя и группы пользователей.
"""
from typing import Optional

import requests
from zenpy import TicketApi
from zenpy.lib.api_objects import Ticket

from main.zendesk_admin import zenpy


class TicketListRequester:
    """
    Класс обработки тикетов.

    :param email: Email пользователя
    :type display: :class:`str`
    :param token_or_password: Токен или пароль
    :type display: :class:`str`
    :param prefix: Формат строка url страницы Zendesk
    :type display: :class:`str`
    """
    def __init__(self):
        self.email = zenpy.credentials['email']
        if zenpy.credentials.get('token'):
            self.token_or_password = zenpy.credentials.get('token')
            self.email += '/token'
        else:
            self.token_or_password = zenpy.credentials.get('password')
        self.prefix = f'https://{zenpy.credentials.get("subdomain")}.zendesk.com/api/v2/'

    def get_tickets_list_for_user(self, zendesk_user: zenpy) -> Optional[list]:
        """
        Функция получения списка тикетов пользователя Zendesk.

        :param zendesk_user: Пользователь Zendesk
        :return: Список тикетов, назначенных на данного пользователя в Zendesk
        """
        url = self.prefix + f'users/{zendesk_user.id}/tickets/assigned'
        return self._get_tickets(url)

    def get_tickets_list_for_group(self, group: zenpy) -> Optional[list]:
        """
        Функция получения списка тикетов группы пользователей Zendesk.

        :param group: Название группы
        :return: Список тикетов
        """
        url = self.prefix + '/tickets'
        all_tickets = self._get_tickets(url)
        tickets = list()
        for ticket in all_tickets:
            if (ticket.status != 'solved') and (ticket.group_id == group.id) and (ticket.assignee_id is None):
                tickets.append(ticket)
        return tickets

    def _get_tickets(self, url: str) -> Optional[list]:
        """
        Функция получения полного списка тикетов по url.

        :param url: Url Zendesk c указанием тикетов, назначенных на пользователя
        :return: Список тикетов
        """
        response = requests.get(url, auth=(self.email, self.token_or_password))
        tickets = []
        if response.status_code != 200:
            return None
        for ticket in response.json()['tickets']:
            tickets.append(Ticket(api=TicketApi, **ticket))
        return tickets
