#!/usr/bin/env bash
# Gacek — installer dla klienta CLI
#
# Użycie:
#   curl -fsSL https://install.gacek.bartoszgaca.pl | sh
#
# Co robi:
#   1. Wykrywa OS, arch, shell.
#   2. Pobiera binarkę z https://dl.gacek.bartoszgaca.pl/<version>/gacek-<platform>.
#   3. Weryfikuje SHA-256.
#   4. Instaluje do ~/.gacek/bin/gacek.
#   5. Próbuje symlink /usr/local/bin/gacek (bez sudo jeśli writable).
#   6. Dodaje ~/.gacek/bin do PATH w odpowiednim shell rc file.
#   7. Pokazuje DOKŁADNIE co zrobić dalej żeby `gacek` działało od razu.

set -euo pipefail

# ===== Kolory =====
# Real ESC char w zmiennej (działa w POSIX sh — `curl|sh` używa /bin/sh nie bash).
# `$(printf '\033...')` evaluuje escape przy assignment.
if [ -t 1 ] && [ "${TERM:-}" != "dumb" ]; then
  C_RESET=$(printf '\033[0m')
  C_BOLD=$(printf '\033[1m')
  C_DIM=$(printf '\033[2m')
  C_RED=$(printf '\033[31m')
  C_GREEN=$(printf '\033[32m')
  C_YELLOW=$(printf '\033[33m')
  C_CYAN=$(printf '\033[36m')
  C_WHITE=$(printf '\033[97m')
else
  C_RESET=''; C_BOLD=''; C_DIM=''
  C_RED=''; C_GREEN=''; C_YELLOW=''
  C_CYAN=''; C_WHITE=''
fi

ok()    { printf "  ${C_GREEN}✓${C_RESET} %s\n" "$1"; }
info()  { printf "  ${C_CYAN}›${C_RESET} %s\n" "$1"; }
warn()  { printf "  ${C_YELLOW}⚠${C_RESET}  %s\n" "$1"; }
fail()  { printf "  ${C_RED}✗${C_RESET} %s\n" "$1" >&2; }

DOMAIN="${GACEK_DOMAIN:-gacek.bartoszgaca.pl}"
VERSION="${GACEK_VERSION:-latest}"
DL_URL="${GACEK_DL_URL:-https://dl.${DOMAIN}}"
INSTALL_DIR="${HOME}/.gacek/bin"
BIN_NAME="gacek"

# ===== Banner =====
printf "\n"
printf "${C_RED}${C_BOLD}    ▲ ▲${C_RESET}     ${C_WHITE}${C_BOLD}Gacek${C_RESET} ${C_DIM}installer${C_RESET}\n"
printf "${C_RED}${C_BOLD}   ◣${C_WHITE}▆${C_RED}◢${C_RESET}     ${C_DIM}polski asystent CLI dla deweloperów${C_RESET}\n"
printf "${C_WHITE}${C_BOLD}   ╲${C_RED}━━${C_WHITE}╱${C_RESET}    ${C_DIM}https://gacek.bartoszgaca.pl${C_RESET}\n"
printf "${C_WHITE}${C_BOLD}    ▼${C_RESET}\n"
printf "\n"

# ===== Detect OS + arch =====
OS=""; ARCH=""
case "$(uname -s)" in
  Darwin) OS="darwin" ;;
  Linux)  OS="linux" ;;
  *) fail "Nieobsługiwany OS: $(uname -s)"; exit 1 ;;
esac
case "$(uname -m)" in
  x86_64|amd64) ARCH="x64" ;;
  arm64|aarch64) ARCH="arm64" ;;
  *) fail "Nieobsługiwana architektura: $(uname -m)"; exit 1 ;;
esac
PLATFORM="${OS}-${ARCH}"
ASSET="gacek-${PLATFORM}"
URL="${DL_URL}/${VERSION}/${ASSET}"

info "Wykryto: ${C_BOLD}${PLATFORM}${C_RESET}, wersja ${C_BOLD}${VERSION}${C_RESET}"

# ===== Download =====
mkdir -p "${INSTALL_DIR}"
TMP="$(mktemp -d)"
trap "rm -rf ${TMP}" EXIT

info "Pobieram binarkę..."
if ! curl -fsSL --output "${TMP}/${BIN_NAME}" "${URL}"; then
  fail "Pobranie nieudane: ${URL}"
  fail "Sprawdź połączenie internetowe lub status: https://gacek.bartoszgaca.pl/health"
  exit 1
fi
SIZE=$(wc -c < "${TMP}/${BIN_NAME}" | tr -d ' ')
SIZE_MB=$((SIZE / 1024 / 1024))
ok "Pobrano (${SIZE_MB} MB)"

# ===== Verify SHA-256 =====
if curl -fsSL --output "${TMP}/${BIN_NAME}.sha256" "${URL}.sha256" 2>/dev/null; then
  EXPECTED=$(awk '{print $1}' "${TMP}/${BIN_NAME}.sha256")
  if command -v sha256sum >/dev/null 2>&1; then
    ACTUAL=$(sha256sum "${TMP}/${BIN_NAME}" | awk '{print $1}')
  else
    ACTUAL=$(shasum -a 256 "${TMP}/${BIN_NAME}" | awk '{print $1}')
  fi
  if [[ "${EXPECTED}" != "${ACTUAL}" ]]; then
    fail "SHA-256 niezgodne!"
    fail "  oczekiwane: ${EXPECTED}"
    fail "  otrzymane:  ${ACTUAL}"
    exit 1
  fi
  ok "SHA-256 zgodny"
else
  warn "Brak pliku .sha256 — pomijam weryfikację"
fi

# ===== Install =====
chmod +x "${TMP}/${BIN_NAME}"
mv "${TMP}/${BIN_NAME}" "${INSTALL_DIR}/${BIN_NAME}"
ok "Zainstalowano w ${C_BOLD}${INSTALL_DIR}/${BIN_NAME}${C_RESET}"

# ===== macOS Gatekeeper (Sequoia 15+ wymaga self-sign dla cross-built binarek) =====
if [[ "${OS}" == "darwin" ]] && command -v codesign >/dev/null 2>&1; then
  if codesign --sign - --force "${INSTALL_DIR}/${BIN_NAME}" 2>/dev/null; then
    ok "Self-signed (macOS Gatekeeper)"
  fi
  # Usuń quarantine (gdy installer został pobrany przez przeglądarkę)
  xattr -d com.apple.quarantine "${INSTALL_DIR}/${BIN_NAME}" 2>/dev/null || true
fi

# ===== Symlink do /usr/local/bin (jeśli writable bez sudo) =====
SYMLINK_OK=false
if [[ -w /usr/local/bin ]] 2>/dev/null; then
  if ln -sf "${INSTALL_DIR}/${BIN_NAME}" /usr/local/bin/${BIN_NAME} 2>/dev/null; then
    ok "Symlink: ${C_BOLD}/usr/local/bin/gacek${C_RESET} → ${INSTALL_DIR}/gacek"
    SYMLINK_OK=true
  fi
fi

# ===== PATH update — wszystkie istniejące rc files + auto-utworz dla Mac bash =====
PATH_LINE='export PATH="$PATH:$HOME/.gacek/bin"'
PATH_COMMENT='# Gacek'
RC_UPDATED=()

# Mac default = bash używa .bash_profile (NIE .bashrc) — utwórz jeśli nie ma
if [[ "${OS}" == "darwin" ]] && [[ ! -f "${HOME}/.bash_profile" ]] && [[ -n "${BASH_VERSION:-}" || "${SHELL}" == */bash ]]; then
  touch "${HOME}/.bash_profile"
fi

for RC in "${HOME}/.bash_profile" "${HOME}/.bashrc" "${HOME}/.zshrc" "${HOME}/.profile" "${HOME}/.config/fish/config.fish"; do
  if [[ -f "${RC}" ]]; then
    if ! grep -q "\.gacek/bin" "${RC}" 2>/dev/null; then
      {
        printf '\n%s\n' "${PATH_COMMENT}"
        if [[ "${RC}" == *"fish"* ]]; then
          printf 'set -gx PATH $PATH $HOME/.gacek/bin\n'
        else
          printf '%s\n' "${PATH_LINE}"
        fi
      } >> "${RC}"
      RC_UPDATED+=("${RC#${HOME}/}")
    fi
  fi
done

if [[ ${#RC_UPDATED[@]} -gt 0 ]]; then
  ok "PATH dodano do: ${C_BOLD}${RC_UPDATED[*]}${C_RESET}"
fi

# ===== Sprawdź czy gacek dostępny w obecnym shell =====
export PATH="${PATH}:${INSTALL_DIR}"
BIELIK_IN_PATH=false
if command -v gacek >/dev/null 2>&1 && [[ "$(command -v gacek)" != *"alias"* ]]; then
  BIELIK_IN_PATH=true
fi

# ===== Final banner: DOKŁADNE instrukcje co dalej =====
printf "\n"
printf "${C_GREEN}${C_BOLD}  ════════════════════════════════════════════════════════${C_RESET}\n"
REAL_VERSION=$("${INSTALL_DIR}/${BIN_NAME}" --version 2>/dev/null || echo "${VERSION}")
printf "  ${C_GREEN}${C_BOLD}✓${C_RESET}  ${C_BOLD}GacekCode v${REAL_VERSION} zainstalowany${C_RESET}\n"
printf "${C_GREEN}${C_BOLD}  ════════════════════════════════════════════════════════${C_RESET}\n"
printf "\n"

if [[ "${SYMLINK_OK}" == "true" ]]; then
  printf "  ${C_BOLD}Komenda${C_RESET} ${C_CYAN}gacek${C_RESET} ${C_BOLD}działa od razu — możesz pisać:${C_RESET}\n"
  printf "\n"
  printf "    ${C_CYAN}gacek${C_RESET}                                     ${C_DIM}# pierwsza konfiguracja${C_RESET}\n"
  printf "    ${C_CYAN}gacek login --server https://${DOMAIN}${C_RESET}   ${C_DIM}# Pro mode${C_RESET}\n"
else
  printf "  ${C_YELLOW}${C_BOLD}WAŻNE:${C_RESET} żeby ${C_CYAN}${C_BOLD}gacek${C_RESET} działał z każdego cwd, wykonaj ${C_BOLD}JEDNĄ${C_RESET} z opcji:\n"
  printf "\n"

  # Opcja A: source rc file (najszybsze)
  RC_TO_SOURCE=""
  if [[ "${OS}" == "darwin" ]] && [[ "${SHELL}" == */bash ]]; then
    RC_TO_SOURCE="${HOME}/.bash_profile"
  elif [[ "${SHELL}" == */zsh ]]; then
    RC_TO_SOURCE="${HOME}/.zshrc"
  elif [[ "${SHELL}" == */bash ]]; then
    RC_TO_SOURCE="${HOME}/.bashrc"
  fi

  if [[ -n "${RC_TO_SOURCE}" ]] && [[ -f "${RC_TO_SOURCE}" ]]; then
    printf "  ${C_GREEN}${C_BOLD}Opcja A${C_RESET} (zalecane — od razu w tym terminalu):\n"
    printf "    ${C_CYAN}source ${RC_TO_SOURCE/#$HOME/\$HOME}${C_RESET}\n"
    printf "\n"
  fi

  printf "  ${C_GREEN}${C_BOLD}Opcja B:${C_RESET}\n"
  printf "    ${C_DIM}Otwórz nowy terminal (PATH zostanie załadowany przy starcie shellu)${C_RESET}\n"
  printf "\n"
  printf "  ${C_GREEN}${C_BOLD}Opcja C${C_RESET} (jeśli masz sudo):\n"
  printf "    ${C_CYAN}sudo ln -sf ~/.gacek/bin/gacek /usr/local/bin/gacek${C_RESET}\n"
  printf "\n"
  printf "  ${C_BOLD}Następnie:${C_RESET}\n"
  printf "    ${C_CYAN}gacek${C_RESET}                                     ${C_DIM}# pierwsza konfiguracja${C_RESET}\n"
  printf "    ${C_CYAN}gacek login --server https://${DOMAIN}${C_RESET}   ${C_DIM}# Pro mode${C_RESET}\n"
fi

printf "\n"
printf "  ${C_BOLD}Pomoc:${C_RESET}\n"
printf "    ${C_CYAN}gacek --help${C_RESET}\n"
printf "    ${C_DIM}https://gacek.bartoszgaca.pl${C_RESET}\n"
printf "\n"

# ===== Auto-launch (jeśli to interaktywny terminal i gacek dostępny) =====
# UWAGA: gdy install.sh leci przez `curl | sh`, stdin to pipe (nie TTY).
# Uruchamiamy gacek tylko gdy MAMY TTY (np. user dał `bash install.sh` w terminalu)
# albo BIELIK_AUTOLAUNCH=1.
if [[ -t 0 ]] || [[ "${BIELIK_AUTOLAUNCH:-}" == "1" ]]; then
  printf "  ${C_CYAN}${C_BOLD}Uruchamiam wizard za 2 sek...${C_RESET} ${C_DIM}(Ctrl+C aby anulować)${C_RESET}\n"
  sleep 2
  exec "${INSTALL_DIR}/${BIN_NAME}"
else
  # Tryb pipe: nie możemy odpalić Ink (wymaga TTY). Mówimy user'owi co zrobić.
  printf "  ${C_YELLOW}${C_BOLD}Następny krok:${C_RESET} otwórz nowy terminal i wpisz ${C_CYAN}${C_BOLD}gacek${C_RESET}\n"
  printf "\n"
fi
