#!/usr/bin/env python
# -*- coding: utf-8; indent: 4 -*-
##
#
# Vaisala software source code file
#
# Copyright (c) Vaisala Oyj 2015. All rights reserved.
#
##
"""scan-http-service provides an HTTP API to radar scan data.

scan-updater-service shares the database with scan-http-service. The services
work in tandem: scan-updater-service is responsible for tracking what happens
on disk while scan-http-service handles the HTTP traffic.
"""
from __future__ import print_function

import os
import sys
import posix
import logging
import logging.handlers

from scan_service.webapp import make_app
from scan_service.utils import lg, set_proc_name

try:
    from systemd import journal, daemon
except:
    pass


def main(args):
    if args.systemd is True and (journal is None or daemon is None):
        sys.exit("Couldn't import systemd Python module!")

    if args.debug is True:
        logging.getLogger('').setLevel(logging.DEBUG)
    else:
        logging.getLogger('').setLevel(logging.INFO)
    if args.systemd is True:
        log_handler = journal.JournalHandler(SYSLOG_IDENTIFIER='scan-http-service')
    else:
        log_handler = logging.StreamHandler()
        log_handler.setFormatter(logging.Formatter('%(name)-12s: %(levelname)-8s %(message)s'))

    logging.getLogger('').addHandler(log_handler)

    logger = lg('scan-http-service')
    logger.info(u"Started with command line {}".format(repr(sys.argv)))
    if args.debug:
        logger.info(u"Debug logging enabled.")

    if set_proc_name('scan-http-service') is False:
        logger.warn("Couldn't set process name!")

    volume_dir_abs_path = os.path.abspath(os.path.normpath(args.volume_dir))
    if os.path.exists(volume_dir_abs_path) is False:
        message = u"Volume dir at '{}' doesn't exist!".format(volume_dir_abs_path)
        logger.error(message)
        print(message, file=sys.stderr)
        if args.systemd is True:
            daemon.notify(u"ERRNO={}".format(posix.EX_NOINPUT))
        sys.exit(posix.EX_NOINPUT) # EX_NOINPUT is 66, see sysexits.h for details


    app = make_app(args.db_file, args.volume_dir)

    from scan_service.middleware import ErrorLoggerMiddleware
    app = ErrorLoggerMiddleware(app, lg('scan-http-service.error'))

    if args.timer_log:
        logger.info("Enabling request time logging.")
        from scan_service.middleware import RequestTimeLoggerMiddleware
        app = RequestTimeLoggerMiddleware(app, lg('scan-http-service.request_time'))

    try:
        from cherrypy import wsgiserver
        server = wsgiserver.CherryPyWSGIServer((args.host, args.port), app,
                                               request_queue_size=500, server_name=args.host)

        if args.systemd:
            daemon.notify("READY=1")
        try:
            server.start()
        except KeyboardInterrupt:
            if args.systemd:
                daemon.notify("STOPPING=1")
            server.stop()
    except ImportError, ie:
        import traceback
        logger.warn(traceback.format_exc())
        logger.warn("Couldn't import CherryPy, defaulting to Python default WSGI server. Performance will be abysmal!")
        if not args.timer_log: # no timer logging, we have a proper Bottle app
            app.run(host=args.host, port=args.port, debug=args.debug, reloader=args.debug)
        else: # timer logging turned on, have to use wsgiref directly
            from wsgiref.simple_server import make_server
            httpd = make_server(args.host, args.port, app)
            httpd.serve_forever()

if __name__ == '__main__':
    import argparse
    parser = argparse.ArgumentParser()
    parser.add_argument('--host', default='127.0.0.1', dest='host')
    parser.add_argument('-p', '--port', default='34280', dest='port', type=int)
    parser.add_argument('--db-file', dest='db_file')
    parser.add_argument('--volume-dir', dest='volume_dir', required=True)
    parser.add_argument('--systemd', dest='systemd', action='store_true', default=False)
    parser.add_argument('-d', '--debug', dest='debug', action='store_true', default=False)
    parser.add_argument("--timer-log", dest="timer_log", action='store_true', default=False)
    args = parser.parse_args()
    main(args)
