#!/usr/bin/env bash
# Программа связи Ostalari для Linux — общий установщик с сайта, как общий установщик для Windows (владелец 08.10.2026: «версии под
# разные ОС должны быть функционально аналогичны»). Спрашивает адрес кассы и код подключения, скачивает с кассы установщик точки
# (deploy/agent/install-linux.sh: в нём уже адрес, код и план программ из вкладки «Программа связи») и запускает его.
#   curl -fsSL https://ostalari.com/agent/linux-installer | sudo bash
#   curl -fsSL https://ostalari.com/agent/linux-installer | sudo bash -s -- --server 192.168.0.50 --code ABCD2345
# Код подключения не тратится при скачивании: касса только читает его; расходует его сам установщик точки, обменивая на токен.
# Всё тело — в функции: bash читает скрипт из трубы целиком до запуска, и вопросы через /dev/tty не съедят его хвост.
set -euo pipefail
main(){
  local server="${OSTALARI_SERVER:-}" code="${OSTALARI_CODE:-}" tmp rc
  while [ $# -gt 0 ]; do
    case "$1" in
      --server) server="${2:-}"; shift 2 ;;
      --code) code="${2:-}"; shift 2 ;;
      *) echo "Неизвестный параметр $1. Запуск: … | sudo bash -s -- --server <адрес кассы> --code <код подключения>"; exit 1 ;;
    esac
  done
  [ "$(id -u)" = "0" ] || { echo "Запустите через sudo: программа связи ставится службой системы."; exit 1; }
  if [ -z "$server" ] || [ -z "$code" ]; then
    # Терминал должен реально открываться: в контейнере или по cron /dev/tty есть, но не открывается.
    { : </dev/tty; } 2>/dev/null || { echo "Нет терминала для вопросов. Запустите так: curl … | sudo bash -s -- --server <адрес кассы> --code <код подключения>"; exit 1; }
    echo "Адрес кассы и код подключения есть в кассе: «Настройки точки», вкладка «Программа связи»."
    [ -n "$server" ] || read -r -p "Адрес кассы (например 192.168.0.50 или https://kafe.ostalari.com): " server </dev/tty
    [ -n "$code" ] || read -r -p "Код подключения: " code </dev/tty
  fi
  server="${server%/}"
  case "$server" in http://*|https://*) ;; *) server="http://$server" ;; esac
  case "${server#*://}" in ""|*[!A-Za-z0-9.:/_~-]*) echo "Адрес кассы записан неверно: $server"; exit 1 ;; esac
  code="$(printf '%s' "$code" | tr -d ' -' | tr '[:lower:]' '[:upper:]')"
  printf '%s' "$code" | grep -Eq '^[A-Z2-9]{8}$' || { echo "Код подключения — восемь букв и цифр, как в кассе. Проверьте его и запустите ещё раз."; exit 1; }
  command -v curl >/dev/null 2>&1 || { echo "Нужен curl: sudo apt-get install -y curl"; exit 1; }
  echo "Скачиваю установщик программы связи с кассы $server"
  tmp="$(mktemp)"
  if ! curl -fsSL "$server/agent/linux/$code" -o "$tmp"; then
    rm -f "$tmp"
    echo "Касса не отдала установщик. Проверьте адрес и код: код действует ограниченное время, новый — в кассе, «Настройки точки», вкладка «Программа связи»."
    exit 1
  fi
  if bash "$tmp" </dev/null; then rc=0; else rc=$?; fi
  rm -f "$tmp"
  exit "$rc"
}
main "$@"
