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

ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"

php "${ROOT_DIR}/scripts/release/validate-release.php" --base-ref="${SVN_BASE_REF:-HEAD^1}" --source-ref="${SVN_SOURCE_REF:-HEAD}" >/dev/null
VERSION="$(php "${ROOT_DIR}/scripts/release/read-version.php")"

SVN_REPOSITORY_URL="${SVN_REPOSITORY_URL:-}"
SVN_USERNAME="${SVN_USERNAME:-}"
SVN_PASSWORD="${SVN_PASSWORD:-}"
SVN_COMMIT_MESSAGE="${SVN_COMMIT_MESSAGE:-${GITHUB_EVENT_HEAD_COMMIT_MESSAGE:-Release ${VERSION}}}"

if [[ -z "${SVN_REPOSITORY_URL}" || -z "${SVN_USERNAME}" || -z "${SVN_PASSWORD}" ]]; then
  echo "SVN credentials and repository URL are required." >&2
  exit 1
fi

WORKDIR="$(mktemp -d)"
cleanup() {
  rm -rf "${WORKDIR}"
}
trap cleanup EXIT

svn checkout \
  --non-interactive \
  --trust-server-cert \
  --username "${SVN_USERNAME}" \
  --password "${SVN_PASSWORD}" \
  "${SVN_REPOSITORY_URL}" \
  "${WORKDIR}" >/dev/null

if [[ ! -d "${WORKDIR}/trunk" ]]; then
  mkdir -p "${WORKDIR}/trunk"
fi
mkdir -p "${WORKDIR}/tags"

rsync -av --delete \
  --exclude='.*' \
  --exclude='.git' \
  --exclude='.git/*' \
  --exclude='.svn' \
  --exclude='.svn/***' \
  --exclude='tests' \
  --exclude='tests/***' \
  --exclude='phpunit.xml.dist' \
  --exclude='*.xml' \
  --exclude='*.xml*' \
  --exclude='vendor' \
  --exclude='vendor/***' \
  --exclude='node_modules' \
  --exclude='node_modules/***' \
  "${ROOT_DIR}/" \
  "${WORKDIR}/trunk/" >/dev/null

if [[ -e "${WORKDIR}/tags/${VERSION}" ]]; then
  echo "Tag ${VERSION} already exists in the SVN repository." >&2
  exit 1
fi

(
  cd "${WORKDIR}"
  svn copy trunk "tags/${VERSION}" >/dev/null
)

(
  cd "${WORKDIR}"
  while IFS= read -r missing_path; do
    svn delete --force "${missing_path}"
  done < <(svn status | awk '/^!/ {print $2}')

  svn add --force trunk tags >/dev/null
  svn status
  svn commit --username "${SVN_USERNAME}" --password "${SVN_PASSWORD}" --non-interactive --trust-server-cert -m "${SVN_COMMIT_MESSAGE}"
)
