#!/bin/sh

readonly COVERAGE_THRESHOLD=${COVERAGE_THRESHOLD:-0}

if [ ${COVERAGE_THRESHOLD} -ne 0 ]; then
  echo "COVERAGE_THRESHOLD set to ${COVERAGE_THRESHOLD}%"
fi

# Moving coverage files from src (tests usually save it there).
mv -v src/.coverage* . 2>/dev/null

# When there are some .coverage.* files, it is a sign
# we need to combine them into one .coverage file.
if ls .coverage.* 2>/dev/null; then
  # Need to create an empty coverage file containing
  # all existing code files, to get coverage over whole src.
  echo "Creating .coverage.empty file"
  coverage run --source=./src /dev/null 2>/dev/null
  mv .coverage .coverage.empty
  echo "Combining .coverage.* files"
  coverage combine .coverage.*
elif [ ! -f .coverage ]; then
  echo "ERROR: .coverage file not found"
  exit 1
else
  echo "Using already existing .coverage file"
fi

EXCLUDES="\
src/all_modules.py,\
src/typing.py,\
src/apps/ethereum/tokens.py,\
src/apps/webauthn/knownapps.py,\
src/apps/common/coininfo.py,\
src/trezor/messages.py,\
src/trezor/enums/__init__.py"

# Uses core/.coveragerc configuration file
coverage html \
  --omit="$EXCLUDES" \
  --fail-under=${COVERAGE_THRESHOLD}

EXIT_CODE=$?

RESULT=$(grep pc_cov htmlcov/index.html | egrep -o '[0-9]{1,3}%')

# Catching the case when coverage is less than threshold
if [ ${EXIT_CODE} -eq 2 ]; then
  echo "ERROR: Code coverage is less than ${COVERAGE_THRESHOLD}% - ${RESULT}"
  echo "See core/htmlcov/index.html for details."
  exit 1
fi

# Catching all other errors
if [ ${EXIT_CODE} -ne 0 ]; then
  echo "ERROR: Coverage generation failed with exit code ${EXIT_CODE} - see output above"
  exit ${EXIT_CODE}
fi

# Happy path
echo "SUCCESS: COVERAGE: ${RESULT}"
echo "See core/htmlcov/index.html for details."