#!/usr/bin/env bash

# Image names
IMG_APP='app'
IMG_WEB='nginx'
IMG_MYSQL='mysql'
IMG_REDIS='redis'
IMG_QUEUE='beanstalkd'

# Directories
DIR_DOCKER="docker"
DIR_COMMANDS="freighter.d"
DIR_VENDOR="vendor/ignislabs/freighter"
DIR_V_DOCKER="$DIR_VENDOR/$DIR_DOCKER"
DIR_V_COMMANDS="$DIR_VENDOR/$DIR_COMMANDS"

# Files
F_BIN="freighter"
F_V_BIN="$DIR_VENDOR/$F_BIN"
F_COMPOSE="docker-compose.yml"

# Freighter env vars defaults for docker
export F_WEB_PORT=${F_WEB_PORT:-8000}
export F_MYSQL_PORT=${F_MYSQL_PORT:-33060}
export F_REDIS_PORT=${F_REDIS_PORT:-63790}
export F_QUEUE_PORT=${F_QUEUE_PORT:-11301}
export F_WWW_USER=${F_WWW_USER:-$UID}
export F_CONTEXT="./$DIR_V_DOCKER"

# Try local compose file first, fallback to vendor
[ -f "$F_COMPOSE" ] && COMPOSE_FILE="$F_COMPOSE" || COMPOSE_FILE="$DIR_VENDOR/$F_COMPOSE"

# Compose command
COMPOSE="docker-compose --project-directory ./ -f $COMPOSE_FILE"

# Get which command is supposed to run
CMD="$1"

# Requires docker env to be running
_req_running() {
    PS="$($COMPOSE ps -q 2>/dev/null)"
    if [ -z "$PS" ]; then
        echo "You must have your env up and running."
        echo "Run ./freighter <start|up> first."
        exit 1
    fi
}

# Global usage function
#   Use --no-args if you want to show help when no args are received
#   Otherwise it will only react to -h
_show_help() {
    HAS_ARGS="yes" # assume it has args
    if [ "$1" == "--no-args" ]; then
        shift 1 # gets rid of --no-args
        [[ "$#" == "0" ]] && HAS_ARGS="no"
    fi

    if [ "$HAS_ARGS" == "no" ] || [ "$1" == "-h" ]; then
        # if we have a CMD append space for display purposes
        [[ ! -z "$CMD" ]] && MYCMD="$CMD " || MYCMD=""

        echo "Usage:"
        echo -e "$HELP_USG" | awk -vcmd="$MYCMD" '{print "  ./freighter " cmd $0}'
        if [ "$HELP_TXT" ]; then
            echo ""
            echo "Description:"
            echo -e "$HELP_TXT" | awk '{print "  " $0}'
        fi

        # If we don't have a CMD, also show command list
        if [ -z "$CMD" ]; then
            echo ""
            _fcmd_list
        fi
        exit 1
    fi
}

HELP_USG="<command> [<args>]"
HELP_TXT="Ease up your docker management with Freighter!"
_show_help --no-args "$@"

# Built-in commands
if [ "$CMD" == "init" ]; then
    echo "# Initializing Freighter"
    echo ""

    if [ ! -f "$F_BIN" ]; then
        echo "- Add freighter executable to git ignore"
        echo "freighter" >> .gitignore
    fi

    if [ -f "$F_V_BIN" ]; then
        echo "- Copy freighter executable from vendor"
        cp $F_V_BIN $F_BIN
    fi

    echo "- Make freighter executable"
    chmod +x freighter

    echo ""
    echo "Enjoy!"
    exit 0
elif [ "$CMD" == "copy-services" ]; then
    cp "$DIR_V_DOCKER/$F_COMPOSE" "$F_COMPOSE"
    echo "Copied $DIR_V_DOCKER/$F_COMPOSE to ./$F_COMPOSE"
fi

# Include built-in commands
if [ -d "$DIR_V_COMMANDS" ]; then
    for file in "$DIR_V_COMMANDS"/*; do
        if [ -f "$file" ]; then
            source "$file"
        fi
    done
fi

# Include user commands if any
if [ -d "$DIR_COMMANDS" ]; then
    for file in "$DIR_COMMANDS"/*; do
        if [ -f "$file" ]; then
            source "$file"
        fi
    done
fi

if [ ! -z "$CMD" ]; then

    # source env
    if [ -f .env ]; then
        source .env
    fi

    shift 1
    FCMD="_fcmd_$CMD"
    if [ "$(type -t "$FCMD")" = function ]; then
        $FCMD "$@"
    else
        echo "Command [$CMD] not found. Pass-thru to docker-compose."
        echo "Running: $COMPOSE $CMD" "$@"
        echo ""
        $COMPOSE "$CMD" "$@"
    fi
fi
