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

REPORT_JSON=$1
REPORT_HTML=$2
TEST_DEF_FOLDER="${WORKSPACE}/test-definitions"

if echo "$JENKINS_URL" | grep -q "arm.com"; then
ARTIFACT_PATH='artifact/html'
INFO_PATH='lcov_report/coverage.info'
JSON_PATH='output_file.json'
else
ARTIFACT_PATH='artifact'
INFO_PATH='trace_report/coverage.info'
JSON_PATH='config_file.json'
fi

BRANCH_FOLDER="scripts/tools/code_coverage/fastmodel_baremetal/bmcov/report/branch_coverage"
BMCOV_REPORT_FOLDER="$OUTDIR/$TEST_DEF_FOLDER/scripts/tools/code_coverage/fastmodel_baremetal/bmcov/report"

#################################################################
# Create json file for input to the merge.sh for Code Coverage
# Globals:
#   REPORT_JSON: Json file for SCP and TF ci gateway test results
#   MERGE_JSON: Json file to be used as input to the merge.sh
# Arguments:
#   None
# Outputs:
#   Print number of files to be merged
################################################################
create_merge_cfg() {
python3 - << EOF
import json
import os

server = os.getenv("JENKINS_URL", "https://jenkins.oss.arm.com/")
merge_json = {} # json object
_files = []
with open("$REPORT_JSON") as json_file:
    data = json.load(json_file)
merge_number = 0
test_results = data['test_results']
test_files = data['test_files']
for index, build_number in enumerate(test_results):
    if "bmcov" in test_files[index] and test_results[build_number] == "SUCCESS":
        merge_number += 1
        base_url = "{}job/{}/{}/{}".format(
                        server, data['job'], build_number, "$ARTIFACT_PATH")
        _files.append( {'id': build_number,
                        'config': {
                                    'type': 'http',
                                    'origin': "{}/{}".format(
                                        base_url, "$JSON_PATH")
                                    },
                        'info': {
                                    'type': 'http',
                                    'origin': "{}/{}".format(
                                        base_url, "$INFO_PATH")
                                }
                        })
merge_json = { 'files' : _files }
with open("$MERGE_JSON", 'w') as outfile:
    json.dump(merge_json, outfile)
print(merge_number)
EOF
}

generate_bmcov_header() {
    cov_html=$1
    out_report=$2
python3 - << EOF
import re
cov_html="$cov_html"
out_report = "$out_report"
with open(cov_html, "r") as f:
    html_content = f.read()
items = ["Lines", "Functions", "Branches"]
s = """
    <div id="div-cov">
    <hr>
        <table id="table-cov">
              <tbody>
                <tr>
                    <td>Type</td>
                    <td>Hit</td>
                    <td>Total</td>
                    <td>Coverage</td>
              </tr>
"""
for item in items:
    data = re.findall(r'<td class="headerItem">{}:</td>\n\s+<td class="headerCovTableEntry">(.+?)</td>\n\s+<td class="headerCovTableEntry">(.+?)</td>\n\s+'.format(item),
    html_content, re.DOTALL)
    if data is None:
        continue
    hit, total = data[0]
    cov = round(float(hit)/float(total) * 100.0, 2)
    color = "success"
    if cov < 90:
        color = "unstable"
    if cov < 75:
        color = "failure"
    s = s + """
                <tr>
                    <td>{}</td>
                    <td>{}</td>
                    <td>{}</td>
                    <td class='{}'>{} %</td>
                </tr>
""".format(item, hit, total, color, cov)
s = s + """
            </tbody>
        </table>
        <p>
        <button onclick="window.open('artifact/$index/index.html','_blank');">Coverage Report</button>
        </p>
    </div>
<script>
    document.getElementById('tf-report-main').appendChild(document.getElementById("div-cov"));
</script>
"""
with open(out_report, "a") as f:
    f.write(s)
EOF
}
OUTDIR=""
index=""
case "$TEST_GROUPS" in
    scp*)
            project="scp"
            OUTDIR=${WORKSPACE}/reports
            index=reports;;
    tf*)
            project="trusted_firmware"
            OUTDIR=${WORKSPACE}/merge/outdir
            index=merge/outdir;;
    *)
            exit 0;;
esac
export MERGE_JSON="$OUTDIR/merge.json"
source "$CI_ROOT/script/test_definitions.sh"
mkdir -p $OUTDIR
pushd $OUTDIR
    merge_files=$(create_merge_cfg)
    echo "Merging $merge_files coverage files..."
    # Only merge when more than 1 test result
    if [ "$merge_files" -lt 2 ] ; then
        exit 0
    fi
    git clone $TEST_DEFINITIONS_REPO $TEST_DEF_FOLDER
    pushd $TEST_DEF_FOLDER
        git checkout $TEST_DEFINITIONS_REFSPEC
    popd

    if echo "$JENKINS_URL" | grep -q "arm.com"; then
    bash $TEST_DEF_FOLDER/scripts/tools/code_coverage/fastmodel_baremetal/bmcov/report/branch_coverage/merge.sh \
        -j $MERGE_JSON -l ${OUTDIR} -p $project
    else
    bash $TEST_DEF_FOLDER/coverage-tool/coverage-reporting/merge.sh \
        -j $MERGE_JSON -l ${OUTDIR}
    fi

    generate_bmcov_header ${OUTDIR}/index.html ${REPORT_HTML}
    cp ${REPORT_HTML} $OUTDIR
popd
