import os

from zenpy import Zenpy
from zenpy.lib.api_objects import User as ZenpyUser

from access_controller.settings import ACTRL_ZENDESK_SUBDOMAIN, ACTRL_API_EMAIL, ACTRL_API_TOKEN, ACTRL_API_PASSWORD


def api_auth() -> dict:
    """
    Функция создания пользователя с использованием Zendesk API.

    Получает из env Zendesk - email, token, password пользователя.
    Если данные валидны и пользователь Zendesk с указанным email и токеном или паролем существует,
    создается словарь данных пользователя, полученных через API c Zendesk.

    :return: данные пользователя
    """
    credentials = {
        'subdomain': ACTRL_ZENDESK_SUBDOMAIN
    }
    email = ACTRL_API_EMAIL
    token = ACTRL_API_TOKEN
    password = ACTRL_API_PASSWORD

    if email is None:
        raise ValueError('access_controller email not in env')
    credentials['email'] = email

    # prefer token, use password if token not provided
    if token:
        credentials['token'] = token
    elif password:
        credentials['password'] = password
    else:
        raise ValueError('access_controller token or password not in env')

    zenpy_client = Zenpy(**credentials)
    zenpy_user: ZenpyUser = zenpy_client.users.search(email).values[0]

    user = {
        'id': zenpy_user.id,
        'name': zenpy_user.name,  # Zendesk doesn't have separate first and last name fields
        'email': zenpy_user.email,
        'role': zenpy_user.role,  # str like 'admin' or 'agent', not id
        'photo': zenpy_user.photo['content_url'] if zenpy_user.photo is not None else None,
    }

    return user
