#!/usr/bin/env python3
#
# Copyright (c) 2022, Arm Limited. All rights reserved.
#
# SPDX-License-Identifier: BSD-3-Clause
#

import argparse
import csv
import os

from gen_test_report import emit_header, print_error_message

TABLE_HEADER = """\
<table id="tf-results-panel">
  <tbody>
    <tr>
      <td class="results-col">
        <table>
          <tbody>
            <thead>
              <tr>
                <th>Passed</th>
                <th>Skipped</th>
                <th>Crashed</th>
                <th>Failed</th>
              </tr>
            </thead>
            <tbody>
              <tr>"""

TABLE_FOOTER = """\
              </tr>
            </tbody>
          </tbody>
        </table>
      </td>
      <td class="button-col">
        <button id="tf-download-button" onclick="window.open('{}','_blank')">Download Plot</button>
      </td>
    </tr>
  </tbody>
</table>"""

# Open and sum the results of a comma-separated test result file.
def fetch_results(csv_path):
    failed = passed = skipped = crashed = 0
    with open(csv_path, "r") as fd:
        for test in csv.DictReader(fd):
            failed = failed + int(test["Failed"])
            passed = passed + int(test["Passed"])
            skipped = skipped + int(test["Skipped"])
            crashed = crashed + int(test["Crashed"])
    return passed, skipped, crashed, failed


def main(fd, csv_path, png_path):
    results_row = ("""<td>{}</td>\n""".rjust(28) * 4).format(
        *fetch_results(csv_path)
    )

    # Emite header and style sheet.
    emit_header(fd)

    print(TABLE_HEADER, file=fd)
    print(results_row, file=fd)

    # Format table button to link to full-size plot of results.
    TABLE_FOOTER.format(build_url + "/" + png_path)
    print(TABLE_FOOTER, file=fd)


if __name__ == "__main__":
    global build_url

    parser = argparse.ArgumentParser()

    # Add arguments
    parser.add_argument(
        "--output",
        "-o",
        default="report.html",
        help="Path to output file",
    )
    parser.add_argument(
        "--csv",
        default=None,
        help="Path to input CSV with data for the target job",
    )
    parser.add_argument(
        "--png", default=None, help="Filename for PNG results plot"
    )

    # The build url and target for the results are needed in-case the user hasn't provided a
    # paths to the inputs.
    opts = parser.parse_args()
    build_url = os.environ["BUILD_URL"]
    target_job = os.environ["TARGET_BUILD"]
    target_job_name = target_job[: target_job.find("/")]

    # Use filenames provided by user or try and infer based off the target name from the environment.
    output_path = "report.html" if not opts.output else opts.output
    csv_path = target_job_name + "results.csv" if not opts.csv else opts.csv
    png_path = target_job_name + "results.png" if not opts.png else opts.png

    with open(output_path, "w") as fd:
        try:
            main(output_path, csv_path, png_path)
        except:
            print_error_message(fd)
            raise
