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

# Update an existing project to the latest starter-kit standards.
# Creates Orig backups before overwriting any changed file.
# Usage:
#   ./starter-kit/update-project-to-standards.sh /absolute/path/to/project

if [[ $# -ne 1 ]]; then
  echo "Usage: $0 /absolute/path/to/project"
  exit 1
fi

TARGET_DIR="$1"
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
BASE_DIR="$SCRIPT_DIR/base"

if [[ ! -d "$TARGET_DIR" ]]; then
  echo "Target directory does not exist: $TARGET_DIR"
  exit 1
fi

mkdir -p "$TARGET_DIR/docs"

timestamp() {
  date +"%Y%m%d%H%M%S"
}

orig_name() {
  local path="$1"
  local dir name stem ext
  dir="$(dirname "$path")"
  name="$(basename "$path")"

  if [[ "$name" == *.* ]]; then
    stem="${name%.*}"
    ext=".${name##*.}"
  else
    stem="$name"
    ext=""
  fi

  echo "$dir/${stem}Orig${ext}"
}

backup_if_needed() {
  local dst="$1"
  local backup
  backup="$(orig_name "$dst")"

  if [[ -e "$backup" ]]; then
    backup="${backup%.*}_$(timestamp).${backup##*.}"
  fi

  cp "$dst" "$backup"
  echo "Backup:  $backup"
}

sync_file() {
  local src="$1"
  local dst="$2"

  if [[ ! -e "$dst" ]]; then
    cp "$src" "$dst"
    echo "Created: $dst"
    return
  fi

  if cmp -s "$src" "$dst"; then
    echo "Unchanged: $dst"
    return
  fi

  backup_if_needed "$dst"
  cp "$src" "$dst"
  echo "Updated: $dst"
}

sync_file "$BASE_DIR/CONTRIBUTING.md" "$TARGET_DIR/CONTRIBUTING.md"
sync_file "$BASE_DIR/SECURITY.md" "$TARGET_DIR/SECURITY.md"
sync_file "$BASE_DIR/docs.html" "$TARGET_DIR/docs.html"

for f in "$BASE_DIR"/docs/*.md; do
  name="$(basename "$f")"
  sync_file "$f" "$TARGET_DIR/docs/$name"
done

echo

echo "Update complete."
echo "Run conformance check:"
echo "  ./starter-kit/check-conformance.sh $TARGET_DIR"
