#!/usr/bin/env bash
# Instalador Negócios com IA — prepara o computador e instala o Claude Code.
# Uso: bash -c "$(curl -fsSL https://claude.companychatia.com.br/install.sh)"
# Idempotente: se algo já estiver instalado, apenas confirma e segue.
set -euo pipefail

if [ -z "${BASH_VERSION:-}" ]; then
  echo "Este instalador precisa ser executado com bash."
  echo 'Use: bash install.sh'
  exit 1
fi

ETAPA_ATUAL="começando"

if [ "$(uname -s)" != "Darwin" ]; then
  echo "Este instalador é para macOS. No Linux, use install-linux.sh; no Windows, use install.ps1." >&2
  exit 1
fi
mac_major="$(sw_vers -productVersion | cut -d. -f1)"
if [ "$mac_major" -lt 13 ]; then
  echo "O Claude Code exige macOS 13 ou superior." >&2
  exit 1
fi

if [ -t 1 ]; then
  NEGRITO="$(printf '\033[1m')"
  VERDE="$(printf '\033[32m')"
  AMARELO="$(printf '\033[33m')"
  AZUL="$(printf '\033[34m')"
  VERMELHO="$(printf '\033[31m')"
  CIANO="$(printf '\033[36m')"
  RESET="$(printf '\033[0m')"
else
  NEGRITO=""; VERDE=""; AMARELO=""; AZUL=""; VERMELHO=""; CIANO=""; RESET=""
fi

titulo() { echo ""; echo "${NEGRITO}${AZUL}==> $1${RESET}"; }
ok() { echo "${VERDE}[ok]${RESET} $1"; }
aviso() { echo "${AMARELO}[aviso]${RESET} $1"; }
andamento() { echo "${CIANO}...${RESET} $1"; }
erro() { echo "${VERMELHO}[erro]${RESET} $1" >&2; exit 1; }

falha_com_contexto() {
  local codigo="$?"
  if [ "$codigo" -ne 0 ]; then
    echo ""
    echo "${VERMELHO}[erro]${RESET} O instalador parou durante: $ETAPA_ATUAL"
    echo "Normalmente é permissão, internet instável ou uma dependência que recusou instalação."
    echo "Pode rodar o instalador de novo: ele reaproveita o que já estiver pronto."
    echo "Se travar, anote a etapa e a mensagem exibida para pedir ajuda."
  fi
  exit "$codigo"
}
trap falha_com_contexto ERR

existe() { command -v "$1" >/dev/null 2>&1; }

PERFIL_SHELL="$HOME/.zshrc"
if [ "$(basename "${SHELL:-}")" = "bash" ]; then
  PERFIL_SHELL="$HOME/.bash_profile"
fi

adicionar_linha_unica() {
  local arquivo="$1" linha="$2"
  mkdir -p "$(dirname "$arquivo")"
  touch "$arquivo"
  grep -Fq "$linha" "$arquivo" || echo "$linha" >> "$arquivo"
}

ativar_path_agora() {
  local caminho="$1"
  [ -d "$caminho" ] || return 0
  case ":$PATH:" in
    *":$caminho:"*) ;;
    *) export PATH="$caminho:$PATH" ;;
  esac
}

persistir_path() {
  local linha="export PATH=\"$1:\$PATH\""
  adicionar_linha_unica "$PERFIL_SHELL" "$linha"
  adicionar_linha_unica "$HOME/.zshrc" "$linha"
  adicionar_linha_unica "$HOME/.zprofile" "$linha"
  adicionar_linha_unica "$HOME/.bash_profile" "$linha"
}

carregar_homebrew() {
  if existe brew; then return 0; fi
  local linha
  for caminho_brew in /opt/homebrew/bin/brew /usr/local/bin/brew; do
    if [ -x "$caminho_brew" ]; then
      eval "$("$caminho_brew" shellenv)"
      linha="eval \"\$($caminho_brew shellenv)\""
      adicionar_linha_unica "$PERFIL_SHELL" "$linha"
      adicionar_linha_unica "$HOME/.zprofile" "$linha"
      return 0
    fi
  done
  return 1
}

garantir_ferramentas_xcode() {
  ETAPA_ATUAL="Command Line Tools da Apple"
  andamento "Verificando as Command Line Tools da Apple."
  if xcode-select -p >/dev/null 2>&1; then
    ok "Command Line Tools encontradas."
    return
  fi
  aviso "Command Line Tools não encontradas. O macOS vai abrir uma janela pedindo para instalar: aceite e aguarde terminar."
  xcode-select --install >/dev/null 2>&1 || true
  until xcode-select -p >/dev/null 2>&1; do
    andamento "Aguardando a instalação das Command Line Tools terminar (confira a janela do macOS)..."
    sleep 15
  done
  ok "Command Line Tools instaladas."
}

garantir_homebrew() {
  ETAPA_ATUAL="preparação do Homebrew"
  andamento "Verificando o Homebrew."
  if carregar_homebrew; then
    ok "Homebrew pronto: $(command -v brew)"
    return
  fi
  garantir_ferramentas_xcode
  titulo "Instalando o Homebrew"
  andamento "Baixando o instalador oficial. O macOS pode pedir a senha do seu computador; nada aparece enquanto digita, e isso é normal."
  NONINTERACTIVE=1 /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" || erro "O Homebrew não foi instalado."
  carregar_homebrew || erro "Homebrew instalado, mas fora do PATH. Feche o Terminal, abra de novo e rode o instalador outra vez."
  ok "Homebrew instalado."
}

instalar_pelo_brew() {
  local formula="$1"
  ETAPA_ATUAL="instalação de $formula"
  garantir_homebrew
  if brew list --formula "$formula" >/dev/null 2>&1; then
    ok "$formula já instalado."
    return
  fi
  titulo "Instalando $formula"
  brew install "$formula" || { brew update >/dev/null 2>&1 || true; brew install "$formula"; } || erro "Falha ao instalar $formula."
}

garantir_git() {
  ETAPA_ATUAL="verificação do Git"
  ativar_path_agora /opt/homebrew/bin
  ativar_path_agora /usr/local/bin
  if existe git && git --version >/dev/null 2>&1; then
    ok "Git: $(git --version)"
    return
  fi
  instalar_pelo_brew git
  ok "Git: $(git --version)"
}

garantir_node() {
  ETAPA_ATUAL="verificação do Node.js"
  ativar_path_agora /opt/homebrew/bin
  ativar_path_agora /usr/local/bin
  if existe node && existe npm; then
    ok "Node.js: $(node --version) · npm: $(npm --version)"
    return
  fi
  instalar_pelo_brew node
  ativar_path_agora /opt/homebrew/bin
  ativar_path_agora /usr/local/bin
  existe npm || erro "npm não ficou acessível depois de instalar o Node.js."
  ok "Node.js: $(node --version) · npm: $(npm --version)"
}

instalar_claude_code() {
  ETAPA_ATUAL="instalação do Claude Code"
  andamento "Verificando o Claude Code."
  if existe claude; then
    ok "Claude Code já instalado: $(command -v claude)"
    return
  fi
  titulo "Instalando o Claude Code"
  andamento "Rodando o instalador oficial da Anthropic."
  if curl -fsSL https://claude.ai/install.sh | bash; then
    ativar_path_agora "$HOME/.local/bin"
    persistir_path "$HOME/.local/bin"
  else
    aviso "O instalador oficial falhou; tentando pelo npm."
    npm install -g --fetch-timeout=120000 --fetch-retries=3 @anthropic-ai/claude-code || erro "Falha ao instalar o Claude Code."
    ativar_path_agora "$(npm prefix -g)/bin"
    persistir_path "$(npm prefix -g)/bin"
  fi
  hash -r 2>/dev/null || true
  if existe claude; then
    ok "Claude Code instalado: $(command -v claude)"
  else
    aviso "Claude Code instalado, mas o comando ainda não apareceu nesta sessão. Feche o Terminal e abra de novo."
  fi
}

validar() {
  ETAPA_ATUAL="validação final"
  titulo "Validando"
  if existe claude; then
    claude doctor || aviso "O 'claude doctor' apontou pendências acima. Consulte a documentação para o próximo passo."
  fi
}

echo "${NEGRITO}${CIANO}"
cat <<'BANNER'
  ____                                          ____ _           _
 / ___|___  _ __ ___  _ __   __ _ _ __  _   _  / ___| |__   __ _| |_
| |   / _ \| '_ ` _ \| '_ \ / _` | '_ \| | | || |   | '_ \ / _` | __|
| |__| (_) | | | | | | |_) | (_| | | | | |_| || |___| | | | (_| | |_
 \____\___/|_| |_| |_| .__/ \__,_|_| |_|\__, | \____|_| |_|\__,_|\__|
                     |_|                |___/
BANNER
echo "${RESET}${NEGRITO}Instalador Negócios com IA — Claude Code${RESET}"
echo "Vou preparar este computador: Homebrew, Git, Node.js e o Claude Code."
echo "O que já estiver instalado eu só confirmo e sigo."

garantir_homebrew
garantir_git
garantir_node
instalar_claude_code
validar

titulo "Pronto!"
echo "Próximo passo: feche o Terminal, abra de novo e rode ${NEGRITO}claude${RESET}."
echo "Na primeira vez, o navegador abre para você conectar a sua conta Claude."
echo ""
echo "Dúvidas? Volte ao guia onde você baixou este instalador."
