#!/usr/bin/env bash
# FenrythMT2 - Client Server Test: avvio su Linux e macOS tramite Wine.
# Il client e' un programma Windows (DirectX 9): qui non viene modificato, questo script prepara Wine e lo avvia.
#
# Uso:
#   ./fenrythmt2-linux-mac.sh                 installa (la prima volta) e avvia il launcher
#   ./fenrythmt2-linux-mac.sh install [ZIP|CARTELLA]   prepara Wine e il client (ZIP scaricato dal sito o cartella gia' estratta)
#   ./fenrythmt2-linux-mac.sh play            avvia il launcher (controlla le patch, poi GIOCA)
#   ./fenrythmt2-linux-mac.sh repair          rifa' il prefisso Wine (se il gioco non parte piu'); il client non viene toccato
#   ./fenrythmt2-linux-mac.sh uninstall       elimina Wine-prefix e (a richiesta) il client
#   ./fenrythmt2-linux-mac.sh info            mostra cartelle e versioni in uso
#
# Variabili opzionali: FMT2_HOME (default ~/.fenrythmt2), FMT2_DXVK=1 (Linux: usa DXVK/Vulkan al posto di OpenGL),
#                      FMT2_WINE=/percorso/di/wine (forza un Wine preciso).
set -u

APP="FenrythMT2 - Client Server Test"
BASE="${FMT2_HOME:-$HOME/.fenrythmt2}"
[ -z "${FMT2_HOME:-}" ] && [ -d "$HOME/.friends-mt2" ] && [ ! -d "$BASE" ] && mv "$HOME/.friends-mt2" "$BASE" 2>/dev/null || true
PREFIX="$BASE/prefix"
GAMEFILE="$BASE/game_dir"
OS="$(uname -s)"
ARCH="$(uname -m)"

say()  { printf '\033[1;33m[FenrythMT2]\033[0m %s\n' "$*"; }
err()  { printf '\033[1;31m[FenrythMT2] ERRORE:\033[0m %s\n' "$*" >&2; }
ask()  { local r; read -r -p "$1 [s/N] " r; [[ "$r" =~ ^[sSyY]$ ]]; }

case "$OS" in
  Linux)  PLAT=linux ;;
  Darwin) PLAT=mac ;;
  *) err "Sistema non supportato ($OS): serve Linux o macOS."; exit 1 ;;
esac

# ---------------------------------------------------------------- Wine
find_wine() {
  if [ -n "${FMT2_WINE:-}" ] && [ -x "$FMT2_WINE" ]; then WINE="$FMT2_WINE"; return 0; fi
  local c
  for c in wine wine64 wine-stable; do
    if command -v "$c" >/dev/null 2>&1; then WINE="$(command -v "$c")"; return 0; fi
  done
  if [ "$PLAT" = mac ]; then
    for c in "/Applications/Wine Stable.app/Contents/Resources/wine/bin/wine" \
             "/Applications/Wine Staging.app/Contents/Resources/wine/bin/wine" \
             "/Applications/Wine Crossover.app/Contents/Resources/wine/bin/wine" \
             "/opt/homebrew/bin/wine" "/usr/local/bin/wine" \
             "/Applications/CrossOver.app/Contents/SharedSupport/CrossOver/bin/wine"; do
      if [ -x "$c" ]; then WINE="$c"; return 0; fi
    done
  fi
  return 1
}

install_wine_hint() {
  say "Wine non e' installato. Installalo cosi':"
  if [ "$PLAT" = mac ]; then
    cat <<'EOF'
    Con Homebrew (https://brew.sh):
        brew install --cask --no-quarantine gcenx/wine/wine-crossover
        brew install winetricks
    (in alternativa CrossOver o un altro pacchetto Wine per macOS: poi rilancia lo script,
     oppure indica il programma con  FMT2_WINE=/percorso/di/wine ./fenrythmt2-linux-mac.sh)
EOF
  elif command -v apt-get >/dev/null 2>&1; then
    echo "    sudo dpkg --add-architecture i386 && sudo apt update && sudo apt install wine wine32 winetricks cabextract unzip"
  elif command -v dnf >/dev/null 2>&1; then
    echo "    sudo dnf install wine winetricks cabextract unzip"
  elif command -v pacman >/dev/null 2>&1; then
    echo "    (abilita il repo [multilib]) sudo pacman -S wine wine-mono winetricks cabextract unzip"
  elif command -v zypper >/dev/null 2>&1; then
    echo "    sudo zypper install wine winetricks cabextract unzip"
  else
    echo "    installa 'wine' (versione 9 o successiva), 'winetricks', 'cabextract' e 'unzip' con il gestore pacchetti della tua distribuzione"
  fi
}

check_tools() {
  if ! find_wine; then install_wine_hint; exit 1; fi
  if ! command -v winetricks >/dev/null 2>&1; then
    err "winetricks non trovato (serve per DirectX 9 e le librerie di Windows)."
    if [ "$PLAT" = mac ]; then echo "    brew install winetricks"; else echo "    installa il pacchetto 'winetricks' dalla tua distribuzione"; fi
    exit 1
  fi
  if [ "$PLAT" = linux ] && ! command -v cabextract >/dev/null 2>&1; then
    err "cabextract non trovato (usato da winetricks): installa il pacchetto 'cabextract'."; exit 1
  fi
  if [ "$PLAT" = mac ] && [ "$ARCH" = arm64 ] && ! /usr/bin/pgrep -q oahd 2>/dev/null; then
    say "Mac Apple Silicon: il client e' a 32 bit e richiede Rosetta 2."
    if ask "Installare Rosetta 2 ora?"; then softwareupdate --install-rosetta --agree-to-license || { err "Installazione Rosetta fallita."; exit 1; }
    else err "Senza Rosetta 2 il gioco non puo' partire."; exit 1; fi
  fi
}

wine_env() {
  export WINEPREFIX="$PREFIX"
  export WINEDEBUG="${WINEDEBUG:--all}"
  export WINEDLLOVERRIDES="winemenubuilder.exe=d;${WINEDLLOVERRIDES:-}"
  export WINEESYNC=1
  [ "$PLAT" = mac ] && export WINEMSYNC=1
  [ -n "${WINE_LARGE_ADDRESS_AWARE:-}" ] || export WINE_LARGE_ADDRESS_AWARE=1
}

make_prefix() {
  mkdir -p "$BASE"
  wine_env
  say "Preparo il prefisso Wine in $PREFIX (la prima volta puo' chiedere di scaricare 'wine-mono': accetta)."
  "$WINE" wineboot -u >/dev/null 2>&1
  say "Installo DirectX 9, librerie Visual C++ 2008 e font (puo' richiedere alcuni minuti)..."
  winetricks -q win10 >/dev/null 2>&1 || true
  winetricks -q corefonts d3dx9 vcrun2008 || { err "winetricks non e' riuscito a installare le librerie: riprova con './fenrythmt2-linux-mac.sh repair'."; exit 1; }
  if [ "$PLAT" = linux ] && [ "${FMT2_DXVK:-0}" = 1 ]; then
    say "Installo DXVK (Direct3D su Vulkan)..."
    winetricks -q dxvk || say "DXVK non installato: il gioco usera' OpenGL."
  fi
  : > "$PREFIX/.fmt2_ready"
}

# ---------------------------------------------------------------- client
game_dir() { [ -f "$GAMEFILE" ] && cat "$GAMEFILE"; }

unzip_to() {
  local zip="$1" dest="$2"
  mkdir -p "$dest"
  if command -v unzip >/dev/null 2>&1; then unzip -q -o "$zip" -d "$dest"
  elif command -v python3 >/dev/null 2>&1; then python3 -c 'import sys,zipfile; zipfile.ZipFile(sys.argv[1]).extractall(sys.argv[2])' "$zip" "$dest"
  else err "serve 'unzip' (o python3) per estrarre lo ZIP."; return 1; fi
}

place_client() {
  local src="${1:-}"
  if [ -z "$src" ]; then
    src="$(ls -t "$HOME/Downloads/"Fenryth*MT2*.zip 2>/dev/null | head -n1 || true)"
    [ -n "$src" ] && say "Trovato lo ZIP scaricato: $src"
  fi
  if [ -z "$src" ]; then
    err "Non trovo il client. Scaricalo dal sito (sezione \"Scarica il client\", dopo aver creato l'account) e rilancia:"
    echo "    $0 install \"/percorso/FenrythMT2 - Client Server Test.zip\""
    exit 1
  fi
  if [ -d "$src" ]; then
    [ -f "$src/FenrythMT2.exe" ] || { err "La cartella '$src' non contiene FenrythMT2.exe."; exit 1; }
    GAME="$(cd "$src" && pwd)"
  elif [ -f "$src" ]; then
    say "Estraggo il client (circa 1,5 GB) in $BASE ..."
    unzip_to "$src" "$BASE" || exit 1
    GAME="$BASE/$APP"
    [ -f "$GAME/FenrythMT2.exe" ] || { err "Lo ZIP non contiene '$APP/FenrythMT2.exe'."; exit 1; }
  else
    err "Percorso non valido: $src"; exit 1
  fi
  mkdir -p "$BASE"; printf '%s\n' "$GAME" > "$GAMEFILE"
  say "Client pronto in: $GAME"
}

make_shortcuts() {
  local self; self="$(cd "$(dirname "$0")" && pwd)/$(basename "$0")"
  mkdir -p "$BASE"
  cp -f "$self" "$BASE/fenrythmt2-linux-mac.sh" 2>/dev/null && chmod +x "$BASE/fenrythmt2-linux-mac.sh"
  if [ "$PLAT" = linux ]; then
    local d="$HOME/.local/share/applications"; mkdir -p "$d"
    cat > "$d/fenrythmt2.desktop" <<EOF
[Desktop Entry]
Type=Application
Name=$APP
Comment=FenrythMT2 (via Wine)
Exec="$BASE/fenrythmt2-linux-mac.sh" play
Terminal=false
Categories=Game;
EOF
    say "Voce di menu creata: \"$APP\"."
  else
    local c="$HOME/Desktop/$APP.command"
    printf '#!/usr/bin/env bash\nexec "%s/fenrythmt2-linux-mac.sh" play\n' "$BASE" > "$c" && chmod +x "$c"
    say "Icona sul Desktop creata: \"$APP.command\" (doppio clic per giocare)."
  fi
}

# ---------------------------------------------------------------- comandi
cmd_install() {
  check_tools
  [ -f "$PREFIX/.fmt2_ready" ] || make_prefix
  place_client "${1:-}"
  make_shortcuts
  hamachi_note
  say "Installazione completata."
}

cmd_play() {
  check_tools
  local g; g="$(game_dir || true)"
  if [ -z "$g" ] || [ ! -f "$g/FenrythMT2.exe" ] || [ ! -f "$PREFIX/.fmt2_ready" ]; then
    say "Prima installazione: preparo tutto."
    cmd_install ""; g="$(game_dir)"
  fi
  wine_env
  say "Avvio il launcher (poi premi GIOCA)."
  cd "$g" || exit 1
  exec "$WINE" FenrythMT2.exe
}

cmd_repair() {
  check_tools
  if ask "Eliminare e ricreare il prefisso Wine ($PREFIX)? Il client e gli account non vengono toccati."; then
    rm -rf "$PREFIX"; make_prefix; say "Prefisso ricreato."
  fi
}

cmd_uninstall() {
  local g; g="$(game_dir || true)"
  ask "Eliminare il prefisso Wine in $PREFIX?" && rm -rf "$PREFIX"
  if [ -n "$g" ] && [ -d "$g" ] && ask "Eliminare anche il client in '$g'?"; then rm -rf "$g"; rm -f "$GAMEFILE"; fi
  rm -f "$HOME/.local/share/applications/fenrythmt2.desktop" "$HOME/Desktop/$APP.command"
  say "Fatto."
}

cmd_info() {
  find_wine && "$WINE" --version || echo "Wine: non trovato"
  echo "Sistema   : $OS $ARCH"
  echo "Cartella  : $BASE"
  echo "Prefisso  : $PREFIX $([ -f "$PREFIX/.fmt2_ready" ] && echo '(pronto)' || echo '(da creare)')"
  echo "Client    : $(game_dir || echo 'non installato')"
}

hamachi_note() {
  cat <<'EOF'

  RETE: per giocare serve la VPN Hamachi (rete e password sono scritte sul sito, sezione "Hamachi").
  Hamachi va installato NEL TUO SISTEMA, non dentro Wine:
EOF
  if [ "$PLAT" = mac ]; then
    echo "    macOS: client LogMeIn Hamachi per Mac da https://vpn.net"
  else
    echo "    Linux: pacchetto 'logmein-hamachi' da https://vpn.net/linux  (poi: sudo hamachi login; sudo hamachi join <rete> <password>)"
  fi
  echo
}

case "${1:-play}" in
  install)   cmd_install "${2:-}" ;;
  play|"")   cmd_play ;;
  repair)    cmd_repair ;;
  uninstall) cmd_uninstall ;;
  info)      cmd_info ;;
  -h|--help|help) sed -n '2,15p' "$0" ;;
  *) err "Comando sconosciuto: $1"; sed -n '2,15p' "$0"; exit 1 ;;
esac
