#!/bin/sh
# Instalador de lumo.
#
#   curl -fsSL https://lumo.gitweave.run/install | bash
#
# Variables:
#   LUMO_VERSION=0.0.1      versión concreta (por defecto, la última)
#   LUMO_INSTALL=~/.lumo    directorio de instalación (el binario va en $LUMO_INSTALL/bin)
#   LUMO_NO_MODIFY_PATH=1   no tocar los archivos de configuración del shell
#
# Descarga el binario de tu plataforma, verifica su SHA-256 contra SHA256SUMS
# e instala `lumo`. No necesita sudo.

set -eu

BASE="${LUMO_BASE_URL:-https://lumo.gitweave.run/releases}"
INSTALL_DIR="${LUMO_INSTALL:-$HOME/.lumo}"
BIN_DIR="$INSTALL_DIR/bin"

if [ -t 1 ]; then
  BOLD="$(printf '\033[1m')"; DIM="$(printf '\033[2m')"; RED="$(printf '\033[31m')"; GREEN="$(printf '\033[32m')"; RESET="$(printf '\033[0m')"
else
  BOLD=""; DIM=""; RED=""; GREEN=""; RESET=""
fi

info() { printf '%s\n' "$*"; }
fail() { printf '%serror:%s %s\n' "$RED" "$RESET" "$*" >&2; exit 1; }

command -v curl >/dev/null 2>&1 || fail "hace falta curl"
command -v tar >/dev/null 2>&1 || fail "hace falta tar"

# --- plataforma ---

os="$(uname -s)"
arch="$(uname -m)"
case "$os" in
  Darwin)
    case "$arch" in
      arm64) target="darwin-aarch64" ;;
      x86_64) fail "macOS con Intel no está soportado todavía (solo Apple Silicon)" ;;
      *) fail "arquitectura no soportada en macOS: $arch" ;;
    esac
    macos_major="$(sw_vers -productVersion | cut -d. -f1)"
    [ "$macos_major" -ge 14 ] || fail "lumo requiere macOS 14 o posterior (tienes $(sw_vers -productVersion))"
    ;;
  Linux)
    case "$arch" in
      x86_64 | amd64) target="linux-x86_64" ;;
      aarch64 | arm64) target="linux-aarch64" ;;
      *) fail "arquitectura no soportada en Linux: $arch" ;;
    esac
    libc="$(ldd --version 2>&1 | head -n1 || true)"
    case "$libc" in
      *musl*) fail "lumo requiere glibc 2.38 o posterior; musl (Alpine) no está soportado todavía" ;;
    esac
    glibc="$(printf '%s' "$libc" | grep -oE '[0-9]+\.[0-9]+$' || true)"
    if [ -n "$glibc" ]; then
      major="${glibc%%.*}"; minor="${glibc#*.}"
      if [ "$major" -lt 2 ] || { [ "$major" -eq 2 ] && [ "$minor" -lt 38 ]; }; then
        fail "lumo requiere glibc 2.38 o posterior (tienes $glibc): Ubuntu 24.04+, Debian 13+ o Fedora 39+"
      fi
    fi
    ;;
  MINGW* | MSYS* | CYGWIN* | Windows_NT)
    fail "Windows no está soportado"
    ;;
  *)
    fail "sistema operativo no soportado: $os"
    ;;
esac

# --- descarga y verificación ---

version="${LUMO_VERSION:-}"
if [ -z "$version" ]; then
  version="$(curl -fsSL "$BASE/latest")" || fail "no se pudo consultar la última versión en $BASE/latest"
fi
version="${version#v}"
archive="lumo-$target.tar.gz"
url="$BASE/v$version/$archive"

tmp="$(mktemp -d)"
trap 'rm -rf "$tmp"' EXIT INT TERM

info "Descargando ${BOLD}lumo $version${RESET} para $target ${DIM}($url)${RESET}"
curl -fSL --progress-bar "$url" -o "$tmp/$archive" || fail "no se pudo descargar $url"
curl -fsSL "$BASE/v$version/SHA256SUMS" -o "$tmp/SHA256SUMS" || fail "no se pudo descargar SHA256SUMS"

expected="$(grep " $archive\$" "$tmp/SHA256SUMS" | awk '{print $1}')"
[ -n "$expected" ] || fail "SHA256SUMS no tiene entrada para $archive"
if command -v sha256sum >/dev/null 2>&1; then
  actual="$(sha256sum "$tmp/$archive" | awk '{print $1}')"
else
  actual="$(shasum -a 256 "$tmp/$archive" | awk '{print $1}')"
fi
[ "$actual" = "$expected" ] || fail "el SHA-256 no coincide (esperado $expected, obtenido $actual): no se instaló nada"

# --- instalación ---

tar -xzf "$tmp/$archive" -C "$tmp"
mkdir -p "$BIN_DIR"
mv "$tmp/lumo" "$BIN_DIR/lumo"
chmod +x "$BIN_DIR/lumo"
installed="$("$BIN_DIR/lumo" --version 2>/dev/null)" || fail "el binario se instaló en $BIN_DIR/lumo pero no se pudo ejecutar"

info "${GREEN}$installed instalado en $BIN_DIR/lumo${RESET}"

# --- PATH ---

case ":$PATH:" in
  *":$BIN_DIR:"*) on_path=1 ;;
  *) on_path=0 ;;
esac

if [ "$on_path" -eq 0 ]; then
  shell_name="$(basename "${SHELL:-sh}")"
  rc=""
  line=""
  case "$shell_name" in
    zsh) rc="$HOME/.zshrc"; line="export PATH=\"$BIN_DIR:\$PATH\"" ;;
    bash)
      if [ "$os" = "Darwin" ]; then rc="$HOME/.bash_profile"; else rc="$HOME/.bashrc"; fi
      line="export PATH=\"$BIN_DIR:\$PATH\""
      ;;
    fish) rc="$HOME/.config/fish/config.fish"; line="fish_add_path \"$BIN_DIR\"" ;;
  esac

  if [ -n "$rc" ] && [ -z "${LUMO_NO_MODIFY_PATH:-}" ]; then
    mkdir -p "$(dirname "$rc")"
    if ! grep -qsF "$BIN_DIR" "$rc"; then
      printf '\n# lumo\n%s\n' "$line" >> "$rc"
      info "Añadido $BIN_DIR al PATH en $rc"
    fi
    info ""
    info "Abre una terminal nueva o ejecuta:"
    info "  ${BOLD}$line${RESET}"
  else
    info ""
    info "Añade lumo a tu PATH:"
    info "  ${BOLD}export PATH=\"$BIN_DIR:\$PATH\"${RESET}"
  fi
fi

info ""
info "Para empezar:"
info "  ${BOLD}lumo eval \"1 + 1\"${RESET}"
info "  ${BOLD}lumo run --allow-read=. main.js${RESET}"
