#!/usr/bin/env bash

SOURCE="${BASH_SOURCE[0]}"

# If the current source is a symbolic link, we need to resolve it to an
# actual directory name. We'll use PHP to do this easier than we can
# do it in pure Bash. So, we'll call into PHP CLI here to resolve.
if [[ -L "$SOURCE" ]]
then
    DIR=$(php -r "echo dirname(realpath('$SOURCE'));")
else
    DIR="$( cd "$( dirname "$SOURCE" )" && pwd )"
fi

# If we are in the global Composer "bin" directory, we need to bump our
# current directory up two, so that we will correctly proxy into the
# Valet CLI script which is written in PHP. Will use PHP to do it.
if [ ! -f "$DIR/cli/valet.php" ]
then
    DIR=$(php -r "echo realpath('$DIR/../laravel/valet');")
fi

# If the command is the "share" command we will need to resolve out any
# symbolic links for the site. Before starting Ngrok, we will fire a
# process to retrieve the live Ngrok tunnel URL in the background.
if [[ "$1" = "share" ]]
then
    # Check for parameters to pass through to ngrok (these will start with '-' or '--')
    PARAMS=(${@:2})
    for PARAM in ${PARAMS[@]}
    do
        if [[ ${PARAM:0:1} != '-' ]]; then
            PARAMS=("${PARAMS[@]/$PARAM}") #Quotes when working with strings
        fi
    done

    PARAMS=${PARAMS[@]}

    HOST="${PWD##*/}"

    # Check for custom domain passed through to the share command ($2 w/o '-' prefix)
    if [[ ${2:0:1} != '-' ]]; then
        # If not blank and is a link, or is the cwd, use it
        if [[ ! -z $2 && (-L ~/.config/valet/Sites/$2 || $2 == $HOST) ]]; then
            HOST=$2
            CLIHOST=$2
        fi
    fi

    # If no custom domain passed, then check if there's a linked site for cwd
    if [[ -z $CLIHOST ]]; then
        # Find the first linked site for the current dir, if one exists
        for linkname in ~/.config/valet/Sites/*; do
            if [[ "$(readlink $linkname)" = "$PWD" ]]
            then
                HOST="${linkname##*/}"
                break
            fi
        done
    fi

    TLD=$(php "$DIR/cli/valet.php" tld)

	# Decide the correct PORT: uses 60 for secure, else 80
	if grep --quiet --no-messages 443 ~/.config/valet/Nginx/$HOST*
	then
		PORT=60
	else
		PORT=80
	fi

    # Lowercase the host to match how the rest of our domains are looked up
    HOST=$(echo "$HOST" | tr '[:upper:]' '[:lower:]')

	# Fetch Ngrok URL In Background...
	bash "$DIR/cli/scripts/fetch-share-url.sh" "$HOST" &

	sudo -u "$USER" "$DIR/bin/ngrok" http "$HOST.$TLD:$PORT" --host-header=rewrite $PARAMS

    exit

# Proxy PHP commands to the "php" executable on the isolated site
elif [[ "$1" = "php" ]]
then
    $(php "$DIR/cli/valet.php" which-php) "${@:2}"

    exit

# Proxy Composer commands with the "php" executable on the isolated site
elif [[ "$1" = "composer" ]]
then
    $(php "$DIR/cli/valet.php" which-php) $(which composer) "${@:2}"

    exit

# Finally, for every other command we will just proxy into the PHP tool
# and let it handle the request. These are commands which can be run
# without sudo and don't require taking over terminals like Ngrok.
else
    if [[ "$EUID" -ne 0 ]]
    then
        sudo USER="$USER" --preserve-env "$SOURCE" "$@"
        exit
    fi

    php "$DIR/cli/valet.php" "$@"
fi
