#!/bin/bash

SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
LOGS_DIR="${SCRIPT_DIR}/logs"
mkdir -p "$LOGS_DIR"
BAKE_JAR="${SCRIPT_DIR}/bakefile.jar"

executer_cas_de_test() {
    local langue=$1
    local cas_de_test=$2
    local repertoire_test="${SCRIPT_DIR}/tests/${langue}/${cas_de_test}"
    local repertoire_make="${repertoire_test}/make"
    local repertoire_bake="${repertoire_test}/bake"
    local repertoire_logs="${LOGS_DIR}/${langue}_${cas_de_test}"
    mkdir -p "$repertoire_logs"
    local fichier_resultat="${repertoire_logs}/resultat.txt"

    echo "Test de ${langue} - ${cas_de_test}"

    if [ ! -d "$repertoire_make" ] || [ ! -d "$repertoire_bake" ]; then
        echo "❌ Manque un répertoire pour ${langue} - ${cas_de_test}" > "$fichier_resultat"
        return 1
    fi

    executer_et_journaliser() {
        local repertoire=$1
        local outil=$2
        local fichier_journal="${repertoire_logs}/details_${outil}.log"
        local fichier_sortie="${repertoire_logs}/sortie_${outil}.txt"

        echo "Début du Test : $(date)" > "$fichier_journal"
        echo "Outil : ${outil}" >> "$fichier_journal"

        cd "$repertoire" || return 1

        if [ "$outil" = "make" ]; then
            sortie=$(make 2>&1)
        else
            sortie=$(java -cp "${BAKE_JAR}" fr.monlouyan.bakefile.Main 2>&1)
        fi
        code_sortie=$?

        sortie_normalisee=$(echo "$sortie" | sed "s/make: [\`'].*[']* is up to date\./TARGET_UP_TO_DATE/" | sed "s/bake: [\`'].*[']* is up to date\./TARGET_UP_TO_DATE/")
        
        echo "$sortie" > "$fichier_sortie"
        echo "Sortie ${outil} :" >> "$fichier_journal"
        echo "$sortie" >> "$fichier_journal"
        echo "Code de Sortie : $code_sortie" >> "$fichier_journal"

        echo "$sortie_normalisee"
        return $code_sortie
    }

    sortie_make=$(executer_et_journaliser "$repertoire_make" "make")
    code_sortie_make=$?
    sortie_bake=$(executer_et_journaliser "$repertoire_bake" "bake")
    code_sortie_bake=$?

    resultat="❌ Échec"
    
    if [ $code_sortie_make -eq $code_sortie_bake ]; then
        echo "Fichiers dans make:" > "${repertoire_logs}/diff_fichiers.log"
        find "$repertoire_make" -type f >> "${repertoire_logs}/diff_fichiers.log"
        echo "Fichiers dans bake:" >> "${repertoire_logs}/diff_fichiers.log"
        find "$repertoire_bake" -type f >> "${repertoire_logs}/diff_fichiers.log"

        fichiers_generes_make=$(find "$repertoire_make" -type f | grep -v "bakefile.jar\|Makefile\|Bakefile\|README.md" | sort)
        fichiers_generes_bake=$(find "$repertoire_bake" -type f | grep -v "bakefile.jar\|Makefile\|Bakefile\|README.md" | sort)

        fichiers_make=$(echo "$fichiers_generes_make" | xargs -n1 basename | sort)
        fichiers_bake=$(echo "$fichiers_generes_bake" | xargs -n1 basename | sort)

        if [ "$fichiers_make" = "$fichiers_bake" ] && [ "$sortie_make" = "$sortie_bake" ]; then
            resultat="✅ Réussi"
        else
            echo "Différences dans les sorties ou fichiers générés" >> "${repertoire_logs}/diff_fichiers.log"
        fi
    fi

    echo "$resultat" > "$fichier_resultat"
    echo "Fin du Test : $(date)" >> "$fichier_resultat"
    echo "$resultat"

    [ "$resultat" = "✅ Réussi" ]
}

tests_c=(
    "test-01-from-nothing"
    "test-02-already-exist"
    "test-03-circular"
    "test-04-edited"
    "test-05-variables"
    "test-06-variables-on-cascade"
	"test-07-dependency"
	"test-08-space-vs-tabulation"
	"test-09-handling-comment"
	"test-10-phony"
)

tests_java=(
    "test-01-from-nothing"
	"test-02-already-exist"
    "test-03-circular"
	"test-04-edited"
	"test-05-variables"
)

for cas_de_test in "${tests_c[@]}"; do
    executer_cas_de_test "C" "$cas_de_test"
done

for cas_de_test in "${tests_java[@]}"; do
    executer_cas_de_test "Java" "$cas_de_test"
done

echo "Résumé des Tests :" > "${LOGS_DIR}/resume.txt"
find "${LOGS_DIR}" -name "resultat.txt" -exec grep -H "✅\|❌" {} + >> "${LOGS_DIR}/resume.txt"