#!/usr/bin/env bash
# bootstrap.sh - ponto de entrada publico do claude-forato.
#
#   curl -fsSL https://claude.tn1.top | bash
#
# Este arquivo e servido publicamente e NAO contem segredo nenhum. A autorizacao
# para clonar o repositorio privado vem do 'gh' ja autenticado do proprio usuario.
# Ele e autocontido de proposito: quando roda via curl, lib/common.sh ainda nao existe.

set -uo pipefail

CF_REPO_SLUG="${CF_REPO_SLUG:-foratoleo/claude-forato}"
CF_TARGET_DIR="${CF_TARGET_DIR:-$HOME/.claude-forato}"
CF_ALLOW_REAL_HOME_TOKEN='eu-sei-o-que-estou-fazendo'
: "${CF_PROTECTED_HOMES:=/home/linux}"

bs_log()  { printf '[bootstrap] %s\n' "$*" >&2; }
bs_err()  { printf '[bootstrap][ERRO] %s\n' "$*" >&2; }
bs_die()  { bs_err "$*"; exit 1; }
bs_has()  { command -v "$1" >/dev/null 2>&1; }

bs_detect_os() {
  case "$(uname -s 2>/dev/null)" in
    Linux)  printf 'linux' ;;
    Darwin) printf 'macos' ;;
    *)      printf 'desconhecido' ;;
  esac
}

bs_pkg_manager() {
  if bs_has brew; then printf 'brew'
  elif bs_has apt-get; then printf 'apt'
  elif bs_has dnf; then printf 'dnf'
  elif bs_has pacman; then printf 'pacman'
  else printf 'nenhum'; fi
}

bs_install_hint() {
  local pkg="$1"; shift
  case "$pkg" in
    apt)    printf 'sudo apt-get install -y %s' "$*" ;;
    dnf)    printf 'sudo dnf install -y %s' "$*" ;;
    pacman) printf 'sudo pacman -S --needed %s' "$*" ;;
    brew)   printf 'brew install %s' "$*" ;;
    *)      printf 'instale manualmente: %s' "$*" ;;
  esac
}

bs_guard_home() {
  local entry
  local -a protected=()
  IFS=':' read -r -a protected <<<"$CF_PROTECTED_HOMES"
  for entry in "${protected[@]}"; do
    [ -n "$entry" ] || continue
    [ "$entry" = "$HOME" ] || continue
    [ "${CF_ALLOW_REAL_HOME:-}" = "$CF_ALLOW_REAL_HOME_TOKEN" ] && return 0
    bs_err "ABORTADO: \$HOME aponta para um diretorio protegido ($HOME)."
    bs_err "Para testar, use um HOME descartavel: HOME=/tmp/cf-test bash bootstrap.sh"
    bs_err "Para instalar mesmo assim: export CF_ALLOW_REAL_HOME=$CF_ALLOW_REAL_HOME_TOKEN"
    exit 2
  done
  return 0
}

bs_check_deps() {
  local os pkg cmd
  local -a missing=()
  os="$(bs_detect_os)"
  pkg="$(bs_pkg_manager)"
  bs_log "sistema: $os | gerenciador de pacotes: $pkg"
  [ "$os" = 'desconhecido' ] && bs_log 'AVISO: sistema nao reconhecido; suporte testado em Linux e macOS'

  for cmd in git gh node python3 gpg curl unzip; do
    bs_has "$cmd" || missing+=("$cmd")
  done
  if [ "${#missing[@]}" -gt 0 ]; then
    bs_err "dependencias ausentes: ${missing[*]}"
    bs_err "instale com: $(bs_install_hint "$pkg" "${missing[*]}")"
    return 1
  fi
  bs_log 'dependencias verificadas'
  return 0
}

bs_ensure_gh_auth() {
  if gh auth status >/dev/null 2>&1; then
    bs_log 'gh ja autenticado'
    return 0
  fi
  if [ ! -t 0 ]; then
    bs_err 'gh nao esta autenticado e nao ha terminal interativo.'
    bs_err 'Rode "gh auth login" em um terminal e execute o bootstrap novamente:'
    bs_err "    bash <(curl -fsSL https://claude.tn1.top)"
    return 1
  fi
  bs_log 'gh nao autenticado; abrindo o login interativo'
  gh auth login || return 1
  gh auth status >/dev/null 2>&1
}

bs_clone() {
  if [ -d "$CF_TARGET_DIR/.git" ]; then
    bs_log "repositorio ja presente em $CF_TARGET_DIR; atualizando"
    git -C "$CF_TARGET_DIR" pull --ff-only || bs_log 'AVISO: nao foi possivel atualizar; seguindo com a copia local'
    return 0
  fi
  if [ -e "$CF_TARGET_DIR" ]; then
    bs_die "$CF_TARGET_DIR existe e nao e um clone git; mova-o antes de continuar"
  fi
  bs_log "clonando $CF_REPO_SLUG em $CF_TARGET_DIR"
  gh repo clone "$CF_REPO_SLUG" "$CF_TARGET_DIR" || return 1
}

bs_main() {
  bs_guard_home
  bs_check_deps || bs_die 'preflight do bootstrap falhou'
  bs_ensure_gh_auth || bs_die 'autenticacao do GitHub obrigatoria para clonar o repositorio privado'
  bs_clone || bs_die 'falha ao obter o repositorio'
  [ -f "$CF_TARGET_DIR/install.sh" ] || bs_die "install.sh nao encontrado em $CF_TARGET_DIR"
  bs_log 'entregando o controle ao install.sh'
  exec bash "$CF_TARGET_DIR/install.sh" "$@"
}

bs_main "$@"
