red=$(tput setaf 1)
none=$(tput sgr0)
filename=
open_browser=

show_help() {
    printf "
Script for running all unit and widget tests with code coverage.
(run it from your root Flutter's project)
*Important: requires lcov
    
    Usage: 
    $0 [--help] [--open] [--filename <path>]
where:
    -o, --open
        Open the coverage in your browser,
        Default is google-chrome you can change this in the function open_cov().
    -h, --help
        print this message
    -f <path>, --filename <path>
        Run a particular test file. For example:
            
            -f test/a_particular_test.dart
            
        Or you can run all tests in a directory
            -f test/some_directory/
"
}

run_tests() {
    if [[ -f "pubspec.yaml" ]]; then
        rm -f coverage/lcov.info
        rm -f coverage/lcov-final.info
        flutter test --coverage "$filename"
        ch_dir
    else
        printf "\n${red}Error: this is not a Flutter project${none}\n"
        exit 1
    fi
}

run_report() {
    if [[ -f "coverage/lcov.info" ]]; then
        lcov -r coverage/lcov.info lib/resources/l10n/\* lib/\*/fake_\*.dart \
             -o coverage/lcov-final.info
        genhtml -o coverage coverage/lcov-final.info
    else
        printf "\n${red}Error: no coverage info was generated${none}\n"
        exit 1
    fi
}

ch_dir(){
    dir=$(pwd)
    input="$dir/coverage/lcov.info"
    output="$dir/coverage/lcov_new.info"
    echo "$input"
    while read line
    do
        secondString="SF:$dir/"
        echo "${line/SF:/$secondString}" >> $output
    done < "$input"

    mv $output $input
}

open_cov(){
    # This depends on your system 
    # Google Chrome:
    # google-chrome coverage/index-sort-l.html
    # Mozilla:
    firefox coverage/index-sort-l.html
}

while [ "$1" != "" ]; do
    case $1 in
        -h|--help)
            show_help
            exit
            ;;
        -o|--open)
            open_browser=1
            ;;
        -f|--filename)
            shift
            filename=$1
            ;;
        *)
            show_help
            exit
            ;;
    esac
    shift
done

run_tests
remove_from_coverage -f coverage/lcov.info -r '.g.dart$'
remove_from_coverage -f coverage/lcov.info -r '.freezed.dart$'
remove_from_coverage -f coverage/lcov.info -r '.config.dart$'
run_report
if [ "$open_browser" = "1" ]; then
    open_cov
fi