#!/usr/bin/env python3
#
# Copyright (c) 2022-2023 Arm Limited. All rights reserved.
#
# SPDX-License-Identifier: BSD-3-Clause
#
# Common utility functions for Bugseng ECLAIR tool.

# Directory where this script resides (assuming it was sourced).
export _ECLAIR_UTILS_DIR="$(cd "$(dirname "$BASH_SOURCE")" ; echo "${PWD}")"

# Absolute path of the ECLAIR bin directory.
ECLAIR_BIN_DIR="/opt/bugseng/eclair/bin"


# Set various path variables based on ECLAIR_ANALYSIS var (which is a name
# of top-level dir to hold internal files and results of anaylisis). We
# need to support this variability to e.g. support delta reports
# between two analyses (before and after a patch).
eclair_set_paths() {
    if [ -z "${ECLAIR_ANALYSIS}" ]; then
        echo "ECLAIR_ANALYSIS is not defined"
        exit 1
    fi

    # Directory where to put all ECLAIR output and temporary files.
    ECLAIR_OUTPUT_DIR="${WORKSPACE}/${ECLAIR_ANALYSIS}/out"

    # ECLAIR binary data directory and workspace.
    export ECLAIR_DATA_DIR="${ECLAIR_OUTPUT_DIR}/.data"

    # Destination file for the ECLAIR diagnostics.
    export ECLAIR_DIAGNOSTICS_OUTPUT="${ECLAIR_OUTPUT_DIR}/DIAGNOSTICS.txt"

    PROJECT_ECD="${ECLAIR_OUTPUT_DIR}/PROJECT.ecd"
}

eclair_prepare() {
    eclair_set_paths
    mkdir -p "${ECLAIR_DATA_DIR}"
}

eclair_analyze() {
    eclair_set_paths
    (
        # Run a build in the ECLAIR environment.
        "${ECLAIR_BIN_DIR}/eclair_env"                   \
            "-eval_file='${ECLAIR_CONFIG_DIR}/MISRA_C_2012_selection.ecl'" \
            -- "$@"
    )
}

# Create the project database.
eclair_make_ecd() {
    eclair_set_paths
    find "${ECLAIR_DATA_DIR}" -maxdepth 1 -name "FRAME.*.ecb" \
        | sort | xargs cat \
        | "${ECLAIR_BIN_DIR}/eclair_report" \
            "-create_db='${PROJECT_ECD}'" \
            -load=/dev/stdin
}

eclair_make_report_self_contained() {
    dir=$1
    mkdir -p $dir/lib

    cp -r /opt/bugseng/eclair/lib/html $dir/lib

    ${_ECLAIR_UTILS_DIR}/relativize_urls.py $dir
}

eclair_make_reports() {
    eclair_set_paths
    ${ECLAIR_BIN_DIR}/eclair_report -db=${PROJECT_ECD} \
        -summary_txt=${ECLAIR_OUTPUT_DIR}/../summary_txt \
        -full_txt=${ECLAIR_OUTPUT_DIR}/../full_txt \
        -reports1_html=strictness,${ECLAIR_OUTPUT_DIR}/../full_html/by_strictness/@TAG@.html \
        -full_html=${ECLAIR_OUTPUT_DIR}/../full_html

    # summary_txt contains just a single report file not present in full_txt, move it there and be done with it.
    mv ${ECLAIR_OUTPUT_DIR}/../summary_txt/by_service.txt ${ECLAIR_OUTPUT_DIR}/../full_txt/
    rm -rf ${ECLAIR_OUTPUT_DIR}/../summary_txt

    eclair_make_report_self_contained ${ECLAIR_OUTPUT_DIR}/../full_html
}

eclair_compress_db() {
    eclair_set_paths

    # Compress database to take less disk space in Jenkins archive
    xz ${PROJECT_ECD}
}

eclair_make_delta_report() {
    base_dir=$1
    target_dir=$2

    diff -I '^Timestamp:' -x frames.txt -x files.txt -x explain.txt \
        -ur ${WORKSPACE}/${base_dir}/summary_txt/ ${WORKSPACE}/${target_dir}/summary_txt/ > ${WORKSPACE}/${target_dir}/summary_txt.diff || true

    ${ECLAIR_BIN_DIR}/eclair_report -diff_criteria=fingerprint -diff_full_txt=${base_dir}/out/PROJECT.ecd,${target_dir}/out/PROJECT.ecd
    ls -l diff_output

    ${ECLAIR_BIN_DIR}/eclair_report \
        -db=${base_dir}/out/PROJECT.ecd \
        -eval_file=${_ECLAIR_UTILS_DIR}/sel_tag_and_not_glob.ecl \
        -sel_tag_and_not_glob=new_no_expl,diff,missing,service,B.EXPLAIN \
        -full_html=resolved_issues_html
    eclair_make_report_self_contained resolved_issues_html

    ${ECLAIR_BIN_DIR}/eclair_report \
        -db=${target_dir}/out/PROJECT.ecd \
        -eval_file=${_ECLAIR_UTILS_DIR}/sel_tag_and_not_glob.ecl \
        -sel_tag_and_not_glob=new_no_expl,diff,missing,service,B.EXPLAIN \
        -full_html=new_issues_html
    eclair_make_report_self_contained new_issues_html

    xz ${base_dir}/out/PROJECT.ecd ${target_dir}/out/PROJECT.ecd
}
