#!/bin/bash

MAVKA="$1"

if [ -z "$MAVKA" ]; then
  echo "Usage: $0 <path_to_mavka_executable>"
  exit 1
fi

GREEN='\033[0;32m'
RED='\033[0;31m'
NC='\033[0m'

passed=0
failed=0

# Create a safe temporary file for capturing logs without pipe hangs
TEMP_OUT=$(mktemp)

# Clean up the temp file automatically if the script is interrupted or exits
trap 'rm -f "$TEMP_OUT"' EXIT

run_test() {
  test_file="$1"

  echo -n "$test_file: "

  # Direct file redirection avoids the slow Bash $(...) pipe bottleneck
  if [[ "$MAVKA" =~ \.[eE][xX][eE]$ ]]; then
    wine "$MAVKA" "$test_file" > "$TEMP_OUT" 2>&1
  else
    "$MAVKA" "$test_file" > "$TEMP_OUT" 2>&1
  fi
  status=$?

  # Read the output out of the file into the variable natively
  output=$(cat "$TEMP_OUT")

  if [ $status -eq 0 ]; then
    echo -e "${GREEN}УСПІХ${NC}"
    ((passed++))
  else
    echo -e "${RED}НЕВДАЧА${NC}"
    echo -e "-------------------------"
    echo "$output"
    echo -e "-------------------------\n"
    ((failed++))
  fi
}

run_test тестування/Число/більше_цілого.м
run_test тестування/Число/віднімання_цілого.м
run_test тестування/Число/двійкове_або_цілого.м
run_test тестування/Число/двійкове_вабо_цілого.м
run_test тестування/Число/двійкове_і_цілого.м
run_test тестування/Число/двійкове_не_цілого.м
run_test тестування/Число/ділення_цілого.м
run_test тестування/Число/додавання_цілого.м
run_test тестування/Число/змінити_знак_цілого.м
run_test тестування/Число/зсув_вліво_цілого.м
run_test тестування/Число/зсув_вправо_цілого.м
run_test тестування/Число/менше_цілого.м
run_test тестування/Число/множення_цілого.м
run_test тестування/Число/не_більше_цілого.м
run_test тестування/Число/не_менше_цілого.м
run_test тестування/Число/остача_цілого.м
run_test тестування/Число/степінь_цілого.м
run_test тестування/Число/більше_рухомого.м
run_test тестування/Число/віднімання_рухомого.м
run_test тестування/Число/ділення_рухомого.м
run_test тестування/Число/додавання_рухомого.м
run_test тестування/Число/змінити_знак_рухомого.м
run_test тестування/Число/менше_рухомого.м
run_test тестування/Число/множення_рухомого.м
run_test тестування/Число/не_більше_рухомого.м
run_test тестування/Число/не_менше_рухомого.м
run_test тестування/Число/остача_рухомого.м
run_test тестування/Число/степінь_рухомого.м
run_test тестування/Число/чародія_текст.м
run_test тестування/Число/чародія_число.м

echo ""
run_test тестування/Дані/Дані.м
run_test тестування/Дані/виділити.м
run_test тестування/Дані/обнулено.м
run_test тестування/Дані/з_тексту.м
run_test тестування/Дані/з_послідовності.м
run_test тестування/Дані/зі_списку.м
run_test тестування/Дані/з_даних.м
run_test тестування/Дані/чародія_перебір.м
run_test тестування/Дані/чародія_текст.м

echo ""
run_test тестування/Послідовність/Послідовність.м
run_test тестування/Послідовність/з_тексту.м
run_test тестування/Послідовність/з_послідовності.м
run_test тестування/Послідовність/зі_списку.м
run_test тестування/Послідовність/з_даних.м
run_test тестування/Послідовність/чародія_перебір.м
run_test тестування/Послідовність/чародія_текст.м

echo ""
run_test тестування/Список/Список.м
run_test тестування/Список/з_тексту.м
run_test тестування/Список/з_послідовності.м
run_test тестування/Список/зі_списку.м
run_test тестування/Список/з_даних.м
run_test тестування/Список/чародія_перебір.м
run_test тестування/Список/чародія_текст.м
run_test тестування/Список/додати.м
run_test тестування/Список/забрати.м
run_test тестування/Список/позиція.м
run_test тестування/Список/знайти.м
run_test тестування/Список/знайти_позицію.м
run_test тестування/Список/відібрати.м
run_test тестування/Список/перетворити.м
run_test тестування/Список/обернути.м
run_test тестування/Список/містить.м
run_test тестування/Список/змінити_елемент.м

echo ""
run_test тестування/ПроміжокЧисел/ПроміжокЧисел.м
run_test тестування/ПроміжокЧисел/чародія_текст.м
run_test тестування/ПроміжокЧисел/створити_вручну.м

echo ""
run_test тестування/Текст/Текст.м
run_test тестування/Текст/додати.м
run_test тестування/Текст/інтерполяція.м
run_test тестування/Текст/чародія_перебір.м
run_test тестування/Текст/чародія_текст.м
run_test тестування/Текст/чародія_число.м

echo ""
run_test тестування/Словник/Словник.м
run_test тестування/Словник/чародія_перебір.м
run_test тестування/Словник/чародія_текст.м
run_test тестування/Словник/ключі.м
run_test тестування/Словник/значення.м
run_test тестування/Словник/містить.м

echo ""
run_test тестування/Дія/Дія.м
run_test тестування/Дія/назва.м
run_test тестування/Дія/створити_вручну.м
run_test тестування/Дія/чародія_текст.м
run_test тестування/Дія/позиційні.м
run_test тестування/Дія/іменовані.м
run_test тестування/Дія/позиційні_іменовані.м
run_test тестування/Дія/значення_за_замовчуванням.м

echo ""
run_test тестування/Клас/Клас.м
run_test тестування/Клас/назва.м
run_test тестування/Клас/створити_вручну.м
run_test тестування/Клас/лише_ознаки.м
run_test тестування/Клас/чародія.м
run_test тестування/Клас/чародія_текст.м
run_test тестування/Клас/ознаки_і_чародія.м
run_test тестування/Клас/метод.м
run_test тестування/Клас/метод1.м

echo ""
run_test тестування/Код/Код.м
run_test тестування/Код/створити_вручну.м

echo ""
run_test тестування/Модуль/Модуль.м
run_test тестування/Модуль/отримати_назву.м
run_test тестування/Модуль/створити_вручну.м
run_test тестування/Модуль/чародія_текст.м
run_test тестування/Модуль/дати1.м

echo ""
run_test тестування/Параметр/Параметр.м
run_test тестування/Параметр/створити_вручну.м

echo ""
run_test тестування/Ознака/Ознака.м
run_test тестування/Ознака/створити_вручну.м

echo ""
run_test тестування/ПеребірДаних/ПеребірДаних.м
run_test тестування/ПеребірДаних/створити_вручну.м
run_test тестування/ПеребірДаних/чародія_текст.м
run_test тестування/ПеребірДаних/ручний_перебір.м

echo ""
run_test тестування/ПеребірПослідовності/ПеребірПослідовності.м
run_test тестування/ПеребірПослідовності/створити_вручну.м
run_test тестування/ПеребірПослідовності/чародія_текст.м
run_test тестування/ПеребірПослідовності/ручний_перебір.м

echo ""
run_test тестування/ПеребірПроміжкаЧисел/ПеребірПроміжкаЧисел.м
run_test тестування/ПеребірПроміжкаЧисел/створити_вручну.м
run_test тестування/ПеребірПроміжкаЧисел/чародія_текст.м
run_test тестування/ПеребірПроміжкаЧисел/ручний_перебір.м

echo ""
run_test тестування/ПеребірСловника/ПеребірСловника.м
run_test тестування/ПеребірСловника/створити_вручну.м
run_test тестування/ПеребірСловника/чародія_текст.м
run_test тестування/ПеребірСловника/ручний_перебір.м

echo ""
run_test тестування/ПеребірСписку/ПеребірСписку.м
run_test тестування/ПеребірСписку/створити_вручну.м
run_test тестування/ПеребірСписку/чародія_текст.м
run_test тестування/ПеребірСписку/ручний_перебір.м

echo ""
run_test тестування/ПеребірТексту/ПеребірТексту.м
run_test тестування/ПеребірТексту/створити_вручну.м
run_test тестування/ПеребірТексту/чародія_текст.м
run_test тестування/ПеребірТексту/ручний_перебір.м

echo ""
run_test тестування/перебрати/перебрати.м
run_test тестування/перебрати/перебрати_без_назви.м
run_test тестування/перебрати/перестрибнути.м
run_test тестування/перебрати/перервати.м

echo ""
run_test тестування/поки/поки.м
run_test тестування/поки/перестрибнути.м
run_test тестування/поки/перервати.м

echo ""
run_test тестування/взяти_модуль/взяти_модуль.м

echo ""
run_test тестування/взяти_пак/взяти_пак.м

echo ""
run_test тестування/біб/фс/записати_прочитати.м

echo ""
run_test тестування/біб/мат/Е.м
run_test тестування/біб/мат/ЛОГ10.м
run_test тестування/біб/мат/ЛОГ2.м
run_test тестування/біб/мат/ЛОГ2Е.м
run_test тестування/біб/мат/ЛОГ10Е.м
run_test тестування/біб/мат/ПІ.м
run_test тестування/біб/мат/КОРІНЬ1_2.м
run_test тестування/біб/мат/КОРІНЬ2.м
run_test тестування/біб/мат/син.м
run_test тестування/біб/мат/кос.м
run_test тестування/біб/мат/тан.м
run_test тестування/біб/мат/асин.м
run_test тестування/біб/мат/акос.м
run_test тестування/біб/мат/атан.м
run_test тестування/біб/мат/абс.м
run_test тестування/біб/мат/експ.м
run_test тестування/біб/мат/кор2.м
run_test тестування/біб/мат/стеля.м
run_test тестування/біб/мат/підлога.м
run_test тестування/біб/мат/округлити.м

echo -e "\n---"
echo -e "Успішних: ${GREEN}$passed${NC}"
echo -e "Невдалих: ${RED}$failed${NC}"
echo -e "---"

if [ $failed -ne 0 ]; then
  exit 1
fi