#!/usr/bin/env bash
##makedesc: Install composer (latest)

set -eo pipefail

installed() { command -v "$1" >/dev/null 2>&1; }

warn() { echo "WARNING: $*" >&2; }

require() {
    local missing=()
    for pkg in "$@"; do
        installed "$pkg" || missing+=("$pkg")
    done
    if [ ${#missing[@]} -gt 0 ]; then
        if [ "$(uname -s)" = "Darwin" ]; then
            if installed brew; then
                brew install "${missing[@]}"
            else
                echo "ERROR: Missing: ${missing[*]}. Install manually or use brew." >&2
                exit 1
            fi
        else
            sudo apt install -y "${missing[@]}"
        fi
    fi
}

download() {
    if installed wget; then
        wget -q --show-progress "$1" -O "$2"
    else
        curl -fsSL "$1" -o "$2"
    fi
}

install() {
    echo
    echo "==============================================="
    echo "Installing composer"
    echo "==============================================="
    echo

    # https://getcomposer.org/doc/faqs/how-to-install-composer-programmatically.md

    require php

    if installed composer; then
        warn "Removing current composer to install latest one"
        composer --version
        rm -f "$HOME/.local/bin/composer" /usr/local/bin/composer /usr/bin/composer 2>/dev/null || true
    fi

    mkdir -p "$HOME/install/other" "$HOME/.local/bin"

    download "https://getcomposer.org/installer" \
        "$HOME/install/other/composer-setup.php"

    php "$HOME/install/other/composer-setup.php" \
        --install-dir="$HOME/.local/bin/" \
        --filename="composer"

    COMPOSER_GLOBAL_HOME="$($HOME/.local/bin/composer config -g home)"
    NEWPATH="PATH=\"$COMPOSER_GLOBAL_HOME/vendor/bin:\${PATH}\""
    if ! grep -qoh "$NEWPATH" "$HOME/.profile" 2>/dev/null; then
        export "$NEWPATH"
        echo "export $NEWPATH" >> "$HOME/.profile"
    fi

    # shellcheck source=/dev/null
    source "$HOME/.profile"

    echo
    echo "Finish!"
    composer --version
    echo
}

upgrade() {
    install
}

remove() {
    echo
    echo "==============================================="
    echo "Removing composer"
    echo "==============================================="
    echo

    sudo apt remove -y --autoremove composer 2>/dev/null || true
    rm -f \
        "$HOME/.local/bin/composer" \
        /bin/composer \
        /usr/bin/composer \
        /usr/local/bin/composer \
        /usr/src/composer 2>/dev/null || true

    echo
    echo "Finish!"
    echo
}

case "$1" in
    u|upgrade|update) upgrade ;;
    r|remove|d|delete|p|purge) remove ;;
    *) install ;;
esac
