#!/bin/bash

# exit on errors
set -e

# import our ENV variables
# catch exits and give a friendly error message
function showerr {
    echo "Failed to load configuration! You may need to update your .env and quote values with special characters in them."
}
trap showerr EXIT
source .env
trap - EXIT

function clean {
    docker-compose stop
    docker-compose rm -f
}

function runweb {
    docker-compose run --rm web "$@"
}

function execdb {
    docker-compose exec db $@
}

function execweb {
    docker-compose exec web "$@"
}

function initdb {
    execweb python manage.py migrate
    execweb python manage.py initdb
}

function makeitblack {
    docker-compose run --rm web black celerywyrm bookwyrm
}

CMD=$1
shift

# show commands as they're executed
set -x

case "$CMD" in
    up)
        docker-compose up --build "$@"
        ;;
    run)
        docker-compose run --rm --service-ports web
        ;;
    initdb)
        initdb
        ;;
    resetdb)
        clean
        docker-compose up --build -d
        execdb dropdb -U ${POSTGRES_USER} ${POSTGRES_DB}
        execdb createdb -U ${POSTGRES_USER} ${POSTGRES_DB}
        initdb
        clean
        ;;
    makemigrations)
        runweb python manage.py makemigrations "$@"
        ;;
    migrate)
        runweb python manage.py migrate "$@"
        ;;
    bash)
        runweb bash
        ;;
    shell)
        runweb python manage.py shell
        ;;
    dbshell)
        execdb psql -U ${POSTGRES_USER} ${POSTGRES_DB}
        ;;
    restart_celery)
        docker-compose restart celery_worker
        ;;
    test)
        runweb coverage run --source='.' --omit="*/test*,celerywyrm*,bookwyrm/migrations/*" manage.py test "$@"
        ;;
    pytest)
        execweb pytest --no-cov-on-fail "$@"
        ;;
    collectstatic)
        runweb python manage.py collectstatic --no-input
        ;;
    makemessages)
        runweb django-admin makemessages --no-wrap --ignore=venv --all $@
        ;;
    compilemessages)
        runweb django-admin compilemessages --ignore venv $@
        ;;
    build)
        docker-compose build
        ;;
    clean)
        clean
        ;;
    black)
        makeitblack
        ;;
    populate_streams)
        runweb python manage.py populate_streams
        ;;
    generate_preview_images)
        runweb python manage.py generate_preview_images $@
        ;;
    *)
        echo "Unrecognised command. Try: build, clean, up, initdb, resetdb, makemigrations, migrate, bash, shell, dbshell, restart_celery, test, pytest, test_report, black, populate_streams, generate_preview_images"
        ;;
esac