#!/bin/bash
# Установщик HixBrain KB для macOS.
# Запускается через `curl ... | bash` ИЛИ двойным кликом в Finder
# (если файл скачали и сделали +x).
#
# Зависимости: только то, что есть в любой macOS из коробки —
# bash, perl, curl, mkdir, open. Никакого python/node/jq.
#
# Безопасность: пишет только в ~/Documents/HixBrainBase, ничего другого
# на машине не трогает.

LOG=/tmp/hixbrain-install.log
exec > >(tee -a "$LOG") 2>&1

# Хочется набрать максимум диагностики, чтобы не оставлять юзера в темноте
ts() { date '+%H:%M:%S'; }
log()  { printf "%s  %s\n" "$(ts)" "$*"; }
ok()   { printf "✓ %s\n" "$*"; }
warn() { printf "⚠ %s\n" "$*"; }
err()  { printf "✗ %s\n" "$*" >&2; }

# Если запущены через pipe (curl | bash) — stdin закрыт, не вызываем read
INTERACTIVE=0
if [ -t 0 ]; then INTERACTIVE=1; fi

pause() {
  if [ "$INTERACTIVE" = "1" ]; then
    printf "\n"
    read -r -p "Нажмите Enter для закрытия... " _ < /dev/tty || true
  else
    printf "\n(Лог установки сохранён в %s)\n" "$LOG"
  fi
}

trap 'err "Скрипт упал на строке $LINENO."; pause; exit 1' ERR

clear
cat <<'BANNER'
══════════════════════════════════════════
 HixBrain KB — установка
══════════════════════════════════════════

BANNER

# ── 0. Базовые проверки окружения ─────────────────────────────────────
for cmd in curl mkdir cp open perl uname; do
  if ! command -v "$cmd" >/dev/null 2>&1; then
    err "Не найден '$cmd'. Это базовая утилита macOS — проверьте, что система не повреждена."
    pause
    exit 1
  fi
done
ok "macOS $(sw_vers -productVersion 2>/dev/null || echo "?")"

# ── 1. Obsidian установлен? ────────────────────────────────────────────
if [ ! -d "/Applications/Obsidian.app" ]; then
  warn "Obsidian не найден в /Applications"
  log  "Открываю страницу загрузки..."
  open "https://obsidian.md/download" 2>/dev/null || true
  cat <<'NEXT'

  ┌─────────────────────────────────────────────────┐
  │ Сначала установите Obsidian (откроется в браузере). │
  │ После установки — запустите этот установщик ещё раз. │
  └─────────────────────────────────────────────────┘
NEXT
  pause
  exit 1
fi
ok "Obsidian найден"

# ── 2. Vault ──────────────────────────────────────────────────────────
VAULT="$HOME/Documents/HixBrainBase"
PLUGIN_DIR="$VAULT/.obsidian/plugins/hixbrain-kb"
PLUGINS_JSON="$VAULT/.obsidian/community-plugins.json"

VAULT_IS_NEW=1
if [ -d "$VAULT" ]; then
  VAULT_IS_NEW=0
  log "Папка $VAULT уже существует — переиспользую (без перезаписи ваших файлов)"
fi
mkdir -p "$PLUGIN_DIR"
ok "Vault: $VAULT"

# ── 3. Скачать плагин ─────────────────────────────────────────────────
BASE_URL="https://github.com/mymetrixab-creator/kb-plugin/releases/latest/download"
log "Скачиваю файлы плагина..."
for f in main.js manifest.json styles.css; do
  if curl -fsSL --max-time 60 -o "$PLUGIN_DIR/$f.tmp" "$BASE_URL/$f"; then
    mv "$PLUGIN_DIR/$f.tmp" "$PLUGIN_DIR/$f"
    printf "    ✓ %s\n" "$f"
  else
    err "$f — не удалось скачать с $BASE_URL/$f"
    err "Проверьте интернет-соединение и доступ к github.com."
    rm -f "$PLUGIN_DIR/$f.tmp"
    pause
    exit 1
  fi
done

# ── 4a. Установить базовый набор плагинов команды ─────────────────────
# Templater (шаблоны), Tasks (задачи), Kanban (доски), Calendar (daily),
# Style Settings (тонкие настройки тем).
# Пары: <github-repo>:<plugin-id-in-manifest>
BASE_PLUGINS=(
  "SilentVoid13/Templater:templater-obsidian"
  "obsidian-tasks-group/obsidian-tasks:obsidian-tasks-plugin"
  "mgmeyers/obsidian-kanban:obsidian-kanban"
  "liamcain/obsidian-calendar-plugin:calendar-beta"
  "mgmeyers/obsidian-style-settings:obsidian-style-settings"
)

log "Скачиваю базовый набор плагинов..."
INSTALLED_IDS=("hixbrain-kb")
for entry in "${BASE_PLUGINS[@]}"; do
  REPO="${entry%:*}"
  PID="${entry#*:}"
  PDIR="$VAULT/.obsidian/plugins/$PID"
  mkdir -p "$PDIR"
  ok_plugin=1
  for f in main.js manifest.json styles.css; do
    if curl -fsSL --max-time 60 -o "$PDIR/$f.tmp" \
         "https://github.com/$REPO/releases/latest/download/$f" 2>/dev/null; then
      mv "$PDIR/$f.tmp" "$PDIR/$f"
    else
      rm -f "$PDIR/$f.tmp"
      # styles.css может отсутствовать у некоторых плагинов — это норма
      if [ "$f" != "styles.css" ]; then
        ok_plugin=0
      fi
    fi
  done
  if [ "$ok_plugin" = "1" ]; then
    printf "    ✓ %s\n" "$PID"
    INSTALLED_IDS+=("$PID")
  else
    printf "    ⚠ %s — не удалось скачать (пропускаю)\n" "$PID"
    rm -rf "$PDIR"
  fi
done

# ── 4b. Включить все скачанные плагины (мерж с существующими) ─────────
# Собираем итоговый JSON-массив через perl JSON::PP.
perl -MJSON::PP -- - "$PLUGINS_JSON" "${INSTALLED_IDS[@]}" <<'PERL_EOF'
use strict; use warnings;
my $path = shift;
my @want = @ARGV;
my @list = ();
if (-f $path) {
  open my $fh, "<:utf8", $path or die "read: $!";
  local $/; my $c = <$fh>; close $fh;
  eval { my $d = decode_json($c); @list = @$d if ref $d eq "ARRAY"; 1 } or @list = ();
}
my %seen = map { $_ => 1 } @list;
for my $id (@want) {
  unless ($seen{$id}) {
    push @list, $id;
    $seen{$id} = 1;
  }
}
open my $o, ">:utf8", $path or die "write: $!";
print $o encode_json(\@list);
close $o;
PERL_EOF
ok "Включено плагинов: ${#INSTALLED_IDS[@]}"

# ── 5. Welcome — только если vault создан заново ──────────────────────
WELCOME_PATH="$VAULT/Добро пожаловать.md"
if [ "$VAULT_IS_NEW" = "1" ] && [ ! -f "$WELCOME_PATH" ]; then
  cat > "$WELCOME_PATH" <<'WELCOME'
# Добро пожаловать в HixBrain KB

Плагин установлен и включён. Что дальше:

1. Если появится окно «Доверяете ли вы автору?» — нажмите **«Доверять автору и включить плагины»**
2. Откройте настройки: **Settings → HixBrain KB** (внизу слева, в разделе сторонних плагинов)
3. Кликните **шестерёнку** справа от плагина — откроется страница входа
4. Нажмите **«Войти через Google»**
5. Возьмите **ключ приглашения** у админа и вставьте его в поле «Подключиться к серверу»

Документация: https://kb.hix.kz/
WELCOME
fi

# ── 6. Зарегистрировать vault в Obsidian ──────────────────────────────
# Без этого `open -a Obsidian /path/to/vault` НЕ откроет vault — Obsidian
# просто запустится на старом. Прописываем vault в obsidian.json напрямую.
OBSIDIAN_CONFIG="$HOME/Library/Application Support/obsidian/obsidian.json"
mkdir -p "$(dirname "$OBSIDIAN_CONFIG")"

if perl -MJSON::PP -e 'exit 0' 2>/dev/null; then
  perl -MJSON::PP -- - "$VAULT" "$OBSIDIAN_CONFIG" <<'PERL_EOF'
use strict; use warnings;
my ($vault, $config) = @ARGV;
my $data = {};
if (-f $config) {
  open(my $fh, "<:utf8", $config) or die "read $config: $!\n";
  local $/; my $content = <$fh>;
  close $fh;
  eval { $data = decode_json($content); 1 } or $data = {};
}
$data->{vaults} //= {};
# Если эта папка уже зарегистрирована — поднять open=true
my $found = 0;
for my $id (keys %{ $data->{vaults} }) {
  if (($data->{vaults}{$id}{path} // '') eq $vault) {
    # Сначала закроем все остальные vault'ы (open=false)
    for my $other (keys %{ $data->{vaults} }) {
      $data->{vaults}{$other}{open} = JSON::PP::false;
    }
    $data->{vaults}{$id}{open} = JSON::PP::true;
    $data->{vaults}{$id}{ts}   = int(time * 1000);
    $found = 1;
    last;
  }
}
unless ($found) {
  # Закроем все остальные
  for my $other (keys %{ $data->{vaults} }) {
    $data->{vaults}{$other}{open} = JSON::PP::false;
  }
  # Добавим новый
  my $vid = sprintf "%016x", int(rand(2**60));
  $data->{vaults}{$vid} = {
    path => $vault,
    ts   => int(time * 1000),
    open => JSON::PP::true,
  };
}
open(my $out, ">:utf8", $config) or die "write $config: $!\n";
print $out encode_json($data);
close $out;
PERL_EOF
  ok "Vault зарегистрирован в Obsidian"
else
  warn "Не удалось обновить obsidian.json — после старта Obsidian вручную: 'Open another vault' → выбрать $VAULT"
fi

# ── 7. Открыть Obsidian ───────────────────────────────────────────────
# Тонкость: Obsidian читает obsidian.json только при запуске. Если он
# уже запущен — наш свежий vault для него невидим до перезапуска.
# Поэтому если процесс есть, скрипт его аккуратно гасит, ждёт и стартует снова.
# Если Obsidian не запущен — просто запустим, он подхватит open=true vault.
VAULT_NAME=$(basename "$VAULT")

if pgrep -x Obsidian >/dev/null 2>&1; then
  log "Obsidian уже запущен — перезапускаю, чтобы он увидел новый vault..."
  # Корректный quit через AppleScript (даёт возможность сохранить несохранённое)
  osascript -e 'tell application "Obsidian" to quit' 2>/dev/null || true
  # Ждём до 6 сек пока процесс реально умрёт
  for _ in 1 2 3 4 5 6; do
    pgrep -x Obsidian >/dev/null 2>&1 || break
    sleep 1
  done
  # Если упёрся — форсим
  pgrep -x Obsidian >/dev/null 2>&1 && pkill -x Obsidian 2>/dev/null
  sleep 1
fi

log "Запускаю Obsidian..."
open -a Obsidian 2>/dev/null || true

cat <<'DONE'

══════════════════════════════════════════
 Готово!
══════════════════════════════════════════

Obsidian запущен на vault'е HixBrainBase.
Внутри файл «Добро пожаловать.md» — короткая инструкция что делать дальше.

Если открылся не тот vault — кликните на имя vault'а
слева внизу окна Obsidian → выберите HixBrainBase из списка.

DONE
pause
