#!/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"

    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_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
}
