#!/usr/bin/env bash
# Initial SVN checkout for production (when trunk is not yet a working copy).
#
# Preserves node/.env from an existing tree if present.
#
# Usage:
#   export SVN_USERNAME=vikas
#   sudo bash scripts/svn-checkout.sh
#
# Password (one of):
#   export SVN_PASSWORD=...
#   echo -n 'your_password' | sudo tee /etc/.svn-pass && sudo chmod 600 /etc/.svn-pass
set -euo pipefail

ROOT="$(cd "$(dirname "$0")/.." && pwd)"
SVN_URL="${SVN_URL:-http://newsvn.gventure.co.in/repos/gv_calender/trunk}"
CHECKOUT_DIR="${CHECKOUT_DIR:-$ROOT}"
SVN_PASS_FILE="${SVN_PASS_FILE:-/etc/.svn-pass}"

die() { echo "Error: $1" >&2; exit 1; }

require_cmd() { command -v "$1" >/dev/null 2>&1 || die "'$1' is required."; }
require_cmd svn

[[ -n "${SVN_USERNAME:-}" ]] || die "SVN_USERNAME is not set. Export it: export SVN_USERNAME=vikas"

if [[ -n "${SVN_PASSWORD:-}" ]]; then
  svn_pass="$SVN_PASSWORD"
elif [[ -r "$SVN_PASS_FILE" ]]; then
  svn_pass="$(tr -d '\r\n' < "$SVN_PASS_FILE")"
else
  die "Set SVN_PASSWORD or create $SVN_PASS_FILE"
fi
[[ -n "$svn_pass" ]] || die "SVN password is empty"

svn_cmd() {
  svn "$@" \
    --username "$SVN_USERNAME" \
    --password "$svn_pass" \
    --non-interactive \
    --no-auth-cache
}

if [[ -d "$CHECKOUT_DIR/.svn" ]]; then
  echo "Already an SVN working copy: $CHECKOUT_DIR"
  svn_cmd update "$CHECKOUT_DIR"
  exit 0
fi

echo "Verifying SVN credentials..."
svn_cmd ls "$SVN_URL" >/dev/null || die "SVN authentication failed — check username/password"

env_backup=""
if [[ -f "$CHECKOUT_DIR/node/.env" ]]; then
  env_backup="$(mktemp)"
  cp "$CHECKOUT_DIR/node/.env" "$env_backup"
  echo "Backed up existing node/.env"
fi

stamp="$(date +%Y%m%d%H%M%S)"
backup="${CHECKOUT_DIR}.pre-svn.${stamp}"
checkout_tmp="$(mktemp -d "${TMPDIR:-/tmp}/calendar-svn-checkout.XXXXXX")"

echo "Checking out $SVN_URL"
if ! svn_cmd checkout "$SVN_URL" "$checkout_tmp"; then
  rm -rf "$checkout_tmp"
  die "SVN checkout failed — existing tree was not modified"
fi

if [[ -d "$CHECKOUT_DIR" ]]; then
  mv "$CHECKOUT_DIR" "$backup"
  echo "Previous files kept at: $backup"
fi
mv "$checkout_tmp" "$CHECKOUT_DIR"

if [[ -n "$env_backup" && -f "$env_backup" ]]; then
  cp "$env_backup" "$CHECKOUT_DIR/node/.env"
  rm -f "$env_backup"
  echo "Restored node/.env"
fi

chmod +x "$CHECKOUT_DIR"/scripts/*.sh 2>/dev/null || true
echo "SVN checkout complete → $CHECKOUT_DIR"
