#!/bin/zsh
set -euo pipefail

package_dir="${0:A:h}"

au_src="$package_dir/Audio/Plug-Ins/Components/clippamistocazzo.component"
vst3_src="$package_dir/Audio/Plug-Ins/VST3/clippamistocazzo.vst3"

component_dir="$HOME/Library/Audio/Plug-Ins/Components"
vst3_dir="$HOME/Library/Audio/Plug-Ins/VST3"
au_dest="$component_dir/clippamistocazzo.component"
vst3_dest="$vst3_dir/clippamistocazzo.vst3"

plugin_binary_name="clippamistocazzo"

DITTO="/usr/bin/ditto"
XATTR="/usr/bin/xattr"
CODESIGN="/usr/bin/codesign"
LIPO="/usr/bin/lipo"
GREP="/usr/bin/grep"
AUVAL="/usr/bin/auval"
KILLALL="/usr/bin/killall"
MKDIR="/bin/mkdir"
SPCTL="/usr/sbin/spctl"
PLUGINVAL=""

print_step() {
  print ""
  print "==> $1"
}

fail() {
  print ""
  print "ERRORE: $1"
  print ""
  print "Se il problema continua, manda questo testo a chi ti ha fornito il plugin."
  exit 1
}

resolve_tool() {
  local preferred_path="$1"
  local tool_name="$2"

  if [[ -x "$preferred_path" ]]; then
    print "$preferred_path"
    return 0
  fi

  command -v "$tool_name" 2>/dev/null || return 1
}

require_tool_path() {
  local tool_path="$1"
  local tool_name="$2"

  [[ -x "$tool_path" ]] || fail "Strumento mancante: $tool_name ($tool_path)"
}

verify_bundle() {
  local bundle_path="$1"
  local binary_path="$bundle_path/Contents/MacOS/$plugin_binary_name"

  [[ -d "$bundle_path" ]] || fail "Bundle non trovato: $bundle_path"
  [[ -f "$binary_path" ]] || fail "Binario plugin non trovato: $binary_path"

  "$LIPO" -info "$binary_path" | "$GREP" -q "x86_64" || fail "Architettura Intel x86_64 mancante in $bundle_path"
  "$LIPO" -info "$binary_path" | "$GREP" -q "arm64" || fail "Architettura Apple Silicon arm64 mancante in $bundle_path"
  "$CODESIGN" --verify --deep --strict --verbose=1 "$bundle_path"
}

required_paths=(
  "$au_src"
  "$vst3_src"
)

for path in "${required_paths[@]}"; do
  if [[ ! -e "$path" ]]; then
    print "Elemento del pacchetto mancante: $path"
    exit 1
  fi
done

print "clippamistocazzo - installazione macOS"
print ""
print "Questo script installa il plugin solo per l'utente corrente."
print "Non serve password amministratore."
print ""
print "Formati installati:"
print -- "- Audio Unit: $au_dest"
print -- "- VST3:       $vst3_dest"
print ""
print "Nota: questa build e' firmata ad-hoc e non e' notarizzata da Apple."
print "E' pensata per beta test: lo script applica una firma locale sul tuo Mac,"
print "ma non puo' sostituire notarizzazione o firma Developer ID ufficiale."
print "Se macOS mostra un avviso, usa Impostazioni di Sistema > Privacy e Sicurezza > Apri comunque."
print ""
print -n "Continuare? [y/N] "
read -r reply

if [[ ! "$reply" =~ '^[Yy]$' ]]; then
  print "Operazione annullata."
  exit 0
fi

DITTO="$(resolve_tool "/usr/bin/ditto" "ditto")" || fail "Strumento mancante: ditto"
XATTR="$(resolve_tool "/usr/bin/xattr" "xattr")" || fail "Strumento mancante: xattr"
CODESIGN="$(resolve_tool "/usr/bin/codesign" "codesign")" || fail "Strumento mancante: codesign"
LIPO="$(resolve_tool "/usr/bin/lipo" "lipo")" || fail "Strumento mancante: lipo"
GREP="$(resolve_tool "/usr/bin/grep" "grep")" || fail "Strumento mancante: grep"
AUVAL="$(resolve_tool "/usr/bin/auval" "auval")" || AUVAL=""
KILLALL="$(resolve_tool "/usr/bin/killall" "killall")" || KILLALL=""
MKDIR="$(resolve_tool "/bin/mkdir" "mkdir")" || fail "Strumento mancante: mkdir"
SPCTL="$(resolve_tool "/usr/sbin/spctl" "spctl")" || SPCTL=""
PLUGINVAL="$(resolve_tool "/usr/local/bin/pluginval" "pluginval")" || PLUGINVAL=""

require_tool_path "$DITTO" "ditto"
require_tool_path "$XATTR" "xattr"
require_tool_path "$CODESIGN" "codesign"
require_tool_path "$LIPO" "lipo"
require_tool_path "$GREP" "grep"
require_tool_path "$MKDIR" "mkdir"

print_step "Creo le cartelle plugin dell'utente"
"$MKDIR" -p "$component_dir" "$vst3_dir"

print_step "Copio i plugin"
"$DITTO" "$au_src" "$au_dest"
"$DITTO" "$vst3_src" "$vst3_dest"

installed_paths=(
  "$au_dest"
  "$vst3_dest"
)

print_step "Rimuovo eventuale quarantine di macOS"
"$XATTR" -dr com.apple.quarantine "${installed_paths[@]}" 2>/dev/null || true

print_step "Applico firma locale ad-hoc"
"$CODESIGN" --force --deep --sign - "${installed_paths[@]}"

print_step "Verifico firma e Universal 2 Intel/Apple Silicon"
verify_bundle "$au_dest"
verify_bundle "$vst3_dest"

if [[ -n "$SPCTL" ]]; then
  print ""
  print "Nota beta: controllo Gatekeeper informativo."
  print "Con build ad-hoc non notarizzate, 'rejected' puo' essere normale."
  "$SPCTL" --assess --type execute --verbose=4 "$au_dest" 2>&1 || true
  "$SPCTL" --assess --type execute --verbose=4 "$vst3_dest" 2>&1 || true
fi

if [[ -n "$PLUGINVAL" ]]; then
  print_step "Eseguo pluginval sul VST3"
  "$PLUGINVAL" --validate-in-process --strictness-level 5 "$vst3_dest" || print "pluginval ha segnalato problemi: controlla l'output sopra."
else
  print ""
  print "pluginval non trovato: salto la validazione VST3 avanzata."
fi

if [[ -n "$AUVAL" ]]; then
  print_step "Eseguo validazione Audio Unit"
  "$AUVAL" -v aufx Cdhp Cstm || print "auval ha segnalato problemi: controlla l'output sopra."
else
  print ""
  print "auval non trovato: salto la validazione Audio Unit."
fi

if [[ -n "$KILLALL" ]]; then
  print ""
  print -n "Vuoi riavviare il registro Audio Unit di macOS? Consigliato per Logic. [y/N] "
  read -r restart_reply

  if [[ "$restart_reply" =~ '^[Yy]$' ]]; then
    "$KILLALL" -9 AudioComponentRegistrar 2>/dev/null || true
  fi
fi

print ""
print "Installazione completata."
print ""
print "Prossimi passi:"
print "1. Chiudi e riapri il DAW."
print "2. Se usi Logic e il plugin non appare, riavvia il Mac o rilancia questo script e scegli di riavviare AudioComponentRegistrar."
print "3. Se macOS blocca il plugin, vai in Impostazioni di Sistema > Privacy e Sicurezza > Apri comunque."
print "4. In REAPER, fai una nuova scansione dei plugin se necessario."
print "5. Se Logic continua a non mostrarlo, apri Gestione Plug-in e abilita/rescansiona clippamistocazzo."
