import click
from tabulate import tabulate

from mgrctl.settings.platform import PLATFORM_URL


class UserAPI(object):
    def __init__(self, callback_class):
        """Announces required parameters"""
        self.callback_class = callback_class
        self.callback = callback_class()

    def get_users(self, role: str) -> list:
        data = {}
        if role == 'admin':
            data = {"where": "((roles+CP+'%@admin%')+AND+(state+EQ+'active'))"}
        response = self.callback.call_api(
            url='/user',
            method='GET',
            data=data
        )
        users = self._extract_users(users=response)
        return users

    def _extract_users(self, users: dict) -> list:
        return users.get('list', [])

    def _format_users(self, users: list) -> list:
        output = []
        for user in users:
            output.append({
                'id': user.get('id', ''),
                'email': user.get('email', ''),
                'roles': user.get('roles', []),
                'state': user.get('state', ''),
                # add more fields here...
            })
        return output

    def get_first_random_admin(self):
        users = self.get_users(role='admin')
        admin = {}
        for user in users:
            if '@admin' in user.get('roles', []):
                admin = user
                break
        return admin

    def echo_users(self, users: list) -> None:
        output = self._format_users(users)
        click.echo(tabulate(output, headers='keys'))

    def get_access_keys(self, user, count=1):
        keys = []
        while count >= 1:
            count -= 1
            key = self.callback.get_auth_key(user=user)
            check = key.get('key', '')
            if check:
                keys.append(key)
        return keys

    def gen_access_links(self, keys: list) -> list:
        links = []
        for key in keys:
            _id = key.get('id', '')
            link = f"{PLATFORM_URL}/auth/key/{key.get('key', '')}"
            links.append({'id': _id, 'link': link})
        return links

    def echo_access_links(self, links: list) -> None:
        click.echo(tabulate(links, headers='keys'))

    def gen_access_links_interactive(self) -> None:
        users = self.get_users(role='admin')
        self.echo_users(users)
        try:
            click.echo('Choose user id and count of keys')
            _id = int(input('User ID: '))
            count = int(input('Count of keys: '))
            keys = self.get_access_keys(user=_id, count=count)
            links = self.gen_access_links(keys)
            self.echo_access_links(links)
        except ValueError:
            click.echo('Error: Invalid, value is not a valid integer')

    def gen_api_token(self, email=None, password=None):
        token = self.callback.get_auth_token(email, password)
        return token

    def echo_api_token(self, token: dict) -> None:
        click.echo(tabulate([token], headers='keys'))