#!/usr/bin/env python
"""
SPDX-FileCopyrightText: 2020-present Open Networking Foundation <info@opennetworking.org>
SPDX-License-Identifier: LicenseRef-ONF-Member-1.01
"""
from importlib import import_module
import os
import logging as log
import sys
import flask
from argparse import ArgumentParser, SUPPRESS

import config
from person_detection import Camera
import roc


app = flask.Flask(__name__)


@app.route('/')
def index():
    global cameras
    """Video streaming home page."""
    log.info("{} - connected".format(flask.request.remote_addr))
    return flask.render_template('index.html', devices=config.cameras)

def gen(camera):
    """Video streaming generator function."""
    while True:
        frame = camera.get_frame()
        yield (b'--frame\r\n'
               b'Content-Type: image/jpeg\r\n\r\n' + frame + b'\r\n')

@app.route('/video_feed/<device>')
def video_feed(device):
    """Video streaming route. Put this in the src attribute of an img tag."""
    global args
    log.debug("{} - video feed {}".format(flask.request.remote_addr, device))
    camera = Camera(device, flask.request.remote_addr, args)
    return flask.Response(gen(camera),
                    mimetype='multipart/x-mixed-replace; boundary=frame')

def name_to_port(name):
    return int(name)

def build_argparser():
    parser = ArgumentParser(add_help=False)
    args = parser.add_argument_group('Options')
    args.add_argument('-h', '--help',
            action = 'help',
            default = SUPPRESS,
            help = 'Show this help message and exit.')
    args.add_argument("-m", "--model",
            help = "Required. Path to an .xml file with a trained model.",
            required = True,
            type = str)
    args.add_argument("-i", "--input",
            help = "Path to video file or image. 'cam' for capturing video stream from camera",
            default = "gstreamer",
            type = str)
    args.add_argument("-pt", "--prob_threshold",
            help = "Optional. Probability threshold for detections filtering",
            default = 0.75,
            type = float)
    args.add_argument("--noroc",
            action = 'store_true',
            help = "No ROC")
    args.add_argument("--key",
            help = "ROC api key",
            type = str)
    args.add_argument("--mbrlow",
            help = "Low range of MBR",
            default = 7000000,
            type = int)
    args.add_argument("--mbrhigh",
            help = "High range of MBR",
            default = 10000000,
            type = int)
    args.add_argument("--devicegroup",
            help = "Camera device group",
            default = "menlo-4g-cameras",
            type = str)

    return parser


if __name__ == '__main__':
    log.basicConfig(format="[ %(levelname)s ] %(message)s", level=log.DEBUG, stream=sys.stdout)
    log.debug("Starting person detection app")
    args = build_argparser().parse_args()
    if not args.noroc:
        roc.set_mbr(args.key, args.devicegroup, args.mbrlow)
    app.run(host='0.0.0.0', debug=True)
