#!/bin/sh
# O checksum fixado liga este instalador ao artefato conferido da release.
set -eu

VERSION='1.2.0'
SHA256='3980ff8059564dc431b9612c45edc29f0f92a6ea6d016d5118af3d421ae756dd'
BASE_URL='https://minio.redware.io/redware-downloads/sap-mcp'
workdir=''

cleanup() {
  if [ -n "$workdir" ]; then
    rm -rf "$workdir"
  fi
}

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

download() {
  curl --proto '=https' --proto-redir '=https' --tlsv1.2 \
    --fail --silent --show-error --location \
    --connect-timeout 20 --max-time 600 "$1" --output "$2"
}

verify_binary() {
  /usr/bin/codesign --verify --strict "$1" || fail 'A assinatura de um binário é inválida.'
  signature=$(/usr/bin/codesign --display --verbose=4 "$1" 2>&1) || fail 'Não foi possível ler a assinatura.'
  printf '%s\n' "$signature" | grep -q '^TeamIdentifier=7D576W2MC4$' || fail 'O binário pertence a outro time Apple Developer.'
  if [ "$2" = 'node' ]; then
    printf '%s\n' "$signature" | grep -q '^Identifier=com.redware.sapmcp.node$' || fail 'A identidade do runtime não corresponde ao SAP MCP.'
  fi
}

main() {
  mode='install'
  [ "$#" -le 1 ] || fail 'Use sem argumentos, --check ou --help.'
  case "${1:-}" in
    '') ;;
    --check) mode='check' ;;
    --help)
      printf 'SAP MCP %s\n\nSem argumentos: baixa, verifica e instala para o usuário atual.\n--check: baixa e verifica, sem instalar.\n' "$VERSION"
      return 0
      ;;
    *) fail 'Opção desconhecida. Use --check ou --help.' ;;
  esac

  [ "$(uname -s)" = 'Darwin' ] || fail 'Esta versão requer macOS com Apple Silicon.'
  [ "$(/usr/sbin/sysctl -n hw.optional.arm64 2>/dev/null || true)" = '1' ] || fail 'Esta versão requer um Mac com Apple Silicon. Macs Intel não são atendidos.'
  [ "$(id -u)" -ne 0 ] || fail 'Execute como seu usuário, sem sudo.'
  for tool in curl shasum ditto codesign; do
    command -v "$tool" >/dev/null 2>&1 || fail "Ferramenta necessária não encontrada: $tool."
  done

  workdir=$(mktemp -d "${TMPDIR:-/tmp}/sap-mcp-install.XXXXXX")
  trap cleanup 0
  trap 'exit 130' 2
  trap 'exit 143' 1 15
  archive="sap-mcp-${VERSION}-macos-arm64.zip"
  printf 'Baixando SAP MCP %s para macOS Apple Silicon…\n' "$VERSION"
  download "$BASE_URL/$VERSION/$archive" "$workdir/$archive"
  download "$BASE_URL/$VERSION/$archive.sha256" "$workdir/$archive.sha256"
  actual=$(shasum -a 256 "$workdir/$archive")
  actual=${actual%% *}
  [ "$actual" = "$SHA256" ] || fail 'O checksum do ZIP não corresponde ao esperado. Nada foi instalado.'
  expected="$SHA256  $archive"
  [ "$(cat "$workdir/$archive.sha256")" = "$expected" ] || fail 'O arquivo de checksum não corresponde a esta release.'

  /usr/bin/ditto -x -k "$workdir/$archive" "$workdir/extracted"
  artifact="$workdir/extracted/sap-mcp"
  [ -x "$artifact/install.sh" ] || fail 'O ZIP não contém o instalador esperado.'
  grep -qx "sap-mcp $VERSION" "$artifact/VERSION" || fail 'A versão dentro do ZIP não corresponde à solicitada.'
  verify_binary "$artifact/bin/node" node
  find "$artifact/lib/node_modules" -type f -name '*.node' -print > "$workdir/native-modules"
  while IFS= read -r binary; do
    verify_binary "$binary" native
  done < "$workdir/native-modules"
  printf 'Checksum e assinaturas conferidos.\n'

  if [ "$mode" = 'check' ]; then
    printf 'Verificação concluída. Nenhuma instalação ou configuração foi alterada.\n'
    return 0
  fi

  "$artifact/install.sh"
  entry="$HOME/Library/Application Support/sap-mcp/server/bin/sap-mcp"
  "$entry" version
  printf '\nPara registrar nos clientes de IA, execute:\n"$HOME/Library/Application Support/sap-mcp/server/bin/sap-mcp" clients register\n'
  printf '\nSe você atualizou uma instalação existente, reinicie os clientes de IA.\n'
}

# O fluxo só começa depois que o shell recebe todas as funções.
main "$@"
