#!/usr/bin/env bash

set -euo pipefail

REPO_ROOT="$(cd "$(dirname "$0")/../.." && pwd)"
FIXTURE_ROOT="$REPO_ROOT/tests/conformance/issue-tracker-runtime/app-packs-fixture"
FIXTURE_MODULE="github.com/nexuscrm/app-packs-conformance/issue-tracker"
APP_SOURCE_LOCK="$REPO_ROOT/backend/distributions/appsource/source.go"
OFFICIAL_APP_PACKS_ROOT="${NEXUSCRM_OFFICIAL_APP_PACKS_ROOT:?NEXUSCRM_OFFICIAL_APP_PACKS_ROOT is required}"
DISTRIBUTION_APP_PACKS_ROOT="$REPO_ROOT/nexuscrm-app-packs"
API_HOST_ROOT="${NEXUSCRM_API_HOST_ROOT:-}"
API_HOST_MODULE="github.com/pingcap-inc/nexuscrm-api-host"
SNAPSHOT_MANIFEST="$REPO_ROOT/tests/conformance/issue-tracker-runtime/app-packs-fixture.snapshot.sha256"

PRIVATE_MODULES="github.com/pingcap-inc/nexuscrm-contract,github.com/pingcap-inc/nexuscrm-api-host"
export GOPRIVATE="${GOPRIVATE:+$GOPRIVATE,}$PRIVATE_MODULES"
export GONOSUMDB="${GONOSUMDB:+$GONOSUMDB,}$PRIVATE_MODULES"

fail() {
  echo "$*" >&2
  exit 2
}

source_revision() {
  local name=$1
  local revision
  revision="$(sed -n "s/^const ${name} = \"\\([^\"]*\\)\"$/\\1/p" "$APP_SOURCE_LOCK")"
  [[ "$revision" =~ ^[0-9a-f]{40}$ ]] || fail "runtime L1 walking slice cannot derive ${name} from ${APP_SOURCE_LOCK}"
  printf '%s\n' "$revision"
}

resolved_dir() {
  local path=$1
  [[ -d "$path" ]] || fail "runtime L1 walking slice source directory is missing: $path"
  (cd "$path" && pwd -P)
}

require_git_revision() {
  local name=$1
  local root=$2
  local expected=$3
  local actual
  actual="$(git -C "$root" rev-parse HEAD 2>/dev/null)" || fail "runtime L1 walking slice ${name} is not a Git checkout: $root"
  [[ "$actual" == "$expected" ]] || fail "runtime L1 walking slice ${name} revision $actual does not match source lock $expected"
}

official_app_packs_revision="$(source_revision OfficialAppPacksSourceRevision)"
official_app_packs_resolved="$(resolved_dir "$OFFICIAL_APP_PACKS_ROOT")"
distribution_app_packs_resolved="$(resolved_dir "$DISTRIBUTION_APP_PACKS_ROOT")"
[[ "$official_app_packs_resolved" == "$distribution_app_packs_resolved" ]] || fail "runtime L1 walking slice official app-packs root must be the distribution Go replacement: $DISTRIBUTION_APP_PACKS_ROOT"
require_git_revision "official app-packs checkout" "$official_app_packs_resolved" "$official_app_packs_revision"
for module in dialects/dialect-sf-crm/go.mod dialects/dialect-sf-crm-soql/go.mod sfcrm/scim/go.mod sfcrm/wire/go.mod; do
  [[ -f "$official_app_packs_resolved/$module" ]] || fail "runtime L1 walking slice official app-packs checkout lacks $module"
done

if [[ -z "${TIDB_HOST:-}" ]]; then
  fail "runtime L1 walking slice requires the declared TiDB environment"
fi

"$REPO_ROOT/scripts/ci/verify-sha256-manifest.sh" "$SNAPSHOT_MANIFEST"
if [[ -n "$API_HOST_ROOT" && ! -f "$API_HOST_ROOT/go.mod" ]]; then
  fail "runtime L1 walking slice api-host override has no Go module: $API_HOST_ROOT"
fi

modfile="$(mktemp "$REPO_ROOT/backend/distributions/.runtime-l1-integration.XXXXXX.mod")"
sumfile="${modfile%.mod}.sum"
cleanup() {
  rm -f "$modfile" "$sumfile"
}
trap cleanup EXIT

cp "$REPO_ROOT/backend/distributions/go.mod" "$modfile"
cp "$REPO_ROOT/backend/distributions/go.sum" "$sumfile"
(
  cd "$REPO_ROOT/backend/distributions"
  go mod edit -modfile="$modfile" \
    -require="$FIXTURE_MODULE@v0.0.0" \
    -replace="$FIXTURE_MODULE=$FIXTURE_ROOT"
  if [[ -n "$API_HOST_ROOT" ]]; then
    go mod edit -modfile="$modfile" -replace="$API_HOST_MODULE=$API_HOST_ROOT"
  fi
  JWT_SECRET="${JWT_SECRET:-runtime-l1-walking-slice-test-only-signing-key}" \
    GOWORK=off GOFLAGS="-modfile=$modfile -mod=mod" go test -tags 'crm runtime_l1_integration' ./crm \
    -run '^(TestCRMAssignmentPolicyUserProfileReadSerializesConcurrentRename|TestNeutralRecordsConsumersCrossSeparateRuntimeProcess|TestRecordsRuntimeChildProcess|TestD2AIssueQueryConsumerCrossesSeparateRuntimeProcess|TestD2AQueryRuntimeChildProcess|TestP4ChildEnvironmentReplacesOwnedKeys)$' -count=1 -v
)

echo "L0 Runtime clients crossed a separate process using the source-locked conformance fixture"
