import requests
import json
import argparse
import binascii

from pyotp import TOTP
from os.path import join as join_path
from uncloud.common.shared import shared


def get_otp_parser():
    otp_parser = argparse.ArgumentParser('otp')
    otp_parser.add_argument('--name')
    otp_parser.add_argument('--realm')
    otp_parser.add_argument('--seed', type=get_token, dest='token', metavar='SEED')

    return otp_parser


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):
    try:
        r = request_method(join_path(shared.settings['client']['api_server'], *args), json=data)
    except requests.exceptions.RequestException:
        print('Error occurred while connecting to API server.')
    else:
        try:
            print(load_dump_pretty(r.content))
        except Exception:
            print('Error occurred while getting output from api server.')


def get_token(seed):
    if seed is not None:
        try:
            token = TOTP(seed).now()
        except binascii.Error:
            raise argparse.ArgumentTypeError('Invalid seed')
        else:
            return token
