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

BASE_DIR="/var/www/html/dev"
SOURCE_DIR="${BASE_DIR}/mcp-servers/shared-agent-rules"
APPLY=0

usage() {
  cat <<'USAGE'
Usage: ./copy-shared-agent-rules.sh [--dry-run|--apply]

Copia i file Markdown non ricorsivi da:
  /var/www/html/dev/mcp-servers/shared-agent-rules/

verso le sottocartelle immediate di:
  /var/www/html/dev

Criterio destinazione:
  - la sottocartella deve contenere .git
  - mcp-servers viene sempre esclusa

Note:
  - README.md/readme.md e varianti sono esclusi
  - di default esegue solo dry-run
  - con --apply i file copiati vengono impostati in sola lettura: chmod 0444
USAGE
}

while [[ $# -gt 0 ]]; do
  case "$1" in
    --apply)
      APPLY=1
      shift
      ;;
    --dry-run)
      APPLY=0
      shift
      ;;
    -h|--help)
      usage
      exit 0
      ;;
    *)
      echo "ERRORE: opzione sconosciuta: $1" >&2
      usage >&2
      exit 2
      ;;
  esac
done

if [[ ! -d "${SOURCE_DIR}" ]]; then
  echo "ERRORE: cartella sorgente non trovata: ${SOURCE_DIR}" >&2
  exit 2
fi

mapfile -d '' RULE_FILES < <(
  find "${SOURCE_DIR}" -maxdepth 1 -type f \( -iname '*.md' ! -iname 'README.md' \) -print0 | sort -z
)

if [[ ${#RULE_FILES[@]} -eq 0 ]]; then
  echo "ERRORE: nessun file .md trovato in ${SOURCE_DIR} escludendo README.md" >&2
  exit 2
fi

if [[ ${APPLY} -eq 1 ]]; then
  echo "Modalita: apply"
else
  echo "Modalita: dry-run"
fi

echo "Sorgente: ${SOURCE_DIR}"
echo "Destinazioni: sottocartelle immediate di ${BASE_DIR} con .git, esclusa mcp-servers"
echo "File:"
for rule_file in "${RULE_FILES[@]}"; do
  echo "  - $(basename -- "${rule_file}")"
done
echo

repo_count=0
operation_count=0
error_count=0

for target_dir in "${BASE_DIR}"/*; do
  [[ -d "${target_dir}" ]] || continue
  [[ "$(basename -- "${target_dir}")" != "mcp-servers" ]] || continue
  [[ -d "${target_dir}/.git" ]] || continue

  repo_count=$((repo_count + 1))
  echo "Repository: ${target_dir}"

  for source_file in "${RULE_FILES[@]}"; do
    file_name="$(basename -- "${source_file}")"
    dest_file="${target_dir}/${file_name}"
    operation_count=$((operation_count + 1))

    if [[ ${APPLY} -eq 0 ]]; then
      if [[ -e "${dest_file}" ]]; then
        echo "  sostituirebbe in sola lettura: ${file_name}"
      else
        echo "  copierebbe in sola lettura: ${file_name}"
      fi
      continue
    fi

    if [[ -e "${dest_file}" ]]; then
      chmod u+w -- "${dest_file}" || {
        echo "  ERRORE: impossibile rendere scrivibile prima della sostituzione: ${dest_file}" >&2
        error_count=$((error_count + 1))
        continue
      }
    fi

    if cp -- "${source_file}" "${dest_file}"; then
      chmod 0444 -- "${dest_file}" || {
        echo "  ERRORE: copiato ma impossibile impostare sola lettura: ${dest_file}" >&2
        error_count=$((error_count + 1))
        continue
      }
      echo "  copiato in sola lettura: ${file_name}"
    else
      echo "  ERRORE: copia fallita: ${source_file} -> ${dest_file}" >&2
      error_count=$((error_count + 1))
    fi
  done
done

echo
echo "Repository trovati: ${repo_count}"
echo "Operazioni file: ${operation_count}"

if [[ ${APPLY} -eq 0 ]]; then
  echo "Dry-run completato. Esegui con --apply per copiare davvero e impostare chmod 0444."
fi

if [[ ${error_count} -gt 0 ]]; then
  echo "Errori: ${error_count}" >&2
  exit 8
fi
