#!/usr/bin/env python
"""
SPDX-FileCopyrightText: 2022-present Intel Corporation
SPDX-FileCopyrightText: 2020-present Open Networking Foundation <info@opennetworking.org>
SPDX-License-Identifier: Apache-2.0
"""
import os
import logging as log
import sys
import flask
from argparse import ArgumentParser, SUPPRESS

import config
from person_detection import Camera
from roc import Roc


app = flask.Flask(__name__)


@app.route('/')
def index():
    """Video streaming home page."""
    global args
    devices = {str(x): "Camera "+str(x) for x in range(args.num)}
    log.info("{} - connected".format(flask.request.remote_addr))
    return flask.render_template('index.html', devices=devices)


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",
                      default="models/intel/person-detection-retail-0013/FP32/person-detection-retail-0013.xml",
                      help="Path to model", type=str)
    args.add_argument("-i", "--input",
                      help="Video input", default="gstreamer", type=str)
    args.add_argument("-pt", "--prob_threshold", default=0.75,
                      help="Probability threshold for detection", 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("--url", default=config.ROCURL,
                      help="ROC url", type=str)
    args.add_argument("--keycloak", default=config.KEYCLOAKURL,
                      help="Keycloak url", type=str)
    args.add_argument("--enterprise", default=config.ENTERPRISE,
                      help="Enterprise ID", type=str)
    args.add_argument("--site", default=config.SITE,
                      help="Site ID", type=str)
    args.add_argument("--devicegroup", default=config.DEVICEGROUP,
                      help="Camera device group", type=str)
    args.add_argument("--user", default=config.ROCUSER,
                      help="ROC username", type=str)
    args.add_argument("--password", default=config.ROCPASSWORD,
                      help="ROC password", type=str)
    args.add_argument("--num", default=config.NUMDEVICES,
                      help="Number of camera devices",
                      type=int)
    args.add_argument("--mqttip", default=config.MQTTIP,
                      help="IP address of MQTT",
                      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)

    return parser


if __name__ == '__main__':
    log.basicConfig(
            format='%(asctime)s %(levelname)-8s %(message)s',
            level=log.DEBUG,
            datefmt='%Y-%m-%d %H:%M:%S',
            stream=sys.stdout)
    log.debug("Starting person detection app")

    args = build_argparser().parse_args()

    if not args.noroc:
        key = args.key
        if key is None:
            if args.user is not None and args.password is not None:
                roc = Roc(args.url, args.keycloak, args.user, args.password,
                          args.enterprise, args.site)
                key = roc.get_key()
            else:
                log.error("Either key or user/password required")
                sys.exit()

        log.info("Device group:{} mbr:{}(low)".format(args.devicegroup,
                                                      args.mbrlow))
        roc.set_mbr(args.devicegroup, args.mbrlow)

    app.run(host='0.0.0.0', debug=True)
