#!/usr/bin/env bash
#
# TODO: use at your own risk!

set -e

if [ -f "${PWD}/mana.conf" ]; then
    . "${PWD}/mana.conf"
else
    echo [ERR] Cannot find mana.conf. Exiting...
    exit 1
fi

is_current_vcs() {
    local vcs=${1}
    $vcs status > /dev/null 2>&1
}

revision() {
    if is_current_vcs arc; then
        arc log --oneline -n1 --no-decorate | awk -F ' ' '{print $1}'
    else
        svn info --show-item revision
    fi
}

clean() {
    find . -name test-results -delete
    find . -name *-${APP_NAME}-test* -delete
    rm -v -f packages.json
    rm -v -f ${APP_NAME}*.tar.gz
    rm -v -f ${BIN_PATH}
    rm -v -f ${MANAGE_PATH}
}

build_package() {
    echo [RUN] ya make...
    ya make
    echo [RUN] ya package...
    ya package ${PACKAGE_PATH}
    echo [RUN] unpack package...
    tar xvf ${APP_NAME}.$(revision).tar.gz
}

build_project() {
    echo [RUN] ya make...
    ya make
}

build_docker() {
    echo [RUN] ya make...
    ya make
    echo [RUN] ya package --docker...
    ya package ${PACKAGE_PATH} --docker
}

run() {
    local exe=${1}
    shift
    echo [RUN] launch ${exe}...
    ${exe} "${@}"
}

login_docker() {
    echo [RUN] login to docker registry...
    echo $YA_TOKEN | docker login -u $YA_USER --password-stdin registry.yandex.net
}

run_docker() {
    echo [RUN] docker run...
    docker run registry.yandex.net/${APP_NAME}:$(revision)
}

push_docker() {
    echo [RUN] docker push to registry...
    docker push registry.yandex.net/${APP_NAME}:$(revision)
}

case "${1}" in
    clean)
        clean
        ;;
    build)
        build_project
        ;;
    manage)
        shift
        build_project
        run "${MANAGE_PATH}" "${@}"
        ;;
    launch)
        shift
        build_project
        echo [RUN] Starting with LAUNCH_PARAMS...
        run "${BIN_PATH}" ${LAUNCH_PARAMS} "${@}"
        ;;
    start)
        shift
        build_project
        run "${BIN_PATH}" "${@}"
        ;;
    package|pkg)
        shift
        build_package
        run "${BIN_PATH}" "${@}"
        ;;
    docker)
    shift
    case "${1}" in
        login)
            login_docker
            ;;
        run)
            build_docker
            run_docker
            ;;
        push)
            shift
            if [[ "${1}" == "-l" ]]; then
                login_docker
            fi
            build_docker
            push_docker
            ;;
        *)
            build_docker
            ;;
    esac
    ;;
    test)
        echo [RUN] tests...
        ya make ${TEST_PARAMS}
        ;;
    help|--help|-h)
        echo "Supported commands: {build|manage|launch|docker|test|help}"
        echo "Please, see README.md for more details"
        ;;
    *)
        if [ -f "${MANAGE_PATH}" ]; then
            run "${MANAGE_PATH}" "${@}"
        else
            echo [ERR] Need to build an app first. Exiting...
            exit 1
        fi
        ;;
esac
