#!/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"
INFO_PATH='artifact/html/lcov_report/coverage.info'
JSON_PATH='artifact/html/output_file.json'
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/{}/{}/artifact/html".format(
                        server, data['job'], build_number)
        _files.append( {'id': build_number,
                        'config': {
                                    'type': 'http',
                                    'origin': "{}/output_file.json".format(
                                        base_url)
                                    },
                        'info': {
                                    'type': 'http',
                                    'origin': "{}/lcov_report/coverage.info".format(
                                        base_url)
                                }
                        })
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"
echo "Merging $merge_files coverage files..."
source "$CI_ROOT/script/test_definitions.sh"
mkdir -p $OUTDIR
pushd $OUTDIR
    merge_files=$(create_merge_cfg)
    # 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
