#!/usr/bin/env bash
set -e

count_only_flag=''
extended_syntax_flag=''
filter=''
flags=()

while [[ "$#" -ne 0 ]]; do
  case "$1" in
  -c)
    count_only_flag=1
    ;;
  -f)
    filter="$2"
    flags+=('-f' "$filter")
    shift
    ;;
  -x)
    extended_syntax_flag='-x'
    flags+=('-x')
    ;;
  *)
    break
    ;;
  esac
  shift
done

trap 'kill 0; exit 1' int

count=0
for filename in "$@"; do
  while IFS= read -r line; do
    if [[ "$line" =~ $BATS_TEST_PATTERN ]]; then
      test_name="${BASH_REMATCH[1]#[\'\"]}"
      test_name="${test_name%[\'\"]}"
      if [[ -z "$filter" || "$test_name" =~ $filter ]]; then
        ((++count))
      fi
    fi
  done <"$filename"
done

if [[ -n "$count_only_flag" ]]; then
  printf '%d\n' "$count"
  exit
fi

printf '1..%d\n' "$count"
status=0
offset=0
for filename in "$@"; do
  index=0
  {
    IFS= read -r # 1..n
    while IFS= read -r line; do
      case "$line" in
      'begin '* )
        ((++index))
        printf '%s\n' "${line/ $index / $(($offset + $index)) }"
        ;;
      'ok '* | 'not ok '* )
        if [[ -z "$extended_syntax_flag" ]]; then
          ((++index))
        fi
        printf '%s\n' "${line/ $index / $(($offset + $index)) }"
        if [[ "${line:0:6}" == 'not ok' ]]; then
          status=1
        fi
        ;;
      * )
        printf '%s\n' "$line"
        ;;
      esac
    done
  } < <( bats-exec-test "${flags[@]}" "$filename" )
  offset=$(($offset + $index))
done

exit "$status"
