#!/usr/bin/env python
import argparse
import asyncio
import base64
import binascii
import logging

from otp import otp, TOKENS


def parse_secret(secret):
    try:
        return base64.b32decode(secret)
    except binascii.Error:
        parser.error(f"{secret} is not a valid secret")


def version():
    pkg_vars = {}
    with open("otp/_version.py") as fp:
        exec(fp.read(), pkg_vars)
    return pkg_vars['__version__']


parser = argparse.ArgumentParser()

parser.add_argument('-c', '--copy', action='store_true', help='copy code to clipboard')
parser.add_argument('-a', '--account', action='store', type=str, choices=TOKENS.keys(), help='select account')
parser.add_argument('-d', '--debug', action='store_const', const=logging.DEBUG, dest='loglevel',
                    default=logging.INFO, help='verbose output')
parser.add_argument('-v', '--version', action='version', version=f'%(prog)s {version()}')

subparsers = parser.add_subparsers(dest='command')
subparsers.required = False

subparsers.add_parser('ls')
add_parser = subparsers.add_parser('add')
add_parser.add_argument('-i', '--issuer', action='store', required=True, help='account provider')
add_parser.add_argument('-s', '--secret', action='store', type=parse_secret, required=True, help='base32 encoded secret key')
add_parser.add_argument('-u', '--user', action='store', help='user identifier')
add_parser.add_argument('-d', '--digits', action='store', type=int,  choices=(6, 7, 8), help='length of passcode')
add_parser.add_argument('-a', '--algo', action='store', choices=(['SHA1']), help='algorithm')
add_parser.add_argument('-p', '--period', action='store', help='period passcode valid for, in seconds')

rm_parser = subparsers.add_parser('rm')
rm_parser.add_argument('-a', '--account', action='store', required=True, type=int, choices=TOKENS.keys(), help='select account to remove')

args = parser.parse_args()

if args.copy and args.account is None:
    parser.error("--copy requires --account")

asyncio.run(otp.run(args))
