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

source $CI_ROOT/utils.sh
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
    bash $TEST_DEF_FOLDER/scripts/tools/code_coverage/fastmodel_baremetal/bmcov/report/branch_coverage/merge.sh \
        -j $MERGE_JSON -l ${OUTDIR} -p $project
    generate_bmcov_header ${OUTDIR}/index.html ${REPORT_HTML}
    cp ${REPORT_HTML} $OUTDIR
popd
