#! /usr/bin/env python3
#
# Copyright (C) 2018 Garmin Ltd.
#
# SPDX-License-Identifier: GPL-2.0-only
#

import os
import sys
import logging
import argparse
import sqlite3

sys.path.insert(0, os.path.join(os.path.dirname(os.path.dirname(__file__)), 'lib'))

import hashserv

VERSION = "1.0.0"

DEFAULT_BIND = 'unix://./hashserve.sock'


def main():
    parser = argparse.ArgumentParser(description='Hash Equivalence Reference Server. Version=%s' % VERSION,
                                     epilog='''The bind address is the path to a unix domain socket if it is
                                               prefixed with "unix://". Otherwise, it is an IP address
                                               and port in form ADDRESS:PORT. To bind to all addresses, leave
                                               the ADDRESS empty, e.g. "--bind :8686". To bind to a specific
                                               IPv6 address, enclose the address in "[]", e.g.
                                               "--bind [::1]:8686"'''
                                     )

    parser.add_argument('--bind', default=DEFAULT_BIND, help='Bind address (default "%(default)s")')
    parser.add_argument('--database', default='./hashserv.db', help='Database file (default "%(default)s")')
    parser.add_argument('--log', default='WARNING', help='Set logging level')

    args = parser.parse_args()

    logger = logging.getLogger('hashserv')

    level = getattr(logging, args.log.upper(), None)
    if not isinstance(level, int):
        raise ValueError('Invalid log level: %s' % args.log)

    logger.setLevel(level)
    console = logging.StreamHandler()
    console.setLevel(level)
    logger.addHandler(console)

    server = hashserv.create_server(args.bind, args.database)
    server.serve_forever()
    return 0


if __name__ == '__main__':
    try:
        ret = main()
    except Exception:
        ret = 1
        import traceback
        traceback.print_exc()
    sys.exit(ret)
