#!/usr/bin/env python3
#
# Copyright BitBake Contributors
#
# SPDX-License-Identifier: GPL-2.0-only
#

import os
import sys,logging
import argparse
import warnings
warnings.simplefilter("default")

__version__ = "2.19.1"

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

import prserv
import prserv.serv
 
if __name__ == "__main__":
    if __version__ != prserv.__version__:
        sys.exit("Bitbake prserv library version and program version mismatch!")

PRHOST_DEFAULT="0.0.0.0"
PRPORT_DEFAULT=8585

def init_logger(logfile, loglevel):
    numeric_level = getattr(logging, loglevel.upper(), None)
    if not isinstance(numeric_level, int):
        raise ValueError("Invalid log level: %s" % loglevel)
    FORMAT = "%(asctime)-15s %(message)s"
    logging.basicConfig(level=numeric_level, filename=logfile, format=FORMAT)

def main():
    parser = argparse.ArgumentParser(
        description="BitBake PR Server. Version=%s" % __version__,
        formatter_class=argparse.RawTextHelpFormatter)

    parser.add_argument(
        "-f",
        "--file",
        default="prserv.sqlite3",
        help="database filename (default: prserv.sqlite3)",
    )
    parser.add_argument(
        "-l",
        "--log",
        default="prserv.log",
        help="log filename(default: prserv.log)",
    )
    parser.add_argument(
        "--loglevel",
        default="INFO",
        help="logging level, i.e. CRITICAL, ERROR, WARNING, INFO, DEBUG",
    )
    parser.add_argument(
        "--start",
        action="store_true",
        help="start daemon",
    )
    parser.add_argument(
        "--stop",
        action="store_true",
        help="stop daemon",
    )
    parser.add_argument(
        "--host",
        help="ip address to bind",
        default=PRHOST_DEFAULT,
    )
    parser.add_argument(
        "--port",
        type=int,
        default=PRPORT_DEFAULT,
        help="port number (default: 8585)",
    )
    parser.add_argument(
        "-r",
        "--read-only",
        action="store_true",
        help="open database in read-only mode",
    )
    parser.add_argument(
        "-u",
        "--upstream",
        default=os.environ.get("PRSERV_UPSTREAM", None),
        help="Upstream PR service (host:port)",
    )

    args = parser.parse_args()
    init_logger(os.path.abspath(args.log), args.loglevel)

    if args.start:
        ret=prserv.serv.start_daemon(
            args.file,
            args.host,
            args.port,
            os.path.abspath(args.log),
            args.read_only,
            args.upstream
        )
    elif args.stop:
        ret=prserv.serv.stop_daemon(args.host, args.port)
    else:
        ret=parser.print_help()
    return ret

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

