#!/bin/bash
set -eo pipefail

# Helpers
separator () {
    echo '------------------------------------------------------------------------------'
}

export DEVELOPMENT_DB_NAME='zoomhub_development'
export TEST_DB_NAME='zoomhub_test'

# Commands
case "$1" in
init)
    echo "Install Haskell 'stack'"
    brew install haskell-stack
    stack setup

    echo "Install 'jq'"
    brew install jq

    echo "Install 'postgres'"
    brew install postgresql@10
    brew services start postgresql@10

    echo "Install 'vips'"
    brew install vips
    ;;
lint)
    stack exec hlint -- src tests
    ;;
format)
    case "$2" in
    install)
      stack install ormolu
      exit 0
      ;;
    check)
      mode='check'
      ;;
    "")
      mode='inplace'
      ;;
    *)
        echo "Unknown command: $0 $*. Try $0 $1 [check|install]"
        exit 1
    esac
    files=$(git ls-files '*.hs' | grep --invert 'vendor/')
    set +e
    ormolu --mode "$mode" $files
    ormolu_status=$?
    set -e

    if [[ "$mode" == "check" && $ormolu_status != 0 ]]; then
      echo "Ormolu check failed. Exit status: $ormolu_status"
      exit $ormolu_status
    fi
    ;;
run)
    npx dotenvx run --env-file .env -- ./scripts/run.sh
    ;;
test)
    dropdb --if-exists "$TEST_DB_NAME"
    createdb "$TEST_DB_NAME"

    PGUSER="$(whoami)" HASHIDS_SALT='secret-salt' \
      stack build \
        --fast \
        --test \
        --no-run-tests \
        --ghc-options='-Wall' \
        --exec "migrate-database $TEST_DB_NAME migrate"

    psql --output /dev/null --quiet "$TEST_DB_NAME" < ./data/zoomhub_data.sql
    psql --output /dev/null --quiet "$TEST_DB_NAME" < ./data/zoomhub_sequences.sql

    # See: https://github.com/commercialhaskell/stack/issues/2210
    MODULES="$2"

    PGUSER="$(whoami)" \
    PGDATABASE="$TEST_DB_NAME" \
      stack test \
        --fast \
        --ghc-options='-Wall' \
        --test-arguments '--match "'"$MODULES"'"'
    ;;
db)
    case "$2" in
    dump)
      pg_dump "$DEVELOPMENT_DB_NAME"
      ;;
    *)
        echo "Unknown command: $0 $*. Try $0 $1 dump"
        exit 1
    esac
    ;;

*)
    echo "Unknown command: $0 $*. Try: $0 format|init|lint|run|test"
    ;;
esac
