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

BASE_URL="${TCODE_BASE_URL:-https://tcode.triagehub.ai/tcode}"
BIN_URL="$BASE_URL/tcode-linux-x64.gz"
SHA_URL="$BASE_URL/tcode-linux-x64.gz.sha256"
RES_URL="$BASE_URL/tcode-resources-linux-x64.tar.gz"
RES_SHA_URL="$BASE_URL/tcode-resources-linux-x64.tar.gz.sha256"
INSTALL_DIR="${TCODE_INSTALL_DIR:-$HOME/.local/bin}"
DATA_HOME="${XDG_DATA_HOME:-$HOME/.local/share}"
RESOURCE_DIR="${TCODE_RESOURCE_DIR:-$DATA_HOME/triagecode/resources}"
BIN_PATH="$INSTALL_DIR/tcode"
TMP_DIR="$(mktemp -d)"

cleanup() {
  rm -rf "$TMP_DIR"
}
trap cleanup EXIT INT TERM

say() {
  printf '%s\n' "$*"
}

fail() {
  printf 'erro: %s\n' "$*" >&2
  exit 1
}

need_cmd() {
  command -v "$1" >/dev/null 2>&1 || fail "comando obrigatório não encontrado: $1"
}

download() {
  url="$1"
  out="$2"
  if command -v curl >/dev/null 2>&1; then
    curl -fL --retry 3 --connect-timeout 10 "$url" -o "$out"
  elif command -v wget >/dev/null 2>&1; then
    wget -O "$out" "$url"
  else
    fail "instale curl ou wget para baixar o TriageCode"
  fi
}

case "$(uname -s)-$(uname -m)" in
  Linux-x86_64|Linux-amd64) ;;
  *) fail "este instalador de teste suporta apenas Linux x86_64 por enquanto" ;;
esac

need_cmd gzip
need_cmd chmod
need_cmd mkdir
need_cmd tar

say "TriageCode: baixando pacote Linux x86_64..."
download "$BIN_URL" "$TMP_DIR/tcode-linux-x64.gz"

if command -v sha256sum >/dev/null 2>&1; then
  if download "$SHA_URL" "$TMP_DIR/tcode-linux-x64.gz.sha256"; then
    (cd "$TMP_DIR" && sha256sum -c tcode-linux-x64.gz.sha256) || fail "checksum do pacote não confere"
  else
    say "aviso: checksum indisponível; continuando sem validação sha256"
  fi
fi

mkdir -p "$INSTALL_DIR"
if [ -f "$BIN_PATH" ] && [ ! -f "$BIN_PATH.bak" ]; then
  cp "$BIN_PATH" "$BIN_PATH.bak"
  say "backup criado em $BIN_PATH.bak"
fi

gzip -dc "$TMP_DIR/tcode-linux-x64.gz" > "$BIN_PATH"
chmod +x "$BIN_PATH"
if [ ! -f "$INSTALL_DIR/package.json" ]; then
  cat > "$INSTALL_DIR/package.json" <<'JSON'
{
  "name": "triagecode",
  "version": "0.1.0",
  "type": "module",
  "piConfig": {
    "name": "pi",
    "configDir": ".pi"
  }
}
JSON
fi

if [ -f "$RESOURCE_DIR/package.json" ] && [ -d "$RESOURCE_DIR/node_modules" ] && [ "${TCODE_FORCE_RESOURCES:-0}" != "1" ]; then
  say "TriageCode: recursos curados já instalados em $RESOURCE_DIR"
else
  say "TriageCode: baixando recursos curados do COPILOTO..."
  if download "$RES_URL" "$TMP_DIR/tcode-resources-linux-x64.tar.gz"; then
  if command -v sha256sum >/dev/null 2>&1; then
    if download "$RES_SHA_URL" "$TMP_DIR/tcode-resources-linux-x64.tar.gz.sha256"; then
      (cd "$TMP_DIR" && sha256sum -c tcode-resources-linux-x64.tar.gz.sha256) || fail "checksum dos recursos não confere"
    else
      say "aviso: checksum dos recursos indisponível; continuando sem validação sha256"
    fi
  fi
  mkdir -p "$RESOURCE_DIR"
  tar -xzf "$TMP_DIR/tcode-resources-linux-x64.tar.gz" -C "$RESOURCE_DIR"
  else
    say "aviso: recursos curados indisponíveis; o COPILOTO funcionará sem habilidades extras"
  fi
fi

say ""
say "TriageCode instalado em: $BIN_PATH"
say "Recursos curados em: $RESOURCE_DIR"
say ""
say "Para usar de qualquer diretório, garanta que ~/.local/bin está no PATH:"
say "  export PATH=\"\$HOME/.local/bin:\$PATH\""
say ""
say "Para deixar permanente no bash:"
say "  echo 'export PATH=\"\$HOME/.local/bin:\$PATH\"' >> ~/.bashrc"
say "  exec bash -l"
say ""
say "Teste agora:"
say "  tcode --help"
say "  tcode"
