#!/usr/bin/env sh

set -eu

ROOT_DIR=$(CDPATH= cd -- "$(dirname -- "$0")/../.." && pwd)
MAKEFILE="$ROOT_DIR/Makefile"
INSTALLER_DIR="$ROOT_DIR/releases/installer"
PACKAGE_TASK="$ROOT_DIR/.it-runner/tasks/package-go-backend-all/task.yaml"
PUBLIC_BASE_URL='http://fw.koolcenter.com/binary/geili/agentflow'

assert_contains() {
  needle=$1
  haystack_file=$2
  if ! grep -F "$needle" "$haystack_file" >/dev/null 2>&1; then
    echo "expected to find '$needle' in $haystack_file" >&2
    exit 1
  fi
}

assert_not_contains() {
  needle=$1
  haystack_file=$2
  if grep -F "$needle" "$haystack_file" >/dev/null 2>&1; then
    echo "expected not to find '$needle' in $haystack_file" >&2
    exit 1
  fi
}

assert_contains "RELEASE_BASE_URL ?= $PUBLIC_BASE_URL/build" "$MAKEFILE"
assert_contains 'publish_build_dir="$(RELEASES_PUBLISH_DIR)/build"' "$MAKEFILE"
assert_contains 'publish_installer_dir="$(RELEASES_PUBLISH_DIR)/installer"' "$MAKEFILE"
assert_contains 'install -m 0644 "$(BUILD_DIR)/version.json" "$${publish_build_dir}/agentflow-version"' "$MAKEFILE"
assert_contains '$(MAKE) publish-go-backend-installers' "$MAKEFILE"
assert_contains '$(MAKE) publish-go-backend-local-releases' "$MAKEFILE"
assert_not_contains 'publish_root="$(RELEASES_PUBLISH_DIR)/$(notdir $(RELEASES_DIR))"' "$MAKEFILE"

assert_contains "BASE_URL=\"\${AGENTFLOW_INSTALLER_BASE_URL:-$PUBLIC_BASE_URL/installer}\"" "$INSTALLER_DIR/getagentflow.sh"
assert_contains "VERSION_JSON_URL=\"\${AGENTFLOW_VERSION_JSON_URL:-$PUBLIC_BASE_URL/build/agentflow-version}\"" "$INSTALLER_DIR/agentflow-linux.sh"
assert_contains "VERSION_JSON_URL=\"\${AGENTFLOW_VERSION_JSON_URL:-$PUBLIC_BASE_URL/build/agentflow-version}\"" "$INSTALLER_DIR/agentflow-macos.sh"
assert_contains "VERSION_JSON_URL='$PUBLIC_BASE_URL/build/agentflow-version'" "$INSTALLER_DIR/install-agentflow.sh"
assert_contains "[string]\$VersionJsonUrl = '$PUBLIC_BASE_URL/build/agentflow-version'," "$INSTALLER_DIR/install-agentflow.ps1"
assert_contains "RELEASE_BASE_URL=$PUBLIC_BASE_URL/build" "$PACKAGE_TASK"
assert_contains "RELEASES_PUBLISH_DIR=/projects/workspace-carseason/geililab/agentflow/www" "$PACKAGE_TASK"
assert_contains 'script -q -e -c "scp -r -P 2222 ./ root@fw.koolcenter.com:/data/wwwroot/fw.koolcenter.com/public_html/binary/geili/agentflow/" /dev/null' "$PACKAGE_TASK"
assert_contains 'find "$release_root" -type f -exec chmod 644 {} +' "$PACKAGE_TASK"
assert_contains 'find "$release_root/build" -maxdepth 1 -type f -name "agentflow-*" ! -name "agentflow-version" -exec chmod 755 {} +' "$PACKAGE_TASK"
assert_contains 'find "$release_root/installer" -maxdepth 1 -type f -name "*.sh" -exec chmod 755 {} +' "$PACKAGE_TASK"

assert_file_mode() {
  expected=$1
  path=$2
  actual=$(stat -c '%a' "$path" 2>/dev/null || stat -f '%Lp' "$path")
  if [ "$actual" != "$expected" ]; then
    echo "expected $path mode $expected but got $actual" >&2
    exit 1
  fi
}

tmpdir=$(mktemp -d)
trap 'rm -rf "$tmpdir"' EXIT INT TERM
build_dir="$tmpdir/build"
publish_dir="$tmpdir/publish"
mkdir -p "$build_dir" "$publish_dir"
printf 'dummy\n' >"$build_dir/agentflow-linux-amd64"
bash "$ROOT_DIR/go-backend/scripts/write-version-json.sh" "$build_dir" test "$PUBLIC_BASE_URL/build"
assert_file_mode 644 "$build_dir/version.json"
make -C "$ROOT_DIR" publish-go-backend-release-target \
  TARGET_OS=linux \
  TARGET_ARCH=amd64 \
  BUILD_DIR="$build_dir" \
  RELEASES_PUBLISH_DIR="$publish_dir" >/dev/null
make -C "$ROOT_DIR" publish-go-backend-installers \
  RELEASES_PUBLISH_DIR="$publish_dir" >/dev/null
make -C "$ROOT_DIR" publish-go-backend-local-releases \
  BUILD_DIR="$build_dir" \
  RELEASES_PUBLISH_DIR="$publish_dir" >/dev/null
assert_contains 'http://fw.koolcenter.com/binary/geili/agentflow/installer' "$publish_dir/installer/getagentflow.sh"
assert_contains 'http://192.168.9.3:48080/releases/installer' "$publish_dir/releases/installer/getagentflow.sh"
assert_contains 'http://192.168.9.3:48080/releases/build/agentflow-version' "$publish_dir/releases/installer/agentflow-linux.sh"
assert_contains 'http://192.168.9.3:48080/releases/build/agentflow-linux-amd64' "$publish_dir/releases/build/agentflow-version"
assert_not_contains 'http://fw.koolcenter.com/binary/geili/agentflow/build/agentflow-linux-amd64' "$publish_dir/releases/build/agentflow-version"
assert_file_mode 644 "$publish_dir/releases/build/agentflow-version"
rm -rf "$tmpdir"
trap - EXIT INT TERM

echo "release layout tests passed"
