#!/usr/bin/env bash
set -Eeuo pipefail

MODE="--publish"

if [ "${1:-}" = "--check" ]; then
    MODE="--check"
    shift
fi

MACHINE="${1:-}"
shift || true

DESCRIPTION="${*:-current managed source}"

case "$MACHINE" in
    vm100|vm101|vm121)
        ;;
    *)
        echo \
            'Usage: router-machine-close [--check] {vm100|vm101|vm121} "description"' \
            >&2
        exit 2
        ;;
esac

BASE="/opt/router-ops"
BACKEND="$BASE/bin/router-${MACHINE}-git-source-publish"
STATE_FILE="$BASE/state/current-${MACHINE}-git-source.env"

TS="$(date -u +%Y%m%d-%H%M%S)"
RUN_DIR="$BASE/state/machine-close-runs/${TS}_${MACHINE}"
LOG="$RUN_DIR/backend.txt"
DESCRIPTION_FILE="$RUN_DIR/description.txt"

mkdir -p "$RUN_DIR"
chmod 700 "$RUN_DIR"

printf '%s\n' "$DESCRIPTION" > "$DESCRIPTION_FILE"
chmod 600 "$DESCRIPTION_FILE"

test -x "$BACKEND"

if ! "$BACKEND" "$MODE" > "$LOG" 2>&1; then
    echo "STOP=ROUTER_MACHINE_CLOSE_BACKEND_FAILED"
    echo "MACHINE=$MACHINE"
    echo "MODE=$MODE"
    cat "$LOG"
    exit 1
fi

if [ "$MODE" = "--check" ]; then
    RESULT="$(
        awk '
            /^RESULT=PASS_/ {
                value=$0
            }

            END {
                print value
            }
        ' "$LOG"
    )"

    test -n "$RESULT"

    echo "$RESULT"
    echo "MACHINE=$MACHINE"
    echo "MODE=--check"
    echo "DESCRIPTION=$DESCRIPTION"
    echo "BACKEND_LOG=$LOG"
    exit 0
fi

test -f "$STATE_FILE"

MACHINE_UPPER="$(
    printf '%s' "$MACHINE" |
    tr '[:lower:]' '[:upper:]'
)"

read_state() {
    local suffix="$1"
    local key="${MACHINE_UPPER}_GIT_SOURCE_${suffix}"

    awk -F= -v key="$key" '
        $1 == key {
            print substr($0, index($0, "=") + 1)
        }
    ' "$STATE_FILE" |
    tail -n 1
}

PUBLIC_URL="$(read_state URL)"
COMMIT="$(read_state COMMIT)"
TREE="$(read_state TREE)"
FILE_COUNT="$(read_state FILE_COUNT)"
PUBLIC_DIR="$(read_state PUBLIC_DIR)"

test -n "$PUBLIC_URL"
test -n "$COMMIT"
test -n "$TREE"
test -n "$FILE_COUNT"
test -d "$PUBLIC_DIR"

case "$PUBLIC_URL" in
    http://*|https://*)
        ;;
    *)
        echo "STOP=INVALID_MACHINE_PUBLIC_URL"
        exit 1
        ;;
esac

printf '%s\n' "$DESCRIPTION" \
    > "$PUBLIC_DIR/step-description.txt"

chmod 644 "$PUBLIC_DIR/step-description.txt"

CURRENT="$BASE/state/current-machine-close-${MACHINE}.env"
CURRENT_TMP="${CURRENT}.tmp.$$"

{
    echo "ROUTER_MACHINE_CLOSE_UPDATED_AT_UTC=$TS"
    echo "ROUTER_MACHINE_CLOSE_RESULT=PASS"
    echo "ROUTER_MACHINE_CLOSE_MACHINE=$MACHINE"
    echo "ROUTER_MACHINE_CLOSE_DESCRIPTION=$DESCRIPTION"
    echo "ROUTER_MACHINE_CLOSE_COMMIT=$COMMIT"
    echo "ROUTER_MACHINE_CLOSE_TREE=$TREE"
    echo "ROUTER_MACHINE_CLOSE_FILE_COUNT=$FILE_COUNT"
    echo "ROUTER_MACHINE_CLOSE_PUBLIC_URL=$PUBLIC_URL"
    echo "ROUTER_MACHINE_CLOSE_PUBLIC_DIR=$PUBLIC_DIR"
    echo "ROUTER_MACHINE_CLOSE_BACKEND_LOG=$LOG"
} > "$CURRENT_TMP"

chmod 600 "$CURRENT_TMP"
mv "$CURRENT_TMP" "$CURRENT"

echo "RESULT=PASS_ROUTER_MACHINE_CLOSE"
echo "MACHINE=$MACHINE"
echo "DESCRIPTION=$DESCRIPTION"
echo "COMMIT=$COMMIT"
echo "TREE=$TREE"
echo "GIT_FILE_COUNT=$FILE_COUNT"
echo "SOURCE_PUBLISH_BACKEND=$BACKEND"
echo "BACKEND_LOG=$LOG"

# Эту последнюю строку прикладываем к STEP.
echo "${MACHINE_UPPER}_PUBLIC_URL=$PUBLIC_URL"
