#!/usr/bin/env bash

set -euo pipefail

REPO_ROOT="$(cd "$(dirname "$0")/../.." && pwd)"
REVISION_FILE="$REPO_ROOT/tests/conformance/issue-tracker-runtime/app-packs-revision"
SNAPSHOT_MANIFEST="$REPO_ROOT/tests/conformance/issue-tracker-runtime/app-packs-fixture.snapshot.sha256"
FIXTURE_ROOT="$REPO_ROOT/tests/conformance/issue-tracker-runtime/app-packs-fixture"
FIXTURE_MODULE="github.com/nexuscrm/app-packs-conformance/issue-tracker"
CONTRACT_MODULE="github.com/pingcap-inc/nexuscrm-contract"
SHARED_MODULE="github.com/nexuscrm/shared"

export GOPRIVATE="${GOPRIVATE:+$GOPRIVATE,}$CONTRACT_MODULE"
export GONOSUMDB="${GONOSUMDB:+$GONOSUMDB,}$CONTRACT_MODULE"

EXPECTED_REVISION="$(tr -d '[:space:]' < "$REVISION_FILE")"
if [[ ! "$EXPECTED_REVISION" =~ ^[0-9a-f]{40}$ ]]; then
  echo "invalid issue-tracker conformance app-packs revision: $EXPECTED_REVISION" >&2
  exit 2
fi

if [[ ! -d "$FIXTURE_ROOT" ]]; then
  echo "reviewed issue-tracker conformance snapshot is missing: $FIXTURE_ROOT" >&2
  exit 2
fi
(cd "$REPO_ROOT" && scripts/ci/verify-sha256-manifest.sh "$SNAPSHOT_MANIFEST")

records_mod="$(mktemp "$REPO_ROOT/nexuscrm-records/.issue-tracker-conformance.XXXXXX.mod")"
records_sum="${records_mod%.mod}.sum"
fixture_mod="$(mktemp "$FIXTURE_ROOT/.nexuscrm-runtime.XXXXXX.mod")"
fixture_sum="${fixture_mod%.mod}.sum"
cleanup() {
  rm -f "$records_mod" "$records_sum" "$fixture_mod" "$fixture_sum"
}
trap cleanup EXIT

cp "$REPO_ROOT/nexuscrm-records/go.mod" "$records_mod"
if [[ -f "$REPO_ROOT/nexuscrm-records/go.sum" ]]; then
  cp "$REPO_ROOT/nexuscrm-records/go.sum" "$records_sum"
fi
(
  cd "$REPO_ROOT/nexuscrm-records"
  go mod edit -modfile="$records_mod" \
    -require="$FIXTURE_MODULE@v0.0.0" \
    -replace="$FIXTURE_MODULE=$FIXTURE_ROOT"
  GOWORK=off GOFLAGS="-modfile=$records_mod -mod=mod" go test -tags issue_tracker_conformance . \
    -run '^TestIssueTracker(RecordAccess)?Conformance_RealRuntimeRecordsAdapter$' -count=1 -v
)

cp "$FIXTURE_ROOT/go.mod" "$fixture_mod"
if [[ -f "$FIXTURE_ROOT/go.sum" ]]; then
  cp "$FIXTURE_ROOT/go.sum" "$fixture_sum"
fi
(
  cd "$FIXTURE_ROOT"
  go mod edit -modfile="$fixture_mod" \
    -dropreplace="$CONTRACT_MODULE" \
    -replace="$SHARED_MODULE=$REPO_ROOT/shared"
  export GOWORK=off
  export GOFLAGS="-modfile=$fixture_mod -mod=mod"
  go test ./... -count=1

  while IFS= read -r dependency; do
    [[ -z "$dependency" ]] && continue
    case "$dependency" in
      "$FIXTURE_MODULE"|"$FIXTURE_MODULE"/*|"$FIXTURE_MODULE".test|"$FIXTURE_MODULE ["*|github.com/nexuscrm/shared|github.com/nexuscrm/shared/*|"$CONTRACT_MODULE"|"$CONTRACT_MODULE"/*) ;;
      *) echo "fixture test dependency closure contains forbidden dependency: $dependency" >&2; exit 1 ;;
    esac
  done < <(go list -deps -test -f '{{if not .Standard}}{{.ImportPath}}{{end}}' ./... | sort -u)
)

echo "issue-tracker Runtime conformance passed with reviewed app-packs snapshot $EXPECTED_REVISION"
