#!/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
}

function awscommand {
    # expose env vars
    export AWS_ACCESS_KEY_ID=${AWS_ACCESS_KEY_ID}
    export AWS_SECRET_ACCESS_KEY=${AWS_SECRET_ACCESS_KEY}
    export AWS_DEFAULT_REGION=${AWS_S3_REGION_NAME}
    # first arg is mountpoint, second is the whole aws command
    docker run --rm -it -v $1\
        -e AWS_ACCESS_KEY_ID -e AWS_SECRET_ACCESS_KEY -e AWS_DEFAULT_REGION\
        amazon/aws-cli $2
}

CMD=$1
if [ -n "$CMD" ]; then
    shift
fi

# show commands as they're executed
set -x

case "$CMD" in
    up)
        docker-compose up --build "$@"
        ;;
    service_ports_web)
        docker-compose run --rm --service-ports web
        ;;
    initdb)
        initdb "$@"
        ;;
    resetdb)
        clean
        # Start just the DB so no one else is using it
        docker-compose up --build -d db
        execdb dropdb -U ${POSTGRES_USER} ${POSTGRES_DB}
        execdb createdb -U ${POSTGRES_USER} ${POSTGRES_DB}
        # Now start up web so we can run the migrations
        docker-compose up --build -d web
        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
        ;;
    pytest)
        execweb pytest --no-cov-on-fail "$@"
        ;;
    collectstatic)
        runweb python manage.py collectstatic --no-input
        ;;
    makemessages)
        runweb django-admin makemessages --no-wrap --ignore=venv -l en_US $@
        ;;
    compilemessages)
        runweb django-admin compilemessages --ignore venv $@
        ;;
    update_locales)
        git fetch origin l10n_main:l10n_main
        git checkout l10n_main locale/de_DE
        git checkout l10n_main locale/es_ES
        git checkout l10n_main locale/fr_FR
        git checkout l10n_main locale/gl_ES
        git checkout l10n_main locale/it_IT
        git checkout l10n_main locale/lt_LT
        git checkout l10n_main locale/no_NO
        git checkout l10n_main locale/pt_PT
        git checkout l10n_main locale/pt_BR
        git checkout l10n_main locale/sv_SE
        git checkout l10n_main locale/zh_Hans
        git checkout l10n_main locale/zh_Hant
        runweb django-admin makemessages --no-wrap --ignore=venv -l en_US $@
        runweb django-admin compilemessages --ignore venv
        ;;
    build)
        docker-compose build
        ;;
    clean)
        clean
        ;;
    black)
        makeitblack
        ;;
    prettier)
        npx prettier --write bookwyrm/static/js/*.js
        ;;
    update)
        git pull
        docker-compose build
        runweb python manage.py migrate
        runweb python manage.py collectstatic --no-input
        docker-compose up -d
        ;;
    populate_streams)
        runweb python manage.py populate_streams "$@"
        ;;
    populate_lists_streams)
        runweb python manage.py populate_lists_streams $@
        ;;
    populate_suggestions)
        runweb python manage.py populate_suggestions
        ;;
    generate_thumbnails)
        runweb python manage.py generateimages
        ;;
    generate_preview_images)
        runweb python manage.py generate_preview_images "$@"
        ;;
    copy_media_to_s3)
        awscommand "bookwyrm_media_volume:/images"\
            "s3 cp /images s3://${AWS_STORAGE_BUCKET_NAME}/images\
            --endpoint-url ${AWS_S3_ENDPOINT_URL}\
            --recursive --acl public-read" "$@"
        ;;
    sync_media_to_s3)
        awscommand "bookwyrm_media_volume:/images"\
            "s3 sync /images s3://${AWS_STORAGE_BUCKET_NAME}/images\
            --endpoint-url ${AWS_S3_ENDPOINT_URL}\
            --acl public-read" "$@"
        ;;
    set_cors_to_s3)
        set +x
        config_file=$1
        if [ -z "$config_file" ]; then
            echo "This command requires a JSON file containing a CORS configuration as an argument"
            exit 1
        fi
        set -x
        awscommand "$(pwd):/bw"\
            "s3api put-bucket-cors\
            --bucket ${AWS_STORAGE_BUCKET_NAME}\
            --endpoint-url ${AWS_S3_ENDPOINT_URL}\
            --cors-configuration file:///bw/$config_file" "$@"
        ;;
    runweb)
        runweb "$@"
        ;;
    *)
        set +x # No need to echo echo
        echo "Unrecognised command. Try:"
        echo "    up [container]"
        echo "    service_ports_web"
        echo "    initdb"
        echo "    resetdb"
        echo "    makemigrations [migration]"
        echo "    migrate [migration]"
        echo "    bash"
        echo "    shell"
        echo "    dbshell"
        echo "    restart_celery"
        echo "    pytest [path]"
        echo "    collectstatic"
        echo "    makemessages"
        echo "    compilemessages [locale]"
        echo "    update_locales"
        echo "    build"
        echo "    clean"
        echo "    black"
        echo "    populate_streams [--stream=<stream name>]"
        echo "    populate_suggestions"
        echo "    generate_thumbnails"
        echo "    generate_preview_images [--all]"
        echo "    copy_media_to_s3"
        echo "    sync_media_to_s3"
        echo "    set_cors_to_s3 [cors file]"
        echo "    runweb [command]"
        ;;
esac
