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

REPO_ROOT="${SANPO_DOCS_REPO:-/home/ubuntu/sanporobot/robot}"
REMOTE="${SANPO_DOCS_REMOTE:-origin}"
SOURCE_BRANCH="${SANPO_DOCS_SOURCE_BRANCH:-unified-main}"
TARGET_BRANCH="main"
LOCK_FILE="${SANPO_DOCS_LOCK:-/tmp/sanpo-docs-publish.lock}"
V4_MODE="preserve"
V6_MODE="preserve"

while [[ "$#" -gt 0 ]]; do
  case "$1" in
    --update-v4)
      V4_MODE="rebuild"
      ;;
    --update-v6)
      V6_MODE="rebuild"
      ;;
    *)
      echo "Usage: $0 [--update-v4] [--update-v6]" >&2
      exit 2
      ;;
  esac
  shift
done

if [[ ! -d "${REPO_ROOT}/.git" ]]; then
  echo "Git repository not found: ${REPO_ROOT}" >&2
  exit 1
fi

exec 9>"${LOCK_FILE}"
if ! flock -n 9; then
  echo "Another documentation deployment is already running." >&2
  exit 1
fi

if [[ "$(git -C "${REPO_ROOT}" branch --show-current)" != "${TARGET_BRANCH}" ]]; then
  echo "Server repository must be on ${TARGET_BRANCH}." >&2
  exit 1
fi

if [[ -n "$(git -C "${REPO_ROOT}" status --porcelain --untracked-files=no)" ]]; then
  echo "Tracked changes exist in ${REPO_ROOT}; release aborted." >&2
  exit 1
fi

echo "Fetching ${REMOTE}/${SOURCE_BRANCH} and ${REMOTE}/${TARGET_BRANCH} ..."
git -C "${REPO_ROOT}" fetch --prune "${REMOTE}" \
  "${SOURCE_BRANCH}" "${TARGET_BRANCH}"

SOURCE_REF="refs/remotes/${REMOTE}/${SOURCE_BRANCH}"
TARGET_REF="refs/remotes/${REMOTE}/${TARGET_BRANCH}"
SOURCE_SHA="$(git -C "${REPO_ROOT}" rev-parse "${SOURCE_REF}")"
TARGET_SHA="$(git -C "${REPO_ROOT}" rev-parse "${TARGET_REF}")"
LOCAL_SHA="$(git -C "${REPO_ROOT}" rev-parse HEAD)"

if ! git -C "${REPO_ROOT}" merge-base --is-ancestor \
  "${TARGET_SHA}" "${SOURCE_SHA}"; then
  echo "${REMOTE}/${TARGET_BRANCH} cannot be fast-forwarded to ${REMOTE}/${SOURCE_BRANCH}." >&2
  echo "Resolve the branch divergence manually; no push or deployment was performed." >&2
  exit 1
fi

if ! git -C "${REPO_ROOT}" merge-base --is-ancestor \
  "${LOCAL_SHA}" "${SOURCE_SHA}"; then
  echo "Local ${TARGET_BRANCH} cannot be fast-forwarded to ${REMOTE}/${SOURCE_BRANCH}." >&2
  echo "Resolve the server checkout manually; no push or deployment was performed." >&2
  exit 1
fi

if ! git -C "${REPO_ROOT}" cat-file -e \
  "${SOURCE_SHA}:scripts/docs/publish-server.sh"; then
  echo "Publishing script is missing from ${REMOTE}/${SOURCE_BRANCH}." >&2
  exit 1
fi

git -C "${REPO_ROOT}" merge --ff-only "${SOURCE_SHA}"

if [[ "${SOURCE_SHA}" != "${TARGET_SHA}" ]]; then
  echo "Fast-forwarding ${REMOTE}/${TARGET_BRANCH} to ${SOURCE_SHA:0:12} ..."
  git -C "${REPO_ROOT}" push "${REMOTE}" \
    "HEAD:refs/heads/${TARGET_BRANCH}"
else
  echo "${REMOTE}/${TARGET_BRANCH} is already synchronized."
fi

echo "Building and publishing ${TARGET_BRANCH}@${SOURCE_SHA:0:12} ..."
SANPO_DOCS_LOCK_HELD=1 \
SANPO_DOCS_V4_MODE="${V4_MODE}" \
SANPO_DOCS_V6_MODE="${V6_MODE}" \
  bash "${REPO_ROOT}/scripts/docs/publish-server.sh" "${TARGET_BRANCH}"

echo "Release completed: ${SOURCE_BRANCH} -> ${TARGET_BRANCH} -> production (V4: ${V4_MODE}, V6: ${V6_MODE}, V8: rebuild)"