#!/usr/bin/env sh
set -eu

targets=$(mktemp)
requested=$(mktemp)
trap 'rm -f "$targets" "$requested"' EXIT HUP INT TERM

confirmed=0
while [ "$#" -gt 0 ]; do
  case "$1" in
    --yes) confirmed=1; shift ;;
    --path)
      if [ "$#" -lt 2 ]; then
        printf '%s\n' '--path requires a file.' >&2
        exit 2
      fi
      printf '%s\n' "$2" >>"$requested"
      shift 2
      ;;
    -h|--help)
      printf '%s\n' 'Usage: legacy-cli-uninstall.sh [--yes] [--path FILE]'
      printf '%s\n' 'Removes the retired Contenox CLI while preserving all user data.'
      exit 0
      ;;
    *)
      printf 'Unknown argument: %s\n' "$1" >&2
      exit 2
      ;;
  esac
done

add_target() {
  target=$1
  if { [ -e "$target" ] || [ -L "$target" ]; } && ! grep -Fqx -- "$target" "$targets"; then
    printf '%s\n' "$target" >>"$targets"
  fi
}

if [ -s "$requested" ]; then
  while IFS= read -r requested_target; do
    add_target "$requested_target"
  done <"$requested"
else
  resolved=$(command -v contenox 2>/dev/null || true)
  case "$resolved" in
    /*) add_target "$resolved" ;;
  esac
  add_target /usr/local/bin/contenox
  add_target "$HOME/.local/bin/contenox"
  for backup in /usr/bin/contenox.legacy.* /usr/local/bin/contenox.legacy.*; do
    add_target "$backup"
  done
fi

if [ ! -s "$targets" ]; then
  printf '%s\n' 'No retired Contenox CLI installation was found.'
  printf '%s\n' 'User data was not changed.'
  exit 0
fi

while IFS= read -r target; do
  if [ -L "$target" ] || [ ! -f "$target" ]; then
    printf 'Refusing to remove %s: it is not a regular file.\n' "$target" >&2
    exit 1
  fi
  for manager in rpm dpkg-query; do
    if ! command -v "$manager" >/dev/null 2>&1; then
      continue
    fi
    if [ "$manager" = rpm ]; then
      owner=$(rpm -qf -- "$target" 2>&1) && status=0 || status=$?
      if [ "$status" -eq 0 ]; then
        printf 'Refusing to remove %s: owned by %s. Use the package manager.\n' "$target" "$owner" >&2
        exit 1
      fi
    else
      owner=$(dpkg-query -S "$target" 2>&1) && status=0 || status=$?
      if [ "$status" -eq 0 ]; then
        printf 'Refusing to remove %s: owned by %s. Use the package manager.\n' "$target" "$owner" >&2
        exit 1
      fi
    fi
    if [ "$status" -ne 1 ]; then
      printf 'Package ownership check failed for %s: %s\n' "$target" "$owner" >&2
      exit 1
    fi
  done
  if ! LC_ALL=C grep -aFq 'github.com/contenox/contenox' "$target" || ! LC_ALL=C grep -aFq 'contenox version' "$target"; then
    printf 'Refusing to remove %s: it is not an identified retired Contenox CLI.\n' "$target" >&2
    exit 1
  fi
done <"$targets"

printf '%s\n' 'The following retired Contenox CLI files will be removed:'
while IFS= read -r target; do
  printf '  %s\n' "$target"
done <"$targets"
printf '%s\n' 'Configuration, models, sessions, credentials, and project data will be preserved.'

if [ "$confirmed" -ne 1 ]; then
  if [ ! -t 0 ]; then
    printf '%s\n' 'Confirmation requires a terminal. Re-run with --yes after reviewing the paths.' >&2
    exit 1
  fi
  printf '%s' 'Continue? [y/N] '
  IFS= read -r answer
  case "$answer" in
    y|Y|yes|YES) ;;
    *) printf '%s\n' 'Cancelled.'; exit 0 ;;
  esac
fi

while IFS= read -r target; do
  directory=$(dirname "$target")
  if [ -w "$directory" ]; then
    rm -- "$target"
  elif command -v sudo >/dev/null 2>&1; then
    sudo rm -- "$target"
  else
    printf 'Cannot remove %s without write access or sudo.\n' "$target" >&2
    exit 1
  fi
  printf 'Removed %s\n' "$target"
done <"$targets"

printf '%s\n' 'Retired Contenox CLI removal is complete. User data was not changed.'
