#!/usr/bin/env bash
# Приложение-клиент Ostalari для Linux (08.10.2026; владелец: «приложение-клиент, чтобы не заходить через браузер», «а просто клиент
# ты не делал?»). Необязательная отдельная программа: пункт «Касса Ostalari» в меню приложений открывает кассу отдельным окном
# Chromium, Chrome, Edge или Яндекс Браузера — режимом приложения, со своим профилем. Для кассы по http:// профиль считает её адрес
# защищённым (флаг работает только со своим --user-data-dir): камера для сканера QR работает без https. Браузер выбирается при каждом
# запуске — поставили позже, подхватится. Автозапуск при входе в систему — по желанию: скрипт спрашивает, флаги --autostart и
# --no-autostart отвечают заранее; без терминала и без флага прежний выбор не меняется.
# Касса отдаёт этот файл по /client/linux со своим адресом, сайт — без адреса (тогда скрипт спросит его или возьмёт аргументом).
# От root ставится для всех пользователей, без root — для себя.
#   curl -fsSL http://<касса>/client/linux | bash
set -euo pipefail
SERVER='__CASSA_URL__' AUTOSTART='' ARGS=()
for a in "$@"; do case "$a" in --autostart) AUTOSTART=1;; --no-autostart) AUTOSTART=0;; *) ARGS+=("$a");; esac; done
case "$SERVER" in __*) SERVER=${ARGS[0]:-};; esac
if [ -z "$SERVER" ]; then
  { : </dev/tty; } 2>/dev/null || { echo "Укажите адрес кассы: curl -fsSL <адрес>/client/linux | bash -s -- http://192.168.0.50" >&2; exit 1; }
  printf 'Адрес кассы, как в браузере (например, http://192.168.0.50): ' >/dev/tty; read -r SERVER </dev/tty
fi
SERVER=${SERVER%/}
case "$SERVER" in http://?*|https://?*) ;; *) echo "Адрес кассы должен начинаться с http:// или https://, а здесь: $SERVER" >&2; exit 1;; esac
case "$SERVER" in *[!A-Za-z0-9.:/_~-]*) echo "В адресе кассы лишние символы: $SERVER" >&2; exit 1;; esac
ORIGIN=$(printf '%s' "$SERVER" | sed -E 's#^(https?://[^/]+).*#\1#')

if [ "$(id -u)" = 0 ]; then BIN=/usr/local/bin APPS=/usr/share/applications ICON=/usr/share/pixmaps/ostalari.png
else DATA=${XDG_DATA_HOME:-$HOME/.local/share}; BIN=$HOME/.local/bin APPS=$DATA/applications ICON=$DATA/icons/ostalari.png; fi
mkdir -p "$BIN" "$APPS" "$(dirname "$ICON")"

cat >"$BIN/ostalari-window" <<EOF
#!/bin/sh
# Приложение-клиент Ostalari: касса отдельным окном браузера. Записано его установщиком; запустить установщик ещё раз — обновить.
URL='$SERVER/admin' ORIGIN='$ORIGIN'
for b in chromium chromium-browser google-chrome google-chrome-stable microsoft-edge microsoft-edge-stable yandex-browser yandex-browser-stable; do
  command -v "\$b" >/dev/null 2>&1 || continue
  DATA="\${XDG_DATA_HOME:-\$HOME/.local/share}/ostalari-window"
  # Chromium из snap пишет только в свою папку внутри домашней.
  case "\$(command -v "\$b")" in /snap/*) DATA="\$HOME/snap/\$b/common/ostalari-window";; esac
  set -- --app="\$URL" --user-data-dir="\$DATA" --no-first-run --no-default-browser-check
  case "\$URL" in http://*) set -- "\$@" --unsafely-treat-insecure-origin-as-secure="\$ORIGIN";; esac
  exec "\$b" "\$@"
done
exec xdg-open "\$URL"
EOF
chmod 755 "$BIN/ostalari-window"
curl -fsS "$SERVER/icons/ostalari-512.png" -o "$ICON" </dev/null 2>/dev/null || true
printf '[Desktop Entry]\nType=Application\nName=Касса Ostalari\nComment=Касса в отдельном окне\nExec=%s\nIcon=%s\nTerminal=false\nCategories=Office;\n' "$BIN/ostalari-window" "$ICON" >"$APPS/ostalari-kassa.desktop"

# Автозапуск при входе в систему — по желанию (владелец 08.10: «автозапуск важен для всех трёх программ»).
if [ "$(id -u)" = 0 ]; then AUTO=/etc/xdg/autostart/ostalari-kassa.desktop; else AUTO=${XDG_CONFIG_HOME:-$HOME/.config}/autostart/ostalari-kassa.desktop; fi
if [ -z "$AUTOSTART" ] && { : </dev/tty; } 2>/dev/null; then
  printf 'Открывать кассу при входе в систему? [д/Н] ' >/dev/tty; answer=''; read -r answer </dev/tty || true
  case "$answer" in д*|Д*|y*|Y*) AUTOSTART=1;; *) AUTOSTART=0;; esac
fi
if [ "$AUTOSTART" = 1 ]; then mkdir -p "$(dirname "$AUTO")"; cp "$APPS/ostalari-kassa.desktop" "$AUTO"; elif [ "$AUTOSTART" = 0 ]; then rm -f "$AUTO"; fi

echo "Готово: «Касса Ostalari» в меню приложений, касса $SERVER."
if [ -f "$AUTO" ]; then echo "Касса будет открываться сама при входе в систему."; else echo "Автозапуск не включён: открывайте кассу из меню приложений."; fi
found=''; for b in chromium chromium-browser google-chrome google-chrome-stable microsoft-edge microsoft-edge-stable yandex-browser yandex-browser-stable; do command -v "$b" >/dev/null 2>&1 && { found=$b; break; }; done
if [ -z "$found" ]; then
  echo "Не нашёл Chromium, Chrome, Edge или Яндекс Браузер: касса откроется в обычном браузере, и камера для сканера у кассы по http работать не будет."
  echo "Поставьте Chromium (в Debian: sudo apt install chromium) — приложение подхватит его само."
fi
