#!/bin/bash
set -euo pipefail

# shellcheck disable=SC2034
declare -r BASHUNIT_VERSION="0.14.0"

# shellcheck disable=SC2155
declare -r BASHUNIT_ROOT_DIR="$(dirname "${BASH_SOURCE[0]}")"
export BASHUNIT_ROOT_DIR

source "$BASHUNIT_ROOT_DIR/src/dev/debug.sh"
source "$BASHUNIT_ROOT_DIR/src/default_env_config.sh"
source "$BASHUNIT_ROOT_DIR/src/env_configuration.sh"
source "$BASHUNIT_ROOT_DIR/src/clock.sh"
source "$BASHUNIT_ROOT_DIR/src/check_os.sh"
source "$BASHUNIT_ROOT_DIR/src/state.sh"
source "$BASHUNIT_ROOT_DIR/src/colors.sh"
source "$BASHUNIT_ROOT_DIR/src/console_header.sh"
source "$BASHUNIT_ROOT_DIR/src/console_results.sh"
source "$BASHUNIT_ROOT_DIR/src/helpers.sh"
source "$BASHUNIT_ROOT_DIR/src/upgrade.sh"
source "$BASHUNIT_ROOT_DIR/src/assertions.sh"
source "$BASHUNIT_ROOT_DIR/src/logger.sh"
source "$BASHUNIT_ROOT_DIR/src/runner.sh"
source "$BASHUNIT_ROOT_DIR/src/bashunit.sh"
source "$BASHUNIT_ROOT_DIR/src/main.sh"

_ASSERT_FN=""
_FILTER=""
_ARGS=()

while [[ $# -gt 0 ]]; do
  argument="$1"
  case $argument in
    -a|--assert)
      _ASSERT_FN="$2"
      shift
      shift
      ;;
    -f|--filter)
      _FILTER="$2"
      shift
      shift
      ;;
    -s|--simple)
      export SIMPLE_OUTPUT=true
      shift
      ;;
    -v|--verbose)
      export SIMPLE_OUTPUT=false
      shift
      ;;
    --debug)
      set -x
      shift
      ;;
    -S|--stop-on-failure)
      export STOP_ON_FAILURE=true
      shift
      ;;
    -e|--env)
      # shellcheck disable=SC1090
      source "$2"
      shift
      shift
      ;;
    -l|--log-junit)
      export LOG_JUNIT="$2";
      shift
      shift
      ;;
    -r|--report-html)
      export REPORT_HTML="$2";
      shift
      shift
      ;;
    --version)
      console_header::print_version
      trap '' EXIT && exit 0
      ;;
    --upgrade)
      upgrade::upgrade
      trap '' EXIT && exit 0
      ;;
    --help)
      console_header::print_help
      trap '' EXIT && exit 0
      ;;
    *)
      while IFS='' read -r line; do
        _ARGS+=("$line");
      done < <(helper::find_files_recursive "$argument")
      shift
      ;;
  esac
done

set +eu

if [[ -n "$_ASSERT_FN" ]]; then
  main::exec_assert "$_ASSERT_FN" "${_ARGS[@]}"
else
  main::exec_tests "$_FILTER" "${_ARGS[@]}"
fi
