#!/usr/bin/env bash

set -euo pipefail

SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PROJECT_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)"
FRONTEND_DIR="${FRONTEND_DIR:-$PROJECT_ROOT/frontend}"
SYNC_SCRIPT="${SYNC_SCRIPT:-$PROJECT_ROOT/scripts/sync-site-content.sh}"
HTACCESS_SOURCE="${HTACCESS_SOURCE:-$FRONTEND_DIR/.deploy/release.htaccess}"
HTACCESS_SYNC_SCRIPT="${HTACCESS_SYNC_SCRIPT:-$PROJECT_ROOT/scripts/sync-release-htaccess-redirects.mjs}"
STATIC_FALLBACK_SITEMAP="${STATIC_FALLBACK_SITEMAP:-$FRONTEND_DIR/.deploy/sitemap.xml}"
NODE_HEAP_MB="${NODE_HEAP_MB:-8192}"
RELEASES_DIR="${RELEASES_DIR:-$FRONTEND_DIR/.deploy/releases}"
TIMESTAMP="${TIMESTAMP:-$(date '+%Y%m%d-%H%M%S')}"
RELEASE_DIR="$RELEASES_DIR/$TIMESTAMP"
TMP_DIR="$FRONTEND_DIR/.output"
NUXT_BUILD_DIR="$FRONTEND_DIR/.nuxt"
NUXT_CACHE_DIR="$FRONTEND_DIR/node_modules/.cache/nuxt/.nuxt"

if [[ ! -d "$FRONTEND_DIR" ]]; then
  echo "Frontend directory not found: $FRONTEND_DIR" >&2
  exit 1
fi

if [[ ! -x "$SYNC_SCRIPT" ]]; then
  echo "Sync script is not executable or missing: $SYNC_SCRIPT" >&2
  exit 1
fi

if [[ ! -f "$FRONTEND_DIR/package.json" ]]; then
  echo "frontend/package.json not found in: $FRONTEND_DIR" >&2
  exit 1
fi

echo "==> Syncing live public export into frontend/app/generated/site"
"$SYNC_SCRIPT"

if [[ -f "$HTACCESS_SYNC_SCRIPT" ]]; then
  echo "==> Syncing release .htaccess redirects from generated redirectMap"
  node "$HTACCESS_SYNC_SCRIPT"
fi

echo "==> Cleaning previous static build output"
rm -rf "$TMP_DIR"
rm -rf "$NUXT_BUILD_DIR"
rm -rf "$NUXT_CACHE_DIR"

echo "==> Generating static frontend with NODE_OPTIONS=--max-old-space-size=$NODE_HEAP_MB"
(
  cd "$FRONTEND_DIR"
  export NUXT_PUBLIC_SITE_BASE_URL="${NUXT_PUBLIC_SITE_BASE_URL:-https://bent.ge}"
  export NUXT_PUBLIC_API_BASE_URL="${NUXT_PUBLIC_API_BASE_URL:-https://api.hub.bent.ge/api}"
  export NODE_OPTIONS="--max-old-space-size=$NODE_HEAP_MB ${NODE_OPTIONS:-}"
  npm run generate
)

if [[ ! -d "$TMP_DIR/public" ]]; then
  echo "Nuxt static output not found: $TMP_DIR/public" >&2
  exit 1
fi

echo "==> Preparing release folder: $RELEASE_DIR"
rm -rf "$RELEASE_DIR"
mkdir -p "$RELEASE_DIR"
rsync -a --delete "$TMP_DIR/public/" "$RELEASE_DIR/"

if [[ -f "$HTACCESS_SOURCE" ]]; then
  cp "$HTACCESS_SOURCE" "$RELEASE_DIR/.htaccess"
fi

if [[ ! -f "$RELEASE_DIR/sitemap.xml" && -f "$STATIC_FALLBACK_SITEMAP" ]]; then
  cp "$STATIC_FALLBACK_SITEMAP" "$RELEASE_DIR/sitemap.xml"
fi

cat > "$RELEASE_DIR/release-meta.txt" <<EOF
generated_at=$TIMESTAMP
frontend_dir=$FRONTEND_DIR
generated_site_dir=$FRONTEND_DIR/app/generated/site
node_heap_mb=$NODE_HEAP_MB
EOF

ln -sfn "$RELEASE_DIR" "$RELEASES_DIR/latest"

echo
echo "Release ready:"
echo "  $RELEASE_DIR"
echo
echo "Upload this folder contents to live web root."
echo "Latest symlink:"
echo "  $RELEASES_DIR/latest"
