import json
import binascii
import click
import requests

from os.path import join as join_path

from pyotp import TOTP
from uncloud_cli.config import config, config_file


def load_dump_pretty(content):
    if isinstance(content, bytes):
        content = content.decode("utf-8")
    parsed = json.loads(content)
    return json.dumps(parsed, indent=4, sort_keys=True)


def make_request(*args, data=None, request_method=requests.post):
    r = request_method(
        join_path(config['client']['api_server'], *args), json=data
    )
    print(load_dump_pretty(r.content))


def get_token(ctx, param, value):
    if value is not None:
        try:
            token = TOTP(value).now()
        except binascii.Error:
            raise click.BadParameter('Please enter the correct seed in {}'.format(config_file))
        else:
            param.name = 'token'
            return token


def add_otp_options(f):
    options = [
        click.option(
            "--name", required=True, default=config['client']['name'],
            show_default='name mentioned in {}'.format(config_file)
            ),
        click.option(
            "--realm", required=True, default=config['client']['realm'],
            show_default='realm mentioned in {}'.format(config_file)
            ),
        click.option(
            "--seed", required=True, default=config['client']['seed'],
            callback=get_token, show_default='seed mentioned in {}'.format(config_file)
            )
        ]

    for opt in reversed(options):
        f = opt(f)

    return f


def add_vm_options(f):
    options = [
        click.option('--vm-name', required=True),
        click.option('--action', required=True, default=f.__name__)
    ]
    for opt in reversed(options):
        f = opt(f)

    return f