#!/bin/sh
set -eu

if [ "$#" -ne 3 ]; then
  echo "Usage: $0 STAGED_COMPONENT TARGET_ROOT BACKUP_ROOT" >&2
  exit 2
fi

STAGED_COMPONENT=$1
TARGET_ROOT=$2
BACKUP_ROOT=$3
PATHS_FILE="$STAGED_COMPONENT/MANIFEST_PATHS.txt"

if [ ! -f "$PATHS_FILE" ]; then
  echo "Missing MANIFEST_PATHS.txt" >&2
  exit 3
fi

mkdir -p "$TARGET_ROOT" "$BACKUP_ROOT/files"
: > "$BACKUP_ROOT/new_files.txt"
: > "$BACKUP_ROOT/deployed_files.txt"

while IFS= read -r REL || [ -n "$REL" ]; do
  [ -n "$REL" ] || continue
  case "$REL" in
    /*|../*|*/../*|*/..|..)
      echo "Unsafe relative path: $REL" >&2
      exit 4
      ;;
  esac
  SRC="$STAGED_COMPONENT/$REL"
  DST="$TARGET_ROOT/$REL"
  if [ ! -f "$SRC" ]; then
    echo "Missing staged file: $REL" >&2
    exit 5
  fi
  if [ -e "$DST" ]; then
    mkdir -p "$BACKUP_ROOT/files/$(dirname "$REL")"
    cp -p "$DST" "$BACKUP_ROOT/files/$REL"
  else
    printf '%s\n' "$REL" >> "$BACKUP_ROOT/new_files.txt"
  fi
  mkdir -p "$(dirname "$DST")"
  cp -p "$SRC" "$DST"
  printf '%s\n' "$REL" >> "$BACKUP_ROOT/deployed_files.txt"
done < "$PATHS_FILE"

cp -p "$STAGED_COMPONENT/MANIFEST_SHA256.txt" "$BACKUP_ROOT/MANIFEST_SHA256.txt"
printf '%s\n' "$(date -u +%Y-%m-%dT%H:%M:%SZ)" > "$BACKUP_ROOT/deployed_at_utc.txt"
echo "DEPLOYMENT_OK backup=$BACKUP_ROOT"
