#!/usr/bin/env bash
set -Eeuo pipefail
umask 077
BASE="${ROUTER_OPS_BASE:-/opt/router-ops}"
ROOT="${BUNDLE_ROOT:?}"
RUN_DIR="${ROUTER_DETACHED_RUN_DIR:?}"
CHILD_RESULT="${ROUTER_DETACHED_CHILD_RESULT:?}"
INCOMING="${ROUTER_STEP_INCOMING:-/home/ops/incoming}"
SELFTEST="${ROUTER_EXACT_WORKER_SELFTEST:-false}"
STEP='STEP_050M07R20QX_R02_VM121_MULTI_PROTOCOL_PROJECT_SOURCES_POLICY_FIX'
REVISION='R02'
WORK="$RUN_DIR/work"; REPORT="$RUN_DIR/report"; CURRENT="$RUN_DIR/workflow-current.txt"; EVENTS="$RUN_DIR/workflow-events.tsv"
mkdir -p "$WORK" "$REPORT" "$INCOMING"; chmod 700 "$WORK" "$REPORT"
source "$BASE/lib/router-step-workflow.sh"
router_step_workflow_init "$CURRENT" "$EVENTS" verify global_plan project_source report_publish archive
GLOBAL_PLAN_URL=not_published
PROJECT_SOURCE_POST_URL=not_published
STEP_REPORT_URL=not_published
LATEST_ARCHIVE=not_created
LATEST_ARCHIVE_SHA256=unknown
STOP_HANDLED=false
write_child() { local result="$1" rc="$2" tmp="${CHILD_RESULT}.tmp.$$"; { echo "RESULT=$result"; echo "WORKER_RC=$rc"; echo 'CORE_CHANGE_COMPLETE=false'; echo 'RUNTIME_IMPACT=false'; echo 'DIAGNOSTICS_REPEATED=false'; echo "GLOBAL_PROJECT_PLAN_URL=$GLOBAL_PLAN_URL"; echo "PROJECT_SOURCE_POST_URL=$PROJECT_SOURCE_POST_URL"; echo "STEP_REPORT_URL=$STEP_REPORT_URL"; echo "LATEST_ARCHIVE=$LATEST_ARCHIVE"; echo "LATEST_ARCHIVE_SHA256=$LATEST_ARCHIVE_SHA256"; } >"$tmp"; chmod 600 "$tmp"; mv -f "$tmp" "$CHILD_RESULT"; }
archive_latest() { local log="$RUN_DIR/archive-latest.log"; router_step_archive_latest_python "$BASE" "$INCOMING" "$(date -u +%Y%m%d-%H%M%S)" | tee "$log"; LATEST_ARCHIVE="$(awk -F= '$1=="LATEST_ARCHIVE"{print substr($0,index($0,"=")+1)}' "$log" | tail -n1)"; LATEST_ARCHIVE_SHA256="$(awk -F= '$1=="LATEST_ARCHIVE_SHA256"{print $2}' "$log" | tail -n1)"; }
stop_handler() { local rc="$1" line="$2" cmd="$3"; trap - ERR; [[ "$STOP_HANDLED" == false ]] || exit "$rc"; STOP_HANDLED=true; set +e; echo 'RESULT=STOP_R20QX_VM121_MULTI_PROTOCOL_PROJECT_SOURCES'; echo "STOP_PHASE=${CURRENT_PHASE:-unknown}"; echo "STOP_LINE=$line"; echo "STOP_RC=$rc"; printf 'STOP_COMMAND=%q
' "$cmd"; echo 'CORE_CHANGE_COMPLETE=false'; echo 'RUNTIME_IMPACT=false'; archive_latest >/dev/null 2>&1 || true; write_child STOP_R20QX_VM121_MULTI_PROTOCOL_PROJECT_SOURCES "$rc"; exit "$rc"; }
trap 'rc=$?; stop_handler "$rc" "$LINENO" "$BASH_COMMAND"' ERR

CURRENT_PHASE=verify; router_step_phase_begin verify
(cd "$ROOT" && sha256sum -c manifest.sha256)
[[ "$(sha256sum "$ROOT/payload/r20qx-project-sources-publication-inputs.tar.gz" | awk '{print $1}')" == '02801518b43dc97c1e442a10f187b7967a37c008a389d0476e37a0d763851fc4' ]]
tar -tzf "$ROOT/payload/r20qx-project-sources-publication-inputs.tar.gz" >/dev/null
grep -Fqx 'VM121_USER_COUNT=32' "$ROOT/reference/source-evidence.env"
grep -Fqx 'VM121_JOB_COUNT=55' "$ROOT/reference/source-evidence.env"
grep -Fqx 'VM121_EMAIL_NULL_COUNT=9' "$ROOT/reference/source-evidence.env"
router_step_phase_complete verify retained_audit_and_database_facts_verified

rm -rf "$WORK/input" "$WORK/global" "$WORK/project"; mkdir -p "$WORK/input" "$WORK/global" "$WORK/project"
tar -xzf "$ROOT/payload/r20qx-project-sources-publication-inputs.tar.gz" -C "$WORK/input"
cp "$WORK/input/global-plan/"* "$WORK/global/"

CURRENT_PHASE=global_plan; router_step_phase_begin global_plan
if [[ "$SELFTEST" == true ]]; then
  mkdir -p "${ROUTER_PUBLIC_ROOT:?}/latest/r20qx-global-plan-selftest"; cp "$WORK/global/"* "${ROUTER_PUBLIC_ROOT}/latest/r20qx-global-plan-selftest/"; GLOBAL_PLAN_URL='selftest://r20qx-global-plan/'
else
  "$BASE/bin/router-publish-report" global_project_plan_wg_paid_after_r20qw "$WORK/global/global-plan.md" "$WORK/global/global-plan.json" "$WORK/global/reporting-contract.md" | tee "$RUN_DIR/global-plan.env"
  GLOBAL_PLAN_URL="$(awk -F= '$1=="GLOBAL_PROJECT_PLAN_URL"{print substr($0,index($0,"=")+1)}' "$RUN_DIR/global-plan.env" | tail -n1)"
fi
[[ -n "$GLOBAL_PLAN_URL" && "$GLOBAL_PLAN_URL" != not_published ]]
router_step_phase_complete global_plan current_global_plan_published

cp "$WORK/input/project-sources/"* "$WORK/project/"
for file in "$WORK/project/"*.md; do sed -i "s#@@GLOBAL_PLAN_URL@@#$GLOBAL_PLAN_URL#g" "$file"; done
CURRENT_PHASE=project_source; router_step_phase_begin project_source
mapfile -t ps_files < <(find "$WORK/project" -maxdepth 1 -type f -printf '%p
' | LC_ALL=C sort)
if [[ "$SELFTEST" == true ]]; then
  mkdir -p "${ROUTER_PUBLIC_ROOT:?}/latest/r20qx-project-source-selftest"; cp "${ps_files[@]}" "${ROUTER_PUBLIC_ROOT}/latest/r20qx-project-source-selftest/"; PROJECT_SOURCE_POST_URL='selftest://r20qx-project-source/'
else
  "$BASE/bin/router-publish-report" project_source_post_r20qx_vm121_multi_protocol_architecture "${ps_files[@]}" | tee "$RUN_DIR/project-source.env"
  PROJECT_SOURCE_POST_URL="$(awk -F= '$1=="PROJECT_SOURCE_POST_URL"{print substr($0,index($0,"=")+1)}' "$RUN_DIR/project-source.env" | tail -n1)"
fi
[[ -n "$PROJECT_SOURCE_POST_URL" && "$PROJECT_SOURCE_POST_URL" != not_published ]]
router_step_phase_complete project_source canonical_project_sources_published

cat >"$REPORT/report.txt" <<EOF
RESULT=PASS_R20QX_VM121_MULTI_PROTOCOL_PROJECT_SOURCES
REVISION=R02
CLASSIFICATION=DOCUMENTATION_ONLY
CORE_CHANGE_COMPLETE=false
RUNTIME_IMPACT=false
DIAGNOSTICS_REPEATED=false
MACHINE_GIT_CHANGED=false
GLOBAL_PROJECT_PLAN_URL=$GLOBAL_PLAN_URL
PROJECT_SOURCE_POST_URL=$PROJECT_SOURCE_POST_URL
R20QW_AUDIT_URL=https://reports.secret-studio.ru/latest/20260802-102738_step050m07r20qw_r02_readonly_audit_publication_continuation/
VM100_PUBLIC_URL=https://reports.secret-studio.ru/latest/20260801-190522_vm100_git_source_a8b7337674b9/
VM101_PUBLIC_URL=https://reports.secret-studio.ru/latest/20260801-095331_vm101_git_source_ac678d1b3164/
VM121_PUBLIC_URL=https://reports.secret-studio.ru/latest/20260713-182700_vm121_git_source_93e0e5a31f09/
ACCESS_MAP_URL=https://reports.secret-studio.ru/latest/20260715-210236_access_map_canonical_current/
LOCAL_PLAN_URL=https://reports.secret-studio.ru/latest/20260719-080444_local_architecture_plan_vm101_autonomous_hmn_recovery_r19/
NEXT_STEP=P1.1_VM100_COMMON_PEER_LIFECYCLE_DESIGN_AND_FIXTURES
EOF
cp "$REPORT/report.txt" "$REPORT/verify.txt"
printf 'No runtime mutation. Rollback is not applicable.
' >"$REPORT/rollback.txt"
cp "$ROOT/scripts/run-step.sh" "$REPORT/executed-step.sh"
cp "$ROOT/release-info.json" "$REPORT/release-info.json"
cp "$ROOT/manifest.sha256" "$REPORT/bundle-manifest.sha256"
cp "$CURRENT" "$REPORT/workflow-current.txt"; cp "$EVENTS" "$REPORT/workflow-events.tsv"

CURRENT_PHASE=report_publish; router_step_phase_begin report_publish
mapfile -t report_files < <(find "$REPORT" -maxdepth 1 -type f -printf '%p
' | LC_ALL=C sort)
if [[ "$SELFTEST" == true ]]; then
  mkdir -p "${ROUTER_PUBLIC_ROOT:?}/latest/r20qx-step-selftest"; cp "${report_files[@]}" "${ROUTER_PUBLIC_ROOT}/latest/r20qx-step-selftest/"; STEP_REPORT_URL='selftest://r20qx-step/'
else
  "$BASE/bin/router-publish-report" step050m07r20qx_r02_vm121_multi_protocol_project_sources_policy_fix "${report_files[@]}" | tee "$RUN_DIR/step-report.env"
  STEP_REPORT_URL="$(awk -F= '$1=="STEP_REPORT_URL"{print substr($0,index($0,"=")+1)}' "$RUN_DIR/step-report.env" | tail -n1)"
fi
router_step_phase_complete report_publish step_report_published

CURRENT_PHASE=archive; router_step_phase_begin archive
archive_latest
router_step_phase_complete archive latest_archive_created
router_step_workflow_mark_complete
trap - ERR
write_child PASS_R20QX_VM121_MULTI_PROTOCOL_PROJECT_SOURCES 0
cat "$REPORT/report.txt"
echo "STEP_REPORT_URL=$STEP_REPORT_URL"
echo "LATEST_ARCHIVE=$LATEST_ARCHIVE"
echo "LATEST_ARCHIVE_SHA256=$LATEST_ARCHIVE_SHA256"
