#!/bin/sh
# Установщик «Портал АУ» для Linux (Debian, Ubuntu и производные).
# Скачивает пакет .deb с сайта, проверяет контрольную сумму SHA-256 и ставит его вместе с зависимостями
# (распознавание сканов и просмотр PDF подтягиваются автоматически).
#
#   curl -fsSL https://aucase.vpluse.website/install.sh | sh
#   curl -fsSL https://aucase.vpluse.website/install.sh | sh -s -- --no-run
#
# Ключи:  --file <путь.deb>  поставить уже скачанный пакет      --yes        не задавать вопросов
#         --dry-run          показать шаги, ничего не ставить     --no-run     не запускать программу после установки
#         --uninstall        удалить программу (данные дел остаются в ~/.local/share/PortalAU)
#         --help             эта справка
# Переменная AUCASE_URL переопределяет адрес сайта (для проверки).
set -eu

BASE="${AUCASE_URL:-https://aucase.vpluse.website}"
case "$BASE" in __PUBLIC_U*) BASE="https://aucase.vpluse.website" ;; esac
BASE="${BASE%/}"
PKG="portal-au"

FILE=""; YES=0; DRY=0; RUN=1; UNINSTALL=0
while [ $# -gt 0 ]; do
  case "$1" in
    --file) shift; FILE="${1:-}" ;;
    --yes|-y) YES=1 ;;
    --dry-run) DRY=1 ;;
    --no-run) RUN=0 ;;
    --uninstall) UNINSTALL=1 ;;
    --help|-h) sed -n '2,15p' "$0" 2>/dev/null | sed 's/^# \{0,1\}//'; exit 0 ;;
    *) echo "Неизвестный ключ: $1 (справка: --help)" >&2; exit 2 ;;
  esac
  shift
done

if [ -t 1 ]; then B="$(printf '\033[1m')"; G="$(printf '\033[32m')"; R="$(printf '\033[31m')"; N="$(printf '\033[0m')"; else B=""; G=""; R=""; N=""; fi
say()  { printf '%s\n' "$*"; }
ok()   { printf '%s✓%s %s\n' "$G" "$N" "$*"; }
die()  { printf '%s✗ %s%s\n' "$R" "$*" "$N" >&2; exit 1; }
step() { printf '\n%s%s%s\n' "$B" "$*" "$N"; }
run()  { if [ "$DRY" = 1 ]; then say "  [dry-run] $*"; else "$@"; fi; }

[ "$(uname -s)" = "Linux" ] || die "Этот скрипт — для Linux. Установщик для Windows — на странице $BASE/download"
case "$(uname -m)" in x86_64|amd64) ;; *) die "Пока доступна только сборка для 64-разрядных процессоров x86_64 (у вас $(uname -m))." ;; esac

if [ -r /etc/os-release ]; then . /etc/os-release; else ID=""; ID_LIKE=""; fi
case " ${ID:-} ${ID_LIKE:-} " in
  *" debian "*|*" ubuntu "*) ;;
  *) die "Автоматическая установка поддерживается для Debian, Ubuntu и производных (Mint, Pop!_OS, Zorin…). Ваш дистрибутив: ${PRETTY_NAME:-неизвестен}. Напишите нам — добавим." ;;
esac

SUDO=""
if [ "$(id -u)" -ne 0 ]; then
  command -v sudo >/dev/null 2>&1 || die "Нужны права администратора: запустите от root или установите sudo."
  SUDO="sudo"
fi

if [ "$UNINSTALL" = 1 ]; then
  step "Удаление «Портал АУ»"
  run $SUDO apt-get remove -y "$PKG"
  ok "Программа удалена. Данные дел сохранены в ~/.local/share/PortalAU — удалите папку вручную, если они больше не нужны."
  exit 0
fi

fetch() { # fetch <url> <файл>
  if command -v curl >/dev/null 2>&1; then curl -fsSL --retry 3 -o "$2" "$1"
  elif command -v wget >/dev/null 2>&1; then wget -q -O "$2" "$1"
  else die "Нужен curl или wget: sudo apt install curl"; fi
}

TMP="$(mktemp -d)"; trap 'rm -rf "$TMP"' EXIT INT TERM

if [ -n "$FILE" ]; then
  [ -r "$FILE" ] || die "Файл не найден: $FILE"
  DEB="$FILE"
  step "Установка из файла $DEB"
else
  step "1/3. Проверяю последнюю версию на $BASE"
  fetch "$BASE/downloads/manifest.json" "$TMP/manifest.json" || die "Не удалось получить список версий с $BASE. Проверьте интернет или скачайте пакет вручную: $BASE/download"
  FLAT="$(tr -d ' \n\r\t' < "$TMP/manifest.json")"
  OBJ="$(printf '%s' "$FLAT" | sed -n 's/.*"deb":{\([^}]*\)}.*/\1/p')"
  NAME="$(printf '%s' "$OBJ" | sed -n 's/.*"file":"\([^"]*\)".*/\1/p')"
  SHA="$(printf '%s' "$OBJ" | sed -n 's/.*"sha256":"\([0-9a-fA-F]*\)".*/\1/p')"
  VER="$(printf '%s' "$FLAT" | sed -n 's/.*"version":"\([^"]*\)".*/\1/p')"
  [ -n "$NAME" ] || die "Пакет для Linux пока не опубликован. Загляните на $BASE/download позже."
  case "$NAME" in *[!A-Za-z0-9._+-]*|"") die "Некорректное имя файла в манифесте." ;; esac
  case "$NAME" in *.deb) ;; *) die "Некорректное имя файла в манифесте." ;; esac
  say "  версия ${VER:-?}, файл $NAME"

  step "2/3. Скачиваю"
  DEB="$TMP/$NAME"
  if [ "$DRY" = 1 ]; then say "  [dry-run] скачал бы $BASE/downloads/$NAME"; else fetch "$BASE/downloads/$NAME" "$DEB"; fi
  if [ "$DRY" != 1 ]; then
    if [ -n "$SHA" ]; then
      GOT="$(sha256sum "$DEB" | cut -d' ' -f1)"
      [ "$GOT" = "$(printf '%s' "$SHA" | tr 'A-F' 'a-f')" ] || die "Контрольная сумма не совпала — файл повреждён или подменён. Установка прервана."
      ok "Контрольная сумма SHA-256 совпала"
    else
      say "  (в манифесте нет контрольной суммы — проверка пропущена)"
    fi
  fi
fi

step "3/3. Устанавливаю (потребуется несколько минут: подтянутся зависимости)"
if [ "$DRY" = 1 ]; then
  say "  [dry-run] $SUDO apt-get install -y $DEB"
else
  [ -n "$SUDO" ] && say "  Система может запросить пароль для sudo."
  $SUDO apt-get update -qq || true
  $SUDO apt-get install -y "$DEB"
fi
if [ "$DRY" = 1 ]; then say "[dry-run] ничего не установлено"; else ok "«Портал АУ» установлен"; fi

if [ "$RUN" = 1 ] && [ "$DRY" != 1 ] && [ -n "${DISPLAY:-}${WAYLAND_DISPLAY:-}" ]; then
  BIN="$(dpkg -L "$PKG" 2>/dev/null | grep -m1 '^/usr/bin/' || true)"
  [ -n "$BIN" ] || BIN="$(command -v portal-au || true)"
  if [ -n "$BIN" ]; then say "Запускаю программу…"; nohup "$BIN" >/dev/null 2>&1 & fi
fi

say ""
say "Готово. Запуск: значок «Портал АУ» в меню приложений или команда portal-au."
say "При первом входе зарегистрируйтесь — 7 дней бесплатно для вашего бюро. Данные дел хранятся только на этом компьютере."
say "Удалить: sh install.sh --uninstall"
