import pyotp
import json
import urllib.request
import urllib.error

class UngleichOTPClient(object):
    token_name = 'token'
    name_name = 'name'
    realm_name = 'realm'

    def __init__(self, name, realm, seed, serverurl):
        self.name = name
        self.realm = realm
        self.seed = seed
        self.serverurl = serverurl

    def verify(self, name, realm, token):
        to_send = {}

        # Client credentials to be verified
        to_send['verifyname']  = name
        to_send['verifyrealm'] = realm
        to_send['verifytoken'] = token

        # Our credentials
        to_send['token'] = pyotp.TOTP(self.seed).now()
        to_send['name']  = self.name
        to_send['realm'] = self.realm

        data = json.dumps(to_send).encode("utf-8")

        req = urllib.request.Request(url=self.serverurl,
                                     data=data,
                                     headers={'Content-Type': 'application/json'},
                                     method='POST')

        f = urllib.request.urlopen(req)

        if f.status == 200:
            return True

        return False


if __name__ == '__main__':
    import argparse
    import os
    import sys

    parser = argparse.ArgumentParser(description='ungleichotp-client')
    parser.add_argument('-n', '--name', help="Name (for verification)", required=True)
    parser.add_argument('-r', '--realm', help="Realm (for verification)", required=True)

    g = parser.add_mutually_exclusive_group(required=True)
    g.add_argument('--token', help="Token (for verification)")
    g.add_argument('--seed', help="Seed (for verification)")

    args = parser.parse_args(sys.argv[1:])


    UNGLEICHOTP={}
    for env in ['UNGLEICHOTPREALM', 'UNGLEICHOTPNAME', 'UNGLEICHOTPSEED', 'UNGLEICHOTPSERVER' ]:
        if not env in os.environ:
            raise Exception("Required environment variable missing: {}".format(env))

    client = UngleichOTPClient(os.environ['UNGLEICHOTPNAME'],
                               os.environ['UNGLEICHOTPREALM'],
                               os.environ['UNGLEICHOTPSEED'],
                               os.environ['UNGLEICHOTPSERVER'])


    if args.seed:
        token = pyotp.TOTP(args.seed).now()
    else:
        token = args.token

    try:
        if client.verify(args.name, args.realm, token) == True:
            print("Verify ok")
    except urllib.error.HTTPError as e:
        print("Failed to verify: {}".format(e))