#!/usr/bin/env bash
set -euo pipefail

if [[ "${SOPIFY_DISABLE_RELEASE_HOOK:-0}" == "1" ]]; then
  exit 0
fi

MESSAGE_FILE="${1:-}"
if [[ -z "$MESSAGE_FILE" || ! -f "$MESSAGE_FILE" ]]; then
  exit 0
fi

ROOT_DIR="$(git rev-parse --show-toplevel 2>/dev/null || true)"
if [[ -z "$ROOT_DIR" || ! -d "$ROOT_DIR" ]]; then
  exit 0
fi

STATE_FILE="$(git -C "$ROOT_DIR" rev-parse --git-path .sopify-release-sync-state)"
cleanup() {
  rm -f "$STATE_FILE"
}
trap cleanup EXIT

upsert_trailer() {
  local file="$1"
  local key="$2"
  local value="$3"
  local tmp_file

  tmp_file="$(mktemp "${TMPDIR:-/tmp}/sopify-commit-msg.XXXXXX")"
  if grep -Eiq "^${key}:\s*" "$file"; then
    awk -v key="$key" -v value="$value" '
      BEGIN { updated=0 }
      {
        if ($0 ~ ("^" key ":")) {
          print key ": " value
          updated=1
        } else {
          print
        }
      }
      END {
        if (!updated) {
          exit 2
        }
      }
    ' "$file" >"$tmp_file" || {
      rm -f "$tmp_file"
      echo "[sopify-release-hook] Failed to update trailer ${key} in $file" >&2
      exit 1
    }
    mv "$tmp_file" "$file"
    return 0
  fi

  printf '\n%s: %s\n' "$key" "$value" >>"$file"
}

if [[ -f "$STATE_FILE" ]]; then
  RELEASE_VERSION=""
  RELEASE_DATE=""

  while IFS='=' read -r key value; do
    case "$key" in
      RELEASE_VERSION)
        RELEASE_VERSION="$value"
        ;;
      RELEASE_DATE)
        RELEASE_DATE="$value"
        ;;
    esac
  done <"$STATE_FILE"

  if [[ -z "$RELEASE_VERSION" || -z "$RELEASE_DATE" ]]; then
    echo "[sopify-release-hook] Invalid release state file: $STATE_FILE" >&2
    exit 1
  fi

  upsert_trailer "$MESSAGE_FILE" "Release-Sync" "yes"
  upsert_trailer "$MESSAGE_FILE" "Release-Version" "$RELEASE_VERSION"
  upsert_trailer "$MESSAGE_FILE" "Release-Date" "$RELEASE_DATE"
fi

CHECKPOINT_SCRIPT="$ROOT_DIR/scripts/check-context-checkpoints.py"
if [[ -f "$CHECKPOINT_SCRIPT" ]]; then
  python3 "$CHECKPOINT_SCRIPT" commit-msg --root "$ROOT_DIR" --message-file "$MESSAGE_FILE"
fi

trap - EXIT
cleanup
