#!/usr/bin/env bash

# Django Collectstatic runner. If you have Django installed, collectstatic will
# automatically be executed as part of the build process. If collectstatic
# fails, your build fails.

# This functionality will only activate if Django is in requirements.txt.

# Runtime arguments:
#   - $DISABLE_COLLECTSTATIC: disables this functionality.
#   - $DEBUG_COLLECTSTATIC: upon failure, print out environment variables.

# shellcheck source=bin/utils
source "$BIN_DIR/utils"

# Location of 'manage.py', if it exists.
MANAGE_FILE=$(find . -maxdepth 3 -type f -name 'manage.py' -printf '%d\t%P\n' | sort -nk1 | cut -f2 | head -1)
MANAGE_FILE=${MANAGE_FILE:-fakepath}

# Legacy file-based support for $DISABLE_COLLECTSTATIC
[ -f .heroku/collectstatic_disabled ] && DISABLE_COLLECTSTATIC=1

# Ensure that Django is explicitly specified in requirements.txt
sp-grep -s django && DJANGO_INSTALLED=1


if [ ! "$DISABLE_COLLECTSTATIC" ] && [ -f "$MANAGE_FILE" ] && [ "$DJANGO_INSTALLED" ]; then
    set +e

    puts-step "$ python $MANAGE_FILE collectstatic --noinput"

    # Run collectstatic, cleanup some of the noisy output.
    PYTHONPATH=${PYTHONPATH:-.}
    export PYTHONPATH

    # Create a temporary file for collecting the collectstaic logs.
    COLLECTSTATIC_LOG=$(mktemp)

    python "$MANAGE_FILE" collectstatic --noinput --traceback 2>&1 | tee "$COLLECTSTATIC_LOG" | sed '/^Post-processed/d;/^Copying/d;/^$/d' | indent
    COLLECTSTATIC_STATUS="${PIPESTATUS[0]}"

    set -e

    # Display a warning if collectstatic failed.
    [ "$COLLECTSTATIC_STATUS" -ne 0 ] && {

        if grep -q 'SyntaxError' "$COLLECTSTATIC_LOG"; then
            mcount "failure.collectstatic.syntax-error"

        elif grep -q 'ImproperlyConfigured' "$COLLECTSTATIC_LOG"; then
            mcount "failure.collectstatic.improper-configuration"

        elif grep -q 'The CSS file' "$COLLECTSTATIC_LOG"; then
            mcount "failure.collectstatic.fancy-references"

        elif grep -q 'OSError' "$COLLECTSTATIC_LOG"; then
            mcount "failure.collectstatic.missing-file"

        else
            mcount "failure.collectstatic.other"
        fi

        echo
        echo " !     Error while running '$ python $MANAGE_FILE collectstatic --noinput'."
        echo "       See traceback above for details."
        echo
        echo "       You may need to update application code to resolve this error."
        echo "       Or, you can disable collectstatic for this application:"
        echo
        echo "          $ heroku config:set DISABLE_COLLECTSTATIC=1"
        echo
        echo "       https://devcenter.heroku.com/articles/django-assets"

        # Additionally, dump out the environment, if debug mode is on.
        if [ "$DEBUG_COLLECTSTATIC" ]; then
            echo
            echo "****** Collectstatic environment variables:"
            echo
            env | indent
        fi

        # Abort the build.
        exit 1
    }

    echo
fi
