#!/usr/bin/env bash
# =============================================================================
#  CircuitPal Studio: kurulum (macOS / Linux)
#
#      curl -fsSL https://axion-robot.com/install.sh | bash
#
#  ── ⚠ BU BETİK NE YAPAR ────────────────────────────────────────────────────
#  1. Sisteminizi tanır (işletim sistemi + işlemci mimarisi)
#  2. Yayındaki sürümü sunucudan sorar
#  3. Kurulum dosyasını indirir ve SHA-256 ile DOĞRULAR
#  4. Uygulamayı kurar
#  5. İsterseniz yerel yapay zekâ (Gemma 3n E4B) desteğini kurar
#
#  ── ⚠ NEDEN DOĞRULAMA ZORUNLU ──────────────────────────────────────────────
#  İnternetten indirilen bir uygulamayı sormadan çalıştırmak, güvendiğiniz
#  şeyin ağdaki herkes olduğu anlamına gelir. İndirilen dosyanın özeti
#  sunucunun bildirdiğiyle tutmazsa kurulum DURUR.
#
#  ── ⚠ NEDEN "| bash" GÜVENLİ DEĞİL SAYILIR ─────────────────────────────────
#  Bu betiği okumadan çalıştırmak zorunda değilsiniz. Önce indirin, okuyun,
#  sonra çalıştırın:
#      curl -fsSL https://axion-robot.com/install.sh -o install.sh
#      less install.sh && bash install.sh
# =============================================================================
set -euo pipefail

API="${AXION_API:-https://api.axion-robot.com}"
SITE="https://axion-robot.com"

# ── Renkler: terminal desteklemiyorsa (boru, günlük) sessizce boş kalır ──────
if [ -t 1 ] && [ "${TERM:-dumb}" != "dumb" ]; then
  K=$'\033[31m'; Y=$'\033[32m'; S=$'\033[33m'; M=$'\033[36m'
  B=$'\033[1m'; D=$'\033[2m'; N=$'\033[0m'
else
  K=''; Y=''; S=''; M=''; B=''; D=''; N=''
fi

# Kullanıcı etkileşimi: `curl | bash` ile gelindiğinde stdin BORUDUR, oradan
# cevap okunamaz. Terminal varsa /dev/tty'den okunur; yoksa varsayılan seçilir.
if [ -r /dev/tty ]; then ETKILESIMLI=1; else ETKILESIMLI=0; fi

cizgi() { printf '%s%s%s\n' "$D" "────────────────────────────────────────────────────────────" "$N"; }
baslik() { printf '\n%s%s%s\n' "$B" "$1" "$N"; cizgi; }
adim()  { printf '  %s▸%s %s\n' "$M" "$N" "$1"; }
tamam() { printf '  %s✓%s %s\n' "$Y" "$N" "$1"; }
uyari() { printf '  %s!%s %s\n' "$S" "$N" "$1"; }
olum()  { printf '\n  %s✗ %s%s\n\n' "$K" "$1" "$N" >&2; exit 1; }

sor() {                       # sor "Soru" varsayılan(e/h)
  local soru="$1" varsayilan="${2:-e}" yanit
  if [ "$ETKILESIMLI" -eq 0 ]; then
    printf '  %s?%s %s %s(varsayılan: %s)%s\n' "$M" "$N" "$soru" "$D" "$varsayilan" "$N"
    [ "$varsayilan" = "e" ]; return
  fi
  printf '  %s?%s %s [%s] ' "$M" "$N" "$soru" "$([ "$varsayilan" = e ] && echo 'E/h' || echo 'e/H')"
  read -r yanit < /dev/tty || yanit=""
  yanit="${yanit:-$varsayilan}"
  case "$yanit" in e|E|evet|y|Y|yes) return 0 ;; *) return 1 ;; esac
}

logo() {
  printf '\n'
  printf '   %s%s   ▄▄▄▄   %s\n' "$B" "$M" "$N"
  printf '   %s%s  ██  ██  %s  %sAxion Robot%s · CircuitPal Studio\n' "$B" "$M" "$N" "$B" "$N"
  printf '   %s%s  ██████  %s  %sDefining the Route Ahead%s\n' "$B" "$M" "$N" "$D" "$N"
  printf '   %s%s  ██  ██  %s\n' "$B" "$M" "$N"
  printf '\n'
}

# ── 1. Sistemi tanı ─────────────────────────────────────────────────────────
sistemi_tani() {
  local os arch
  os="$(uname -s)"; arch="$(uname -m)"
  case "$os" in
    Darwin) case "$arch" in
              arm64) PLATFORM='mac-arm'; ADI='macOS (Apple Silicon)' ;;
              x86_64) PLATFORM='mac-x64'; ADI='macOS (Intel)' ;;
              *) olum "Bilinmeyen Mac mimarisi: $arch" ;;
            esac ;;
    Linux)  case "$arch" in
              x86_64|amd64) PLATFORM='linux'; ADI='Linux (x86_64)' ;;
              aarch64|arm64) PLATFORM='linux'; ADI='Linux (arm64)' ;;
              *) olum "Bilinmeyen Linux mimarisi: $arch" ;;
            esac ;;
    *) olum "Bu betik macOS ve Linux içindir. Windows için:  irm ${SITE}/install-app | iex" ;;
  esac
}

# ── 2. Gereksinimler ────────────────────────────────────────────────────────
gerekli() {
  local eksik=()
  for k in curl; do command -v "$k" >/dev/null 2>&1 || eksik+=("$k"); done
  command -v shasum >/dev/null 2>&1 || command -v sha256sum >/dev/null 2>&1 || eksik+=("shasum/sha256sum")
  [ "${#eksik[@]}" -eq 0 ] || olum "Şunlar gerekli ama bulunamadı: ${eksik[*]}"
}

ozet_al() {                   # ozet_al <dosya>
  if command -v shasum >/dev/null 2>&1; then shasum -a 256 "$1" | cut -d' ' -f1
  else sha256sum "$1" | cut -d' ' -f1; fi
}

# ── 3. Sürümü sor ───────────────────────────────────────────────────────────
surumu_sor() {
  adim "Yayındaki sürüm soruluyor…"
  local manifest
  manifest="$(curl -fsSL --max-time 20 "${API}/api/v1/releases/latest" 2>/dev/null || echo '')"
  [ -n "$manifest" ] || olum "Sunucuya ulaşılamadı: ${API}"

  # jq'ya bağımlı olmamak için küçük bir ayrıştırma: manifest sabit biçimlidir.
  SURUM="$(printf '%s' "$manifest" | sed -n 's/.*"version"[[:space:]]*:[[:space:]]*"\([^"]*\)".*/\1/p')"
  [ -n "$SURUM" ] && [ "$SURUM" != "null" ] || {
    printf '\n'
    uyari "Henüz yayımlanmış bir kurulum paketi yok."
    printf '     %sŞimdilik tarayıcıdan kullanabilirsin:%s https://studio.axion-robot.com\n' "$D" "$N"
    printf '     %sYayımlandığında bu komut aynen çalışacak.%s\n\n' "$D" "$N"
    exit 0
  }

  # İlgili platformun bloğunu ayıkla
  local blok
  blok="$(printf '%s' "$manifest" | tr -d '\n ' | sed -n "s/.*\"${PLATFORM}\":{\([^}]*\)}.*/\1/p")"
  [ -n "$blok" ] || olum "Bu sürümde ${ADI} için paket yok (sürüm ${SURUM})."
  URL="$(printf '%s' "$blok" | sed -n 's/.*"url":"\([^"]*\)".*/\1/p')"
  SHA="$(printf '%s' "$blok" | sed -n 's/.*"sha256":"\([^"]*\)".*/\1/p')"
  [ -n "$URL" ] && [ -n "$SHA" ] || olum "Sürüm bilgisi eksik geldi."
  tamam "Sürüm ${B}${SURUM}${N} · ${ADI}"
}

# ── 4. İndir + doğrula ──────────────────────────────────────────────────────
indir() {
  DIZIN="$(mktemp -d)"
  trap 'rm -rf "$DIZIN"' EXIT
  DOSYA="${DIZIN}/${URL##*/}"

  adim "İndiriliyor…"
  curl -fL --progress-bar "$URL" -o "$DOSYA" || olum "İndirme başarısız."

  adim "Doğrulanıyor (SHA-256)…"
  local bulunan; bulunan="$(ozet_al "$DOSYA")"
  if [ "$bulunan" != "$SHA" ]; then
    printf '     beklenen: %s\n     bulunan : %s\n' "$SHA" "$bulunan" >&2
    olum "Dosya özeti tutmuyor. Kurulum DURDURULDU."
  fi
  tamam "Özet doğru"
}

# ── 5. Kur ──────────────────────────────────────────────────────────────────
kur() {
  case "$PLATFORM" in
    mac-arm|mac-x64)
      adim "Disk kalıbı bağlanıyor…"
      local mnt; mnt="$(hdiutil attach -nobrowse -quiet "$DOSYA" | tail -1 | awk '{$1="";$2="";sub(/^  */,"");print}')"
      [ -n "$mnt" ] || olum "Disk kalıbı bağlanamadı."
      local uygulama; uygulama="$(find "$mnt" -maxdepth 1 -name '*.app' | head -1)"
      [ -n "$uygulama" ] || { hdiutil detach "$mnt" -quiet || true; olum "Kalıbın içinde uygulama yok."; }
      adim "/Applications altına kopyalanıyor…"
      rm -rf "/Applications/$(basename "$uygulama")"
      cp -R "$uygulama" /Applications/
      hdiutil detach "$mnt" -quiet || true
      # Karantina bayrağı: indirilen uygulamayı macOS her açılışta sorgular.
      xattr -dr com.apple.quarantine "/Applications/$(basename "$uygulama")" 2>/dev/null || true
      tamam "Kuruldu: /Applications/$(basename "$uygulama")"
      ;;
    linux)
      local hedef="${HOME}/.local/bin"
      mkdir -p "$hedef"
      case "$DOSYA" in
        *.AppImage) install -m 755 "$DOSYA" "${hedef}/circuitpal-studio"
                    tamam "Kuruldu: ${hedef}/circuitpal-studio" ;;
        *.deb)      if command -v sudo >/dev/null 2>&1; then
                      adim "Paket kuruluyor (sudo gerekiyor)…"
                      sudo dpkg -i "$DOSYA" || sudo apt-get -f install -y
                      tamam "Kuruldu"
                    else olum "deb paketi için sudo gerekiyor."; fi ;;
        *)          olum "Bilinmeyen paket biçimi: $DOSYA" ;;
      esac
      case ":$PATH:" in
        *":$hedef:"*) ;;
        *) uyari "\$PATH içinde ${hedef} yok. Kabuk yapılandırmana ekle." ;;
      esac
      ;;
  esac
}

# ── 6. Yerel yapay zekâ (isteğe bağlı) ──────────────────────────────────────
#
# ⚠ NEDEN İSTEĞE BAĞLI
# Gemma 3n E4B ~4 GB yer kaplar ve makul bir hızda çalışması için yaklaşık
# 8 GB boş bellek ister. Herkesin makinesi bunu kaldırmaz; kaldırmayan bir
# makineye sessizce kurmak, uygulamayı yavaşlatmaktan başka işe yaramaz.
yerel_llm() {
  baslik "Yerel yapay zekâ (isteğe bağlı)"
  printf '  Cee (yardımcı) internet olmadan da çalışabilir: Gemma 3n E4B\n'
  printf '  modeli bilgisayarında koşar. %sYaklaşık 4 GB indirme, 8 GB boş bellek.%s\n\n' "$D" "$N"

  if ! sor "Yerel yapay zekâyı kuralım mı?" "h"; then
    adim "Atlandı. Sonra kurmak istersen: ${SITE}/docs/yerel-yapay-zeka"
    return 0
  fi

  if ! command -v ollama >/dev/null 2>&1; then
    adim "Ollama kuruluyor…"
    curl -fsSL https://ollama.com/install.sh | sh || { uyari "Ollama kurulamadı; bu adım atlandı."; return 0; }
  fi
  adim "Model indiriliyor (gemma3n:e4b)…"
  ollama pull gemma3n:e4b || { uyari "Model indirilemedi; sonra tekrar deneyebilirsin."; return 0; }
  tamam "Yerel model hazır"
}

# ── Akış ────────────────────────────────────────────────────────────────────
logo
baslik "Sistem"
sistemi_tani
gerekli
tamam "$ADI"

baslik "Sürüm"
surumu_sor

baslik "İndirme"
indir

baslik "Kurulum"
kur

yerel_llm

baslik "Hazır"
printf '  CircuitPal Studio kuruldu.\n\n'
printf '  %sSonraki adım:%s uygulamayı aç ve Axion Robot hesabınla giriş yap.\n' "$B" "$N"
printf '  Lisans anahtarın kutunun içinden ya da okulundan gelir.\n\n'
printf '  Dokümanlar : %s/docs\n' "$SITE"
printf '  Destek     : contact@axion-robot.com\n\n'
