#!/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-3.12.0/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
}
