#!/bin/sh
# SOKKAN self-host installer — https://sokkan.ch
# Usage : curl -fsSL https://sokkan.ch/install.sh | sh
#   SOKKAN_INSTALL_DOCKER=1   installe Docker sans poser la question (Linux)
#   SOKKAN_DIR=mon-dossier    dossier cible (défaut : ./sokkan)
set -e

BASE="${SOKKAN_BASE:-https://sokkan.ch}"
DIR="${SOKKAN_DIR:-sokkan}"
DOCKER_FRESH=0

say() { printf '%s\n' "$*"; }

install_docker() {
  say "✗ Docker n'est pas installé."
  case "$(uname -s)" in
    Linux) ;;
    Darwin)
      say "  macOS : installe Docker Desktop (https://docs.docker.com/desktop/) ou OrbStack, puis relance."
      exit 1 ;;
    *)
      say "  Installe Docker Desktop (https://docs.docker.com/desktop/), puis relance."
      exit 1 ;;
  esac
  if [ "${SOKKAN_INSTALL_DOCKER:-}" = "1" ]; then
    ans=o
  elif [ -r /dev/tty ]; then
    printf "→ L'installer maintenant via le script officiel Docker (get.docker.com, sudo requis) ? [O/n] "
    read -r ans < /dev/tty || ans=n
  else
    say "  Pour l'installer : curl -fsSL https://get.docker.com | sudo sh"
    say "  (ou relance cet installeur avec : curl -fsSL $BASE/install.sh | SOKKAN_INSTALL_DOCKER=1 sh)"
    exit 1
  fi
  case "$ans" in n*|N*) say "  → guide : https://docs.docker.com/engine/install/"; exit 1 ;; esac
  say "→ Installation de Docker (script officiel get.docker.com)…"
  curl -fsSL https://get.docker.com | sudo sh
  sudo usermod -aG docker "$(id -un)" 2>/dev/null || true
  DOCKER_FRESH=1
}

command -v docker >/dev/null 2>&1 || install_docker

# docker accessible sans sudo ? (groupe docker pas encore actif après install)
DC="docker"
docker info >/dev/null 2>&1 || DC="sudo docker"

$DC compose version >/dev/null 2>&1 || {
  say "✗ Docker est présent mais sans le plugin Compose v2 (souvent le cas des paquets distro/snap)."
  say "  Le plus simple : curl -fsSL https://get.docker.com | sudo sh  (installe docker-ce + compose proprement)"
  exit 1
}

[ -e "$DIR" ] && { say "✗ Le dossier ./$DIR existe déjà — abandon."; exit 1; }

say "→ Téléchargement de SOKKAN ($BASE/dist)…"
mkdir -p "$DIR"
curl -fsSL "$BASE/dist/sokkan-latest.tar.gz" | tar xz -C "$DIR" --strip-components=1

cd "$DIR"
cp .env.example .env
TOKEN="$(head -c 24 /dev/urandom | od -An -tx1 | tr -d ' \n')"
sed "s/^SOKKAN_LOCAL_TOKEN=.*/SOKKAN_LOCAL_TOKEN=$TOKEN/" .env > .env.tmp && mv .env.tmp .env

VER="$(curl -fsSL "$BASE/dist/VERSION" 2>/dev/null || echo '?')"
# version locale → .env : sert au check de mise à jour quotidien (opt-out
# SOKKAN_UPDATE_CHECK=0, voir .env.example)
[ "$VER" != "?" ] && printf 'SOKKAN_VERSION=%s\n' "$VER" >> .env
COMPOSE_CMD="docker compose"
[ "$DC" = "sudo docker" ] && COMPOSE_CMD="sudo docker compose"
say ""
say "✔ SOKKAN $VER installé dans ./$DIR"
say ""
say "  1. Édite $DIR/.env :"
say "       ANTHROPIC_API_KEY=…            (clé API Anthropic)"
say "       — ou, avec un abonnement Claude Pro/Max :"
say "       CLAUDE_CODE_OAUTH_TOKEN=…      (généré par : claude setup-token)"
say "       SOKKAN_WORKSPACE=/chemin/vers/ton/projet"
say ""
say "  2. cd $DIR && $COMPOSE_CMD up -d --build     (premier build ≈ 3-5 min)"
say ""
say "  3. http://localhost:3009 — token d'accès (déjà dans .env) :"
say "       $TOKEN"
say ""
say "  ☁ Pas envie de gérer l'ops ? SOKKAN Cloud : VM dédiée + réseau privé,"
say "    opéré depuis la Suisse — même code, même dépôt."
say "    → https://sokkan.ch/#cloud · démo : hello@sokkan.ch"
if [ "$DOCKER_FRESH" = "1" ]; then
  say ""
  say "  ℹ Docker vient d'être installé : après déconnexion/reconnexion de ta session,"
  say "    « docker » marchera sans sudo (groupe docker)."
fi
