"""
This file will take the csv outputs from server.py, calculate the mean and
variance of the warmup_latency, average_latency, throughput and gpu_util
and write these to the corresponding `results/output_{batch_size}_{compile}.md`
file, appending to the file if it exists or creatng a new one otherwise.
"""

import argparse
import os

import pandas as pd


if __name__ == "__main__":
    parser = argparse.ArgumentParser(description="Parse output files")
    parser.add_argument("--csv", type=str, help="Path to csv file")
    parser.add_argument("--name", type=str, help="Name of experiment")
    args = parser.parse_args()

    input_csv = "./results/" + args.csv
    df = pd.read_csv(input_csv)

    batch_size = int(os.path.basename(args.csv).split("_")[1])
    compile = os.path.basename(args.csv).split("_")[-1].split(".")[0]

    # Calculate mean and standard deviation for a subset of metrics
    metrics = ["warmup_latency", "average_latency", "throughput", "gpu_util"]
    means = {}
    stds = {}

    for metric in metrics:
        means[metric] = df[metric].mean()
        stds[metric] = df[metric].std()

    output_md = f"results/output_{batch_size}_{compile}.md"
    write_header = os.path.isfile(output_md) is False

    with open(output_md, "a+") as f:
        if write_header:
            f.write(f"## Batch Size {batch_size} Compile {compile}\n\n")
            f.write(
                "| Experiment | Warmup_latency (s) | Average_latency (s) | Throughput (samples/sec) | GPU Utilization (%) |\n"
            )
            f.write(
                "| ---------- | ------------------ | ------------------- | ------------------------ | ------------------- |\n"
            )

        line = f"| {args.name} |"
        for metric in metrics:
            line += f" {means[metric]:.3f} +/- {stds[metric]:.3f} |"
        f.write(line + "\n")
