#!/usr/bin/env python

import argparse
import pandas as pd
import json
import os
from jinja2.nativetypes import NativeEnvironment

parser = argparse.ArgumentParser(description="smart size overview", prog="ss_overview")
parser.add_argument("-a", "--algorithm", help="algorithm", required=True)
args = parser.parse_args()
algorithm = args.algorithm

algorithm = algorithm.lower()

valid_algorithms = ["ws", "mosa", "dynamosa"]

if algorithm not in valid_algorithms:
    print("not valid algorithm: %s" % algorithm)
    exit(1)

show_name_map = {
    "ws": "WS",
    "mosa": "MOSA",
    "dynamosa": "DynaMOSA"
}

file_flag_map = {
    "ws": "suite",
    "mosa": "mosa",
    "dynamosa": "dynamosa"
}

all_file = "./%s_mean_size_overview.csv" % file_flag_map[algorithm]
small_file = "./%s_mean_size_overview_small.csv" % file_flag_map[algorithm]
big_file = "./%s_mean_size_overview_big.csv" % file_flag_map[algorithm]

fs = [
    ["All", all_file],
    ["Small", small_file],
    ["Big", big_file]
]

data_list = []

for f in fs:
    sm = pd.read_csv(f[1])
    a = sm.to_dict()
    ss_loc = -1
    oc_loc = -1
    for k, v in a["approach"].items():
        if v == "smart selection":
            ss_loc = k
            continue
        if v == 'original combination':
            oc_loc = k
    if ss_loc == -1 or oc_loc == -1:
        print("file invalid: %s" % f[1])
        exit(1)
    size_map = a["Size"]
    data_single = [f[0], size_map[ss_loc], size_map[oc_loc]]
    del size_map[ss_loc]
    del size_map[oc_loc]
    cc_list = list(size_map.values())
    cc_average = sum(cc_list) / len(cc_list)
    data_single.append(round(cc_average, 2))
    data_list.append(data_single)

content = '''
\\begin{table}[htbp]
    \centering
    \\small
    \caption{\\textcolor{red}{Average test suite size of each approach with {{# data.alg_show_name #}}}}
    \\begin{tabular}{l|l|l|l}
    \hline
        approach & SS & OC & CC (Average)  \\\\ \hline
        {% for d in data.list %}size ({{#d[0]#}} Classes) & {{#d[1]#}} & {{#d[2]#}} & {{#d[3]#}} \\\\ \hline
        {% endfor %}
    \end{tabular}
    \label{suite_size_{{#data.alg_name#}}}
\end{table}
'''
env = NativeEnvironment(variable_start_string='{{#', variable_end_string='#}}')
t = env.from_string(content)

data = {
    "alg_show_name": show_name_map[algorithm],
    "list": data_list,
    "alg_name": algorithm
}
result = t.render(data=data)
print(result)
