#!/bin/sh
# Установка xSTEM Scope на один компьютер. Запускать от root:
#   sudo sh install.sh            — установить или обновить
#   sudo sh install.sh --remove   — удалить
#
# Что делает:
#   1. копирует программу в /opt/xstem-scope;
#   2. правило udev: датчик (FTDI 0403:6001) доступен тому, кто сидит за
#      компьютером (uaccess), — без группы dialout и без перезахода. Это нужно
#      и программе, и странице сайта в Chromium (Web Serial);
#   3. ярлык «xSTEM Scope» в меню и на рабочем столе всех пользователей.
set -e

DEST=/opt/xstem-scope
RULE=/etc/udev/rules.d/60-xstem-scope.rules
BIN=/usr/local/bin/xstem-scope
DESKTOP_FILE=xstem-scope.desktop
SITE=https://edu.xstem.ru/scope/
HERE=$(cd "$(dirname "$0")" && pwd)
# Файлы программы ищем рядом со скриптом (раздача по SSH) или в ../app (из репозитория)
APP=$HERE
[ -f "$APP/xstem-scope.py" ] || APP=$HERE/../app

[ "$(id -u)" = 0 ] || { echo "Нужны права root: sudo sh $0"; exit 1; }

desktop_dirs() {
  # Рабочие столы существующих пользователей и шаблон для новых
  for home in /home/*; do
    [ -d "$home" ] || continue
    for d in "$home/Desktop" "$home/Рабочий стол"; do
      [ -d "$d" ] && echo "$d"
    done
  done
  echo /etc/skel/Desktop
}

remove_all() {
  # В том числе первая версия под именем НаураСкоп
  rm -rf "$DEST" /opt/naurascope
  rm -f "$RULE" /etc/udev/rules.d/60-naurascope.rules
  rm -f "$BIN" /usr/local/bin/naurascope
  rm -f /usr/share/applications/$DESKTOP_FILE /usr/share/applications/naurascope.desktop
  desktop_dirs | while read -r d; do rm -f "$d/$DESKTOP_FILE" "$d/naurascope.desktop"; done
}

if [ "$1" = "--remove" ]; then
  remove_all
  udevadm control --reload-rules 2>/dev/null || true
  echo "xSTEM Scope удалён"
  exit 0
fi

command -v python3 >/dev/null || { echo "Нет python3 — установите пакет python3"; exit 1; }
for f in xstem-scope.py xstem-scope.js index.html b202.json experiments.json; do
  [ -f "$APP/$f" ] || { echo "Не найден $f"; exit 1; }
done

remove_all

# 1. Программа
mkdir -p "$DEST"
cp "$APP/xstem-scope.py" "$APP/xstem-scope.js" "$APP/index.html" "$APP/b202.json" "$APP/experiments.json" "$DEST/"
chmod 755 "$DEST/xstem-scope.py"
chmod 644 "$DEST/xstem-scope.js" "$DEST/index.html" "$DEST/b202.json" "$DEST/experiments.json"

# Запуск с ярлыка: окна терминала нет, поэтому ошибку показываем окном
cat > "$BIN" <<EOF
#!/bin/sh
LOG=\$(mktemp)
python3 $DEST/xstem-scope.py "\$@" 2>"\$LOG"
code=\$?
if [ \$code -ne 0 ]; then
  msg=\$(tail -n 3 "\$LOG")
  if command -v zenity >/dev/null; then zenity --error --title="xSTEM Scope" --text="\$msg"
  elif command -v kdialog >/dev/null; then kdialog --error "\$msg"
  elif command -v fly-dialog >/dev/null; then fly-dialog --error "\$msg"
  elif command -v xmessage >/dev/null; then xmessage -center "\$msg"
  elif command -v notify-send >/dev/null; then notify-send "xSTEM Scope" "\$msg"
  else echo "\$msg" >&2
  fi
fi
rm -f "\$LOG"
exit \$code
EOF
chmod 755 "$BIN"

# 2. Доступ к датчику. uaccess — доступ получает пользователь, который сейчас
# сидит за компьютером (systemd-logind), остальным — через группу dialout.
# Правило должно идти раньше 73-seat-late.rules, отсюда номер 60.
cat > "$RULE" <<'EOF'
# Датчик напряжения осциллографический НАУРА (FTDI FT232R) — для xSTEM Scope
SUBSYSTEM=="tty", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001", TAG+="uaccess", GROUP="dialout", MODE="0660"
EOF
# Без работающей службы udev правило подхватится при следующей загрузке
udevadm control --reload-rules 2>/dev/null && udevadm trigger --subsystem-match=tty 2>/dev/null \
  || echo "udev не перезагружен — правило заработает после перезагрузки компьютера"

# В Ubuntu служба brltty (для брайлевских дисплеев) забирает себе FTDI-адаптеры,
# и /dev/ttyUSB0 исчезает через секунду после подключения
if [ -f /usr/lib/udev/rules.d/85-brltty.rules ] || [ -f /lib/udev/rules.d/85-brltty.rules ]; then
  if command -v systemctl >/dev/null; then
    systemctl mask --now brltty-udev.service brltty.path 2>/dev/null || true
    echo "brltty отключён: он перехватывает датчик"
  fi
fi

# Chromium из snap (Ubuntu) по умолчанию не видит USB-порты — разрешаем
if command -v snap >/dev/null && snap list chromium >/dev/null 2>&1; then
  snap connect chromium:raw-usb 2>/dev/null && echo "Chromium (snap): доступ к USB разрешён" || true
fi

# 3. Ярлык: программа с этого компьютера — работает в любом браузере и без интернета
cat > /usr/share/applications/$DESKTOP_FILE <<'EOF'
[Desktop Entry]
Type=Application
Name=xSTEM Scope
Comment=Осциллограф из датчика НАУРА
Exec=/usr/local/bin/xstem-scope
Icon=utilities-system-monitor
Terminal=false
Categories=Education;Science;
EOF
desktop_dirs | while read -r d; do
  mkdir -p "$d"
  cp /usr/share/applications/$DESKTOP_FILE "$d/"
  chmod 755 "$d/$DESKTOP_FILE"
  owner=$(stat -c %U "$(dirname "$d")")
  [ "$owner" != root ] && chown "$owner": "$d" "$d/$DESKTOP_FILE" 2>/dev/null || true
  # GNOME спрашивает «доверять ли ярлыку» — отмечаем доверенным от имени владельца
  if [ "$owner" != root ] && command -v gio >/dev/null; then
    su "$owner" -s /bin/sh -c "gio set '$d/$DESKTOP_FILE' metadata::trusted true" 2>/dev/null || true
  fi
done

echo "xSTEM Scope установлен в $DEST"
echo "В Chromium можно и без программы: $SITE"
