#!/usr/bin/env bash
set -Eeuo pipefail
umask 077
export PATH='/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin'

STEP_ID='STEP_050M07R20Q_PREP_VM100_STORAGE_TOOLSET_CHECKPOINT'
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
BUNDLE_ROOT="${BUNDLE_ROOT:-$SCRIPT_DIR}"
export BUNDLE_ROOT
BASE="${ROUTER_OPS_BASE:-/opt/router-ops}"
CONTRACT_ROOT="${ROUTER_CONTRACT_ROOT:-/opt/router-ops}"
WORKFLOW_LIB="${ROUTER_STEP_WORKFLOW_LIB:-$CONTRACT_ROOT/lib/router-step-workflow.sh}"
FINALIZER="${ROUTER_STEP_FINALIZE_BIN:-$CONTRACT_ROOT/bin/router-step-finalize}"
SAFE_PAYLOAD="${ROUTER_PUBLIC_SAFE_PAYLOAD_BIN:-$CONTRACT_ROOT/bin/router-public-safe-payload}"
POLICY_LIB="${ROUTER_PUBLICATION_POLICY_LIB:-$CONTRACT_ROOT/lib/router-publication-policy.sh}"
RUN_ID="$(date -u +%Y%m%d-%H%M%S)-$$"
RUN_DIR="${ROUTER_STEP_RUN_DIR:-$BASE/state/step-runs/$STEP_ID/$RUN_ID}"
CURRENT_FILE="$RUN_DIR/workflow-current.txt"
EVENTS_FILE="$RUN_DIR/workflow-events.tsv"
EVIDENCE_DIR="$RUN_DIR/evidence"
REPORT_DIR="$RUN_DIR/report"
PUBLIC_PAYLOAD="$RUN_DIR/public-payload"
FINAL_ENV="$RUN_DIR/finalize.txt"
LOCK_FILE="${ROUTER_STEP_LOCK_FILE:-$BASE/state/locks/${STEP_ID}.lock}"
CURRENT_PHASE=bootstrap
PUBLICATION_VERIFIED=false

source "$WORKFLOW_LIB"

publish_stop_report() {
    phase="$1"; line="$2"; rc="$3"
    python3 "$BUNDLE_ROOT/scripts/build_stop_report.py" --step-id "$STEP_ID" --phase "$phase" --line "$line" --rc "$rc" --output "$REPORT_DIR" --release-info "$BUNDLE_ROOT/release-info.json" --installer-sha "$BUNDLE_ROOT/installer.sha256" --bundle-manifest "$BUNDLE_ROOT/manifest.sha256" || return 1
    cp "$BUNDLE_ROOT/install.sh" "$REPORT_DIR/executed-step.sh"
    for f in pve-evidence.txt vm100-evidence.txt source-check.txt preflight.txt; do [[ ! -f "$EVIDENCE_DIR/$f" ]] || cp "$EVIDENCE_DIR/$f" "$REPORT_DIR/$f"; done
    ROUTER_PUBLICATION_POLICY_LIB="$POLICY_LIB" "$SAFE_PAYLOAD" "$PUBLIC_PAYLOAD"         "$REPORT_DIR/report.txt" report.txt         "$REPORT_DIR/facts.json" facts.json         "$REPORT_DIR/facts-public.html" facts-public.html         "$REPORT_DIR/verify-public.html" verify-public.html         "$REPORT_DIR/rollback-public.html" rollback-public.html         "$REPORT_DIR/release-info.json" release-info.json         "$REPORT_DIR/installer.sha256" installer.sha256         "$REPORT_DIR/bundle-manifest.sha256" bundle-manifest.sha256         "$REPORT_DIR/executed-step.sh" executed-step.sh         "$REPORT_DIR/pve-evidence.txt" pve-evidence.txt         "$REPORT_DIR/vm100-evidence.txt" vm100-evidence.txt         "$REPORT_DIR/source-check.txt" source-check.txt         "$REPORT_DIR/preflight.txt" preflight.txt || return 1
    "$FINALIZER" --label step050m07r20qprep_vm100_storage_toolset_checkpoint --payload-dir "$PUBLIC_PAYLOAD" --workflow-current "$CURRENT_FILE" --workflow-events "$EVENTS_FILE" --output-env "$FINAL_ENV" --expect-kind step-report
}

on_error() {
    line="$1"; rc="$2"
    trap - ERR
    set +e
    phase="${CURRENT_PHASE:-unknown}"
    if [[ -f "$CURRENT_FILE" ]]; then router_step_phase_fail "$phase" "line=$line rc=$rc" >/dev/null 2>&1 || true; fi
    "$BUNDLE_ROOT/rollback/rollback.sh" "$phase" "$rc" || true
    if [[ -f "$CURRENT_FILE" ]] && router_step_publication_is_verified; then
        echo 'RESULT=PASS_WORKFLOW_ALREADY_COMPLETE'
        echo 'LATE_ERROR_AFTER_COMPLETE=true'
        echo "LATE_ERROR_PHASE=$phase"
        echo "LATE_ERROR_LINE=$line"
        echo "LATE_ERROR_RC=$rc"
        exit 0
    fi
    publish_stop_report "$phase" "$line" "$rc" || true
    [[ ! -f "$FINAL_ENV" ]] || cat "$FINAL_ENV"
    echo 'RESULT=STOP_VM100_ENVIRONMENT_CHECKPOINT'
    echo "STOP_PHASE=$phase"
    echo "STOP_LINE=$line"
    echo "STOP_RC=$rc"
    echo 'RUNTIME_IMPACT=false'
    echo 'CORE_CHANGE_REPEATED=false'
    exit "$rc"
}
trap 'on_error "$LINENO" "$?"' ERR

mkdir -p "$RUN_DIR" "$EVIDENCE_DIR" "$REPORT_DIR" "$PUBLIC_PAYLOAD" "$(dirname "$LOCK_FILE")"
exec 9>"$LOCK_FILE"
flock -n 9
router_step_workflow_init "$CURRENT_FILE" "$EVENTS_FILE" preflight evidence source_check report_build

CURRENT_PHASE=preflight
router_step_phase_begin preflight
"$BUNDLE_ROOT/scripts/preflight.sh" > "$EVIDENCE_DIR/preflight.txt"
router_step_phase_complete preflight verified_installed_workflow_and_dependencies

CURRENT_PHASE=evidence
router_step_phase_begin evidence
"$BUNDLE_ROOT/scripts/collect-evidence.sh" "$EVIDENCE_DIR"
router_step_phase_complete evidence pve_and_vm100_readonly_evidence_collected

CURRENT_PHASE=source_check
router_step_phase_begin source_check
grep -Fqx 'RESULT=PASS_VM130_VM100_GIT_SOURCE_CHECK' "$EVIDENCE_DIR/source-check.txt"
grep -Fqx 'VM130_STATUS=CLEAN' "$EVIDENCE_DIR/source-check.txt"
grep -Fqx 'VM100_PUSH_PERFORMED=false' "$EVIDENCE_DIR/source-check.txt"
router_step_phase_complete source_check authoritative_chain_passed_no_push

CURRENT_PHASE=report_build
router_step_phase_begin report_build
python3 "$BUNDLE_ROOT/scripts/build_report.py" --step-id "$STEP_ID" --pve "$EVIDENCE_DIR/pve-evidence.txt" --vm100 "$EVIDENCE_DIR/vm100-evidence.txt" --source "$EVIDENCE_DIR/source-check.txt" --output "$REPORT_DIR" --release-info "$BUNDLE_ROOT/release-info.json" --installer-sha "$BUNDLE_ROOT/installer.sha256" --bundle-manifest "$BUNDLE_ROOT/manifest.sha256"
python3 -m json.tool "$REPORT_DIR/facts.json" >/dev/null
cp "$BUNDLE_ROOT/install.sh" "$REPORT_DIR/executed-step.sh"
cp "$EVIDENCE_DIR/pve-evidence.txt" "$REPORT_DIR/pve-evidence.txt"
cp "$EVIDENCE_DIR/vm100-evidence.txt" "$REPORT_DIR/vm100-evidence.txt"
cp "$EVIDENCE_DIR/source-check.txt" "$REPORT_DIR/source-check.txt"
cp "$EVIDENCE_DIR/preflight.txt" "$REPORT_DIR/preflight.txt"
ROUTER_PUBLICATION_POLICY_LIB="$POLICY_LIB" "$SAFE_PAYLOAD" "$PUBLIC_PAYLOAD"     "$REPORT_DIR/report.txt" report.txt     "$REPORT_DIR/facts.json" facts.json     "$REPORT_DIR/facts-public.html" facts-public.html     "$REPORT_DIR/verify-public.html" verify-public.html     "$REPORT_DIR/rollback-public.html" rollback-public.html     "$REPORT_DIR/release-info.json" release-info.json     "$REPORT_DIR/installer.sha256" installer.sha256     "$REPORT_DIR/bundle-manifest.sha256" bundle-manifest.sha256     "$REPORT_DIR/executed-step.sh" executed-step.sh     "$REPORT_DIR/pve-evidence.txt" pve-evidence.txt     "$REPORT_DIR/vm100-evidence.txt" vm100-evidence.txt     "$REPORT_DIR/source-check.txt" source-check.txt     "$REPORT_DIR/preflight.txt" preflight.txt
router_step_phase_complete report_build public_safe_payload_ready

CURRENT_PHASE=publication
"$FINALIZER" --label step050m07r20qprep_vm100_storage_toolset_checkpoint --payload-dir "$PUBLIC_PAYLOAD" --workflow-current "$CURRENT_FILE" --workflow-events "$EVENTS_FILE" --output-env "$FINAL_ENV" --expect-kind step-report
PUBLICATION_VERIFIED=true
router_step_workflow_mark_complete || true

set +e
STEP_REPORT_URL="$(awk -F= '$1=="PUBLIC_URL" {print substr($0,index($0,"=")+1)}' "$FINAL_ENV" | tail -n 1)"
TOKEN_FILE="$BASE/public/.router-public-token"
if [[ -f "$TOKEN_FILE" ]]; then
    TOKEN="$(cat "$TOKEN_FILE")"
    LATEST="$BASE/public/r/$TOKEN/latest"
else
    LATEST=''
fi
latest_url() {
    pattern="$1"
    if [[ -n "$LATEST" && -d "$LATEST" ]]; then
        name="$(find "$LATEST" -mindepth 1 -maxdepth 1 -type d -name "$pattern" -printf '%T@ %f
' 2>/dev/null | sort -n | tail -n 1 | cut -d' ' -f2-)"
        [[ -z "$name" ]] || printf 'https://reports.secret-studio.ru/latest/%s/
' "$name"
    fi
}
LOCAL_M07_PLAN_URL="$(latest_url '*_local_architecture_plan_vm101_autonomous_hmn_recovery*')"
GLOBAL_PROJECT_PLAN_URL="$(latest_url '*_global_project_plan_wg_paid*')"
ACCESS_MAP_URL="$(latest_url '*_access_map_*')"
XS_MAP_URL="$(latest_url '*_xs_map_*')"
[[ -n "$XS_MAP_URL" ]] || XS_MAP_URL="$ACCESS_MAP_URL"
VM100_PUBLIC_URL="$(latest_url '*_vm100_git_source_*')"
VM101_PUBLIC_URL="$(latest_url '*_vm101_git_source_*')"
VM121_PUBLIC_URL="$(latest_url '*_vm121_git_source_*')"
set -e

echo 'RESULT=PASS_R20Q_PREP_VM100_STORAGE_TOOLSET_CHECKPOINT'
echo "STEP_REPORT_URL=$STEP_REPORT_URL"
echo "LOCAL_M07_PLAN_URL=$LOCAL_M07_PLAN_URL"
echo "GLOBAL_PROJECT_PLAN_URL=$GLOBAL_PROJECT_PLAN_URL"
echo "ACCESS_MAP_URL=$ACCESS_MAP_URL"
echo "XS_MAP_URL=$XS_MAP_URL"
echo "VM100_PUBLIC_URL=$VM100_PUBLIC_URL"
echo "VM101_PUBLIC_URL=$VM101_PUBLIC_URL"
echo "VM121_PUBLIC_URL=$VM121_PUBLIC_URL"
echo 'VM100_GIT_COMMIT=1958200ccc1bdb11f588d7c36ae6b5c12e84040d'
echo 'VM100_GIT_TREE=2083d05bce645135c4735346a78922771de7f433'
echo 'VM100_GIT_FILE_COUNT=22'
echo 'VM100_SOURCE_CHANGED=false'
echo 'VM100_PUSH_PERFORMED=false'
echo 'RUNTIME_IMPACT=false'
echo 'CORE_CHANGE_REPEATED=false'
echo 'NEXT_STEP=R20Q-A_VM100_TOPOLOGY_RECEIVER_FOUNDATION'
