#! /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('-b', '--bind', default=DEFAULT_BIND, help='Bind address (default "%(default)s")')
    parser.add_argument('-d', '--database', default='./hashserv.db', help='Database file (default "%(default)s")')
    parser.add_argument('-l', '--log', default='WARNING', help='Set logging level')
    parser.add_argument('-u', '--upstream', help='Upstream hashserv to pull hashes from')
    parser.add_argument('-r', '--read-only', action='store_true', help='Disallow write operations from clients')

    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, upstream=args.upstream, read_only=args.read_only)
    server.serve_forever()
    return 0


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