"""
Professionaly OAuth 2.0 support.

This contribution adds support for professionaly.ru OAuth 2.0.
Username is retrieved from the identity returned by server.
"""

from time import time

from ..utils import parse_qs
from .oauth import BaseOAuth2


class ProfessionaliOAuth2(BaseOAuth2):
    name = "professionali"
    ID_KEY = "user_id"
    AUTHORIZATION_URL = "https://api.professionali.ru/oauth/authorize.html"
    ACCESS_TOKEN_URL = "https://api.professionali.ru/oauth/getToken.json"
    ACCESS_TOKEN_METHOD = "POST"
    EXTRA_DATA = [("avatar_big", "avatar_big"), ("link", "link")]

    def get_user_details(self, response):
        first_name, last_name = map(response.get, ("firstname", "lastname"))
        email = ""
        if self.setting("FAKE_EMAIL"):
            email = f"{time()}@professionali.ru"
        return {
            "username": f"{last_name}_{first_name}",
            "first_name": first_name,
            "last_name": last_name,
            "email": email,
        }

    def user_data(self, access_token, response, *args, **kwargs):
        url = "https://api.professionali.ru/v6/users/get.json"
        fields = list(
            set(
                ["firstname", "lastname", "avatar_big", "link"]
                + self.setting("EXTRA_DATA", [])
            )
        )
        params = {
            "fields": ",".join(fields),
            "access_token": access_token,
            "ids[]": response["user_id"],
        }
        try:
            return self.get_json(url, params)[0]
        except (TypeError, KeyError, OSError, ValueError, IndexError):
            return None

    def get_json(self, url, *args, **kwargs):
        return self.request(url, verify=False, *args, **kwargs).json()

    def get_querystring(self, url, *args, **kwargs):
        return parse_qs(self.request(url, verify=False, *args, **kwargs).text)
