#!/usr/bin/env bash

VERSION=v0.0.2

BASE_DIR="$(dirname "$0")"
COMPOSE_FILE="${BASE_DIR}/../docker/docker-compose.yml"

GREEN='\033[0;32m'
RED='\033[0;31m'
NC='\033[0m'

print_info() {
    echo -e "${GREEN}Yacht ${VERSION}${NC}"
}

log_info() {
    echo -e "${GREEN}INFO:\t$1"
}

log_error() {
    echo -e "${RED}ERROR:\t$1"
}

if ! [[ -x "$(command -v docker-compose)" ]]; then
    shopt -s expand_aliases
    alias docker-compose="docker compose"
fi

UNAME="$(uname -s)"
DOCKER_NETWORK='yacht-proxy'

case "$UNAME" in
    Linux*) MACHINE=linux ;;
    Darwin*) MACHINE=mac ;;
    *) MACHINE='' ;;
esac

if [[ -z "$MACHINE" ]]; then
    echo "Unsupported operating system [$(uname -s)]. Yacht supports Linux, macOS and Windows (WSL2)."
    exit 1
fi

if [[ $# -gt 0 ]]; then
    if [[ "$1" == "start" ]]; then
        shift 1

        if ! docker network ls --format '{{.Name}}' | grep -q "${DOCKER_NETWORK}"; then
            docker network create "${DOCKER_NETWORK}"
        fi

        docker-compose -f "${COMPOSE_FILE}" up -d "$@"
    elif [[ "$1" == "stop" ]]; then
        shift 1

        docker-compose -f "${COMPOSE_FILE}" stop "$@"
    elif [[ "$1" == "add" ]]; then
        shift 1
        if [[ $# -gt 0 ]]; then
            ADD_DIR="$1"
        else
            ADD_DIR="$(pwd)"
        fi

        if ! [[ -d "${ADD_DIR}" ]]; then
            log_error "<path> does not exist."
            exit 1
        fi

        if ! [[ -f "${ADD_DIR}/artisan" ]]; then
            log_error "Artisan CLI not found in directory \"${ADD_DIR}\"."
            log_error
            log_error "Are you sure \"${ADD_DIR}\" is a Laravel project?"
            exit 1
        fi

        ARTISAN="${ADD_DIR}/artisan"
        APP_VERSION="$(php "${ARTISAN}" --version)"

        if ! [[ -d "${ADD_DIR}/vendor/blamebutton/yacht" ]]; then
            log_error "Yacht is not installed in \"${ADD_DIR}\".\n"
            read -p "Do you want to run \"composer require --dev blamebutton/yacht\" to install it? [y/N] " answer
            case "${answer:0:1}" in
                [Yy]*)
                    composer --working-dir="${ADD_DIR}" require --dev blamebutton/yacht
                    ;;
                *)  exit 1
                    ;;

            esac
            exit 1
        fi

        if ! [[ -f "${ADD_DIR}/docker-compose.yml" ]]; then
            log_error "\"docker-compose.yml\" not found.\n"
            read -p "Do you want to generate a \"docker-compose.yml\"? [y/N] " answer
            case "${answer:0:1}" in
                [Yy]*)
                    php "${ARTISAN}" sail:install
                    ;;
                *)  exit 1
                    ;;
            esac
        fi

        log_info "${APP_VERSION} found in directory \"${ADD_DIR}\""

        php "${ARTISAN}" yacht:install
    else
        docker-compose -f "${COMPOSE_FILE}" "$@"
    fi
else
    print_info
    echo
    echo -e "Available commands:${NC}"
    echo
    echo -e "\tstart\t\tStart Traefik"
    echo -e "\tstop\t\tStop Traefik"
    echo -e "\tadd [<path>]\tAdd a directory as Laravel Sail source"
    echo
    echo "Commands that are not defined, will be passed to \"docker-compose\"."
fi
