#!/usr/bin/env python3

import sys
import subprocess
import re
from enum import Enum

## Helper functions ##################################################
##
def fmt_bool(x):
    return ("true" if x else "false")

def fmt_bin(base, prec, model):
    return "%s/%s/%s/%s.xml" % (base, model, prec, model)

## The script itself #################################################
##
if len(sys.argv) != 3:
    print("Usage: %s /path/to/input/video /path/to/models" % sys.argv[0])
    exit(1)

input_file_path   = sys.argv[1]
intel_models_path = sys.argv[2]

app             = "bin/example_gapi_privacy_masking_camera"
intel_fd_model  = "face-detection-retail-0005"
intel_lpd_model = "vehicle-license-plate-detection-barrier-0106"
output_file     = "out_results.csv"

tgts = [ ("CPU", "INT8")
       , ("CPU", "FP32")
       , ("GPU", "FP16")
       ]

class Policy(Enum):
    Traditional = 1
    Streaming   = 2

# From mode to cmd arg
mods = [ (Policy.Traditional, True)
       , (Policy.Streaming,  False)
       ]

class UI(Enum):
    With    = 1
    Without = 2

# From mode to cmd arg
ui = [ (UI.With,   False)
     , (UI.Without, True)
     ]

fd_fmt_bin  = lambda prec : fmt_bin(intel_models_path, prec, intel_fd_model)
lpd_fmt_bin = lambda prec : fmt_bin(intel_models_path, prec, intel_lpd_model)

# Performance comparison table
table={}

# Collect the performance data
for m in mods:              # Execution mode (trad/stream)
    for u in ui:            # UI mode (on/off)
        for f in tgts:      # FD model
            for p in tgts:  # LPD model
                cmd = [ app
                      , ("--input=%s"  % input_file_path)   # input file
                      , ("--faced=%s"  % f[0])              # FD device target
                      , ("--facem=%s"  % fd_fmt_bin(f[1]))  # FD model @ precision
                      , ("--platd=%s"  % p[0])              # LPD device target
                      , ("--platm=%s"  % lpd_fmt_bin(p[1])) # LPD model @ precision
                      , ("--trad=%s"   % fmt_bool(m[1]))    # Execution policy
                      , ("--noshow=%s" % fmt_bool(u[1]))    # UI mode (show/no show)
                      ]
                out = str(subprocess.check_output(cmd))
                match = re.search('Processed [0-9]+ frames \(([0-9]+\.[0-9]+) FPS\)', out)
                fps = float(match.group(1))
                print(cmd, fps, "FPS")
                table[m[0],u[0],f,p] = fps

# Write the performance summary
# Columns: all other components (mode, ui)
with open(output_file, 'w') as csv:
    # CSV header
    csv.write("FD,LPD,Serial(UI),Serial(no-UI),Streaming(UI),Streaming(no-UI),Effect(UI),Effect(no-UI)\n")

    for f in tgts:      # FD model
        for p in tgts:  # LPD model
            row = "%s/%s,%s/%s" % (f[0], f[1], p[0], p[1])                # FD precision, LPD precision
            row += ",%f"    % table[Policy.Traditional,UI.With,   f,p]    # Serial/UI
            row += ",%f"    % table[Policy.Traditional,UI.Without,f,p]    # Serial/no UI
            row += ",%f"    % table[Policy.Streaming,  UI.With,   f,p]    # Streaming/UI
            row += ",%f"    % table[Policy.Streaming,  UI.Without,f,p]    # Streaming/no UI

            effect_ui   = table[Policy.Streaming,UI.With,   f,p] / table[Policy.Traditional,UI.With,   f,p]
            effect_noui = table[Policy.Streaming,UI.Without,f,p] / table[Policy.Traditional,UI.Without,f,p]
            row += ",%f,%f" % (effect_ui,effect_noui)
            row += "\n"
            csv.write(row)

print("DONE: ", output_file)