#!/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="${ROUTER_OPS_BASE:-/opt/router-ops}"
PUBLIC_BASE="${ROUTER_PUBLIC_BASE_URL:-https://reports.secret-studio.ru}"
PUBLIC_BASE="${PUBLIC_BASE%/}"
BACKEND="$BASE/bin/router-${MACHINE}-git-source-publish"
STATE_FILE="$BASE/state/current-${MACHINE}-git-source.env"
TOKEN_FILE="${ROUTER_PUBLIC_TOKEN_FILE:-$BASE/public/.router-public-token}"
REINDEX="$BASE/bin/router-public-reindex"

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"

[ -x "$BACKEND" ]
[ -x "$REINDEX" ]
[ -f "$TOKEN_FILE" ]

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")"
    [ -n "$RESULT" ]
    echo "$RESULT"
    echo "MACHINE=$MACHINE"
    echo "MODE=--check"
    echo "DESCRIPTION=$DESCRIPTION"
    echo "BACKEND_LOG=$LOG"
    exit 0
fi

[ -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)"
TOKEN="$(cat "$TOKEN_FILE")"
EXPECTED_DIR_PREFIX="$BASE/public/r/$TOKEN/latest/"
EXPECTED_URL="${PUBLIC_BASE}/latest/$(basename "$PUBLIC_DIR")/"

[ -n "$PUBLIC_URL" ]
[ -n "$COMMIT" ]
[ -n "$TREE" ]
[ -n "$FILE_COUNT" ]
[ -d "$PUBLIC_DIR" ]

case "$PUBLIC_DIR" in
    "$EXPECTED_DIR_PREFIX"*) ;;
    *)
        echo "STOP=INVALID_MACHINE_PUBLIC_DIR"
        echo "ACTUAL_PUBLIC_DIR=$PUBLIC_DIR"
        echo "EXPECTED_PREFIX=$EXPECTED_DIR_PREFIX"
        exit 1
        ;;
esac

if [ "$PUBLIC_URL" != "$EXPECTED_URL" ]; then
    echo "STOP=INVALID_MACHINE_PUBLIC_URL"
    echo "ACTUAL_PUBLIC_URL=$PUBLIC_URL"
    echo "EXPECTED_PUBLIC_URL=$EXPECTED_URL"
    exit 1
fi

grep -Fqx "PERMANENT_HTTPS_PUBLISHED=true" "$LOG" || {
    echo "STOP=PERMANENT_HTTPS_CONFIRMATION_MISSING"
    exit 1
}

grep -Fqx "${MACHINE_UPPER}_PUBLIC_URL=$PUBLIC_URL" "$LOG" || {
    echo "STOP=CANONICAL_MACHINE_URL_MISSING"
    exit 1
}

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

FOLDER_INDEX_TMP="$PUBLIC_DIR/index.html.tmp.$$"
{
    echo '<!doctype html><html><head><meta charset="utf-8"><title>router report</title></head><body>'
    printf '<h1>%s</h1>\n' "$(basename "$PUBLIC_DIR")"
    echo '<ul>'
    find "$PUBLIC_DIR" -maxdepth 1 -type f \
        ! -name index.html \
        ! -name 'index.html.tmp.*' \
        -printf '%f\n' |
    LC_ALL=C sort |
    while IFS= read -r NAME; do
        [ -n "$NAME" ] || continue
        printf '<li><a href="%s">%s</a></li>\n' "$NAME" "$NAME"
    done
    echo '</ul>'
    echo '<p><a href="../">Back to latest</a></p>'
    echo '</body></html>'
} > "$FOLDER_INDEX_TMP"
chmod 644 "$FOLDER_INDEX_TMP"
mv -f "$FOLDER_INDEX_TMP" "$PUBLIC_DIR/index.html"
"$REINDEX" >/dev/null

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"
echo "${MACHINE_UPPER}_PUBLIC_URL=$PUBLIC_URL"
