#!/usr/bin/env python3
"""HKP server

Uses the python http.server module to create an HKP keyserver (pykeyserver)

Functions:

    port(number or string or bytes or bytearray) -> 16 bit integer"""

import ipaddress
import argparse
import http.server


class HKPRequestHandler(http.server.BaseHTTPRequestHandler):
    """HKP Request Handler Class"""


def run_server(server_class=http.server.ThreadingHTTPServer,
               handler_class=HKPRequestHandler,
               ip_address='',
               tcp_port=11371):
    """Run HTTP server with HKP request handler"""
    ip_address = str(ip_address)
    server_address = (ip_address, tcp_port)
    httpd = server_class(server_address, handler_class)
    httpd.serve_forever()


def port(val):
    """Restrict port values to the TCP range.

    Receives a number or a string, bytes, or bytearray instance representing an
    integer literal.
    Raises ValueError if it's not a number or if the number falls outside TCP
    port range."""
    num = int(val)
    if num < 1:
        raise ValueError
    if num.bit_length() > 16:
        raise ValueError
    return num


def main():
    """HKP server main function"""
    parser = argparse.ArgumentParser(description='Basic HKP keyserver')
    parser.add_argument('--address',
                        type=ipaddress.ip_address,
                        help='IP for server interface',
                        default=ipaddress.ip_address('127.0.0.1'))
    parser.add_argument('--port',
                        type=port,
                        help='TCP Port for server interface',
                        default=port(11371))

    args = parser.parse_args()

    run_server(ip_address=args.address, tcp_port=args.port)


if __name__ == '__main__':
    main()