#!/usr/bin/env bash
# ════════════════════════════════════════════════════════════
#  IPMOS — installer self-host
#  Uso:   curl -fsSL https://ipmos.eu/install.sh | bash
#  Non interattivo (esempio):
#    IPMOS_DOMAIN=ipmi.miodominio.it IPMOS_LICENSE=IPMOS-XXXX-... \
#      bash <(curl -fsSL https://ipmos.eu/install.sh)
# ════════════════════════════════════════════════════════════
set -euo pipefail

DL_BASE="${IPMOS_DL_BASE:-https://ipmos.eu/dl}"
LICENSE_SERVER="${IPMOS_LICENSE_SERVER:-https://license.ipmos.eu}"
INSTALL_DIR="${IPMOS_DIR:-/opt/ipmos-app}"
STACK_URL="$DL_BASE/ipmos-stack.tar.gz"

C_G=$'\e[38;5;43m'; C_D=$'\e[2m'; C_R=$'\e[31m'; C_B=$'\e[1m'; C_X=$'\e[0m'
say(){ printf "%s\n" "${C_G}▸${C_X} $*"; }
warn(){ printf "%s\n" "${C_R}!${C_X} $*" >&2; }
die(){ warn "$*"; exit 1; }

banner(){
cat <<'EOF'
   ___ ____  __  __  ___  ____
  |_ _|  _ \|  \/  |/ _ \/ ___|
   | || |_) | |\/| | | | \___ \
   | ||  __/| |  | | |_| |___) |
  |___|_|   |_|  |_|\___/|____/   self-host installer
EOF
}

# ── TTY per i prompt anche quando lo script arriva da `curl | bash` ──
TTY=/dev/tty
ask(){ # ask VAR "Prompt" "default"
  local __var="$1" __prompt="$2" __def="${3:-}" __ans=""
  local __cur="${!__var:-}"
  if [ -n "$__cur" ]; then printf -v "$__var" '%s' "$__cur"; return; fi
  if [ -r "$TTY" ]; then
    if [ -n "$__def" ]; then printf "%s [%s]: " "$__prompt" "$__def" > "$TTY"
    else printf "%s: " "$__prompt" > "$TTY"; fi
    read -r __ans < "$TTY" || true
  fi
  printf -v "$__var" '%s' "${__ans:-$__def}"
}

require_root(){
  if [ "$(id -u)" -ne 0 ]; then
    if command -v sudo >/dev/null 2>&1; then SUDO="sudo"; else die "Esegui come root (o installa sudo)."; fi
  else SUDO=""; fi
}

rand(){ head -c "${1:-24}" /dev/urandom | od -An -tx1 | tr -d ' \n'; }

install_docker(){
  if command -v docker >/dev/null 2>&1 && docker compose version >/dev/null 2>&1; then
    say "Docker già presente."
    return
  fi
  say "Installo Docker…"
  $SUDO sh -c 'curl -fsSL https://get.docker.com | sh' >/dev/null 2>&1 || die "Installazione Docker fallita."
  $SUDO systemctl enable --now docker >/dev/null 2>&1 || true
  docker compose version >/dev/null 2>&1 || die "Docker Compose plugin non disponibile."
}

main(){
  banner
  require_root

  command -v curl >/dev/null 2>&1 || die "curl richiesto."
  command -v tar  >/dev/null 2>&1 || die "tar richiesto."

  echo
  say "Configurazione istanza IPMOS"
  ask IPMOS_DOMAIN   "Dominio per questa istanza (es. ipmi.tuodominio.it)" ""
  ask IPMOS_LICENSE  "Chiave di licenza IPMOS (vuoto = prova senza licenza)" ""
  ask IPMOS_ADMIN_EMAIL "Email amministratore" "admin@${IPMOS_DOMAIN:-ipmos.local}"

  local ADMIN_PASS="${IPMOS_ADMIN_PASSWORD:-}"
  [ -z "$ADMIN_PASS" ] && ADMIN_PASS="Ipmos-$(rand 6)"

  say "Preparo $INSTALL_DIR"
  $SUDO mkdir -p "$INSTALL_DIR"
  cd "$INSTALL_DIR"

  say "Scarico lo stack IPMOS…"
  curl -fsSL "$STACK_URL" -o /tmp/ipmos-stack.tar.gz || die "Download stack fallito ($STACK_URL)."
  $SUDO tar -xzf /tmp/ipmos-stack.tar.gz -C "$INSTALL_DIR" --strip-components=1
  rm -f /tmp/ipmos-stack.tar.gz

  if [ ! -f "$INSTALL_DIR/.env" ]; then
    say "Genero configurazione (.env)…"
    $SUDO tee "$INSTALL_DIR/.env" >/dev/null <<EOF
DB_ROOT_PASSWORD=$(rand 16)
DB_PASSWORD=$(rand 16)
REDIS_PASSWORD=$(rand 12)
JWT_SECRET=$(rand 32)
COOKIE_SECRET=$(rand 32)
CLIENT_URL=https://${IPMOS_DOMAIN:-localhost}
LICENSE_SERVER_URL=${LICENSE_SERVER}
INSTANCE_ID=ipmos-$(rand 6)
LICENSE_KEY=${IPMOS_LICENSE}
ADMIN_EMAIL=${IPMOS_ADMIN_EMAIL}
ADMIN_PASSWORD=${ADMIN_PASS}
DOMAIN=${IPMOS_DOMAIN:-localhost}
EOF
  else
    say ".env esistente: lo mantengo."
  fi

  install_docker

  say "Avvio lo stack (build immagini, può richiedere qualche minuto)…"
  cd "$INSTALL_DIR"
  $SUDO docker compose up -d --build

  say "Attendo che l'API risponda…"
  ok=0
  for i in $(seq 1 40); do
    if curl -fsS http://127.0.0.1:3000/api/health >/dev/null 2>&1; then ok=1; break; fi
    sleep 6
  done

  echo
  if [ "$ok" = "1" ]; then
    printf "%s\n" "${C_G}${C_B}✓ IPMOS installato e in esecuzione${C_X}"
  else
    printf "%s\n" "${C_R}L'API non risponde ancora. Controlla:  docker compose -f $INSTALL_DIR/docker-compose.yml logs -f api${C_X}"
  fi
  echo
  echo "  Pannello:   http://${IPMOS_DOMAIN:-<IP-del-server>}/   (configura HTTPS con un reverse proxy)"
  echo "  Frontend:   http://127.0.0.1:5173"
  echo "  API:        http://127.0.0.1:3000/api/health"
  echo "  Admin:      ${IPMOS_ADMIN_EMAIL}"
  echo "  Password:   ${ADMIN_PASS}"
  [ -n "${IPMOS_LICENSE:-}" ] && echo "  Licenza:    ${IPMOS_LICENSE}"
  echo
  echo "  Gestione:   cd $INSTALL_DIR && docker compose [ps|logs -f|restart|down]"
  echo "  Aggiorna:   curl -fsSL https://ipmos.eu/install.sh | bash"
  echo
}

main "$@"
