#!/usr/bin/env bash
# rustdesk-postamat-setup.sh
# Usage:
#   sudo bash rustdesk-postamat-setup.sh \
#       --server remote.qsolution.ru \
#       --password welcome123
#
# Explanation:
#  --server    : адрес hbbs (ip или домен)
#  --password  : постоянный пароль, который будет установлен
#
# Скрипт:
set -euo pipefail
IFS=$'\n\t'

### Публичный ключ сервера
SERVER_PUBLIC_KEY="00mqYd7xNScP07qVUWUfbXfKs+Ochw0YC1wSOFHlGwk="

### defaults
SERVER="remote.qsolution.ru"
PASSWORD="post#3Admin"
TMPDIR="/tmp/rustdesk_install"
ARCH=$(uname -m)

#### parse args
while [[ $# -gt 0 ]]; do
  case "$1" in
    --server) SERVER="$2"; shift 2;;
    --password) PASSWORD="$2"; shift 2;;
    --help|-h) echo "See top of script for usage"; exit 0;;
    *) echo "Unknown arg: $1"; exit 1;;
  esac
done



# arch mapping for release asset selection
case "$ARCH" in
  aarch64|arm64) ASSET_ARCH="arm64" ;;
  armv7l|armhf)   ASSET_ARCH="armhf" ;;
  x86_64|amd64)   ASSET_ARCH="x86_64" ;;
  *) ASSET_ARCH="" ;;
esac

echo "Preparing RustDesk install for arch=$ARCH -> asset arch guess: $ASSET_ARCH"
echo "Server (ID/Relay): ${SERVER:-<not set>}"
echo "Server public key: ${SERVER_PUBLIC_KEY}"
echo "Password to set: ${PASSWORD}"

# need root
if [[ $EUID -ne 0 ]]; then
  echo "Please run as root (or with sudo)."
  exit 3
fi

mkdir -p "$TMPDIR"
cd "$TMPDIR"

# 1) Try to find latest GitHub release asset matching arch and download .deb
echo "Fetching latest RustDesk release info from GitHub..."
API_URL="https://api.github.com/repos/rustdesk/rustdesk/releases/latest"

# fetch release JSON
RELEASE_JSON=$(curl -sL "$API_URL")
if [[ -z "$RELEASE_JSON" ]]; then
  echo "Failed to fetch release info. Abort."
  exit 4
fi

# Получаем все доступные .deb файлы для диагностики
echo "Available .deb packages in release:"
AVAILABLE_DEBS=$(echo "$RELEASE_JSON" \
  | grep -o -E '"browser_download_url":\s*"[^"]+' \
  | sed -E 's/.*"([^"]+)$/\1/' \
  | grep -i "\.deb")
echo "$AVAILABLE_DEBS"

# choose asset by name containing .deb and arch
if [[ -n "$ASSET_ARCH" ]]; then
  # look for common naming patterns: rustdesk-<ver>-<arch>.deb
  DOWNLOAD_URL=$(echo "$AVAILABLE_DEBS" | grep -i "$ASSET_ARCH" | head -n1 || true)
fi

# Для armhf (ARMv7) попробуем найти armhf, если не найден - попробуем универсальные варианты
if [[ -z "${DOWNLOAD_URL:-}" && "$ASSET_ARCH" == "armhf" ]]; then
  echo "armhf package not found, trying alternative patterns..."
  # Попробуем найти по другим паттернам для ARM
  DOWNLOAD_URL=$(echo "$AVAILABLE_DEBS" | grep -E "(armv7|arm32|armhf)" | head -n1 || true)
fi

# fallback: find any .deb (берем первый найденный)
if [[ -z "${DOWNLOAD_URL:-}" ]]; then
  echo "No architecture-specific package found, using first available .deb"
  DOWNLOAD_URL=$(echo "$AVAILABLE_DEBS" | head -n1 || true)
fi

if [[ -z "${DOWNLOAD_URL:-}" ]]; then
  echo "Could not find a .deb asset in latest release. You may need to install rustdesk manually."
  exit 5
fi

echo "Found asset: $DOWNLOAD_URL"
echo "Downloading..."
curl -L -o rustdesk.deb "$DOWNLOAD_URL"

# Проверяем архитектуру скачанного пакета
echo "Checking package architecture..."
PACKAGE_ARCH=$(dpkg --info rustdesk.deb | grep "Architecture:" | awk '{print $2}')
SYSTEM_ARCH=$(dpkg --print-architecture)
echo "Package architecture: $PACKAGE_ARCH"
echo "System architecture: $SYSTEM_ARCH"

if [[ "$PACKAGE_ARCH" != "$SYSTEM_ARCH" && "$PACKAGE_ARCH" != "all" ]]; then
  echo "WARNING: Package architecture ($PACKAGE_ARCH) doesn't match system ($SYSTEM_ARCH)"
  echo "This may cause installation issues. Consider downloading a different package."
  
  # Для ARMv7 системы может подойти arm64 пакет только если система поддерживает эмуляцию
  if [[ "$SYSTEM_ARCH" == "armhf" && "$PACKAGE_ARCH" == "arm64" ]]; then
    echo "ERROR: arm64 package cannot be installed on armhf system"
    echo "RustDesk may not have an armhf build available for this version."
    echo "You may need to:"
    echo "1. Use an older version of RustDesk that supports armhf"
    echo "2. Compile from source"
    echo "3. Use alternative remote desktop solution"
    exit 6
  fi
fi

# 4) Configure server settings by editing config files directly
echo "Configuring RustDesk server settings..."

# Создаем директорию конфигурации для пользователя root
sudo mkdir -p /root/.config/rustdesk

# Редактируем RustDesk2.toml для настройки сервера
CONFIG_FILE="/root/.config/rustdesk/RustDesk2.toml"
if [[ -n "$SERVER" ]]; then
  echo "Setting server to: $SERVER"
  
  # Создаем или обновляем конфигурационный файл
  sudo tee "$CONFIG_FILE" > /dev/null <<EOF
rendezvous_server = '$SERVER:21116'
nat_type = 2
serial = 0
trusted_devices = '00TzVJ1Jc4lkB6q00sWwN8TOug'

[options]
custom-rendezvous-server = '$SERVER'
relay-server = 'remote.qsolution.ru'
key = '00mqYd7xNScP07qVUWUfbXfKs+Ochw0YC1wSOFHlGwk='
EOF

  echo "Server configuration written to $CONFIG_FILE"
  
  # Копируем конфигурацию для пользователя pi
  echo "Copying configuration to user pi..."
  sudo -u pi mkdir -p /home/pi/.config/rustdesk
  sudo cp "$CONFIG_FILE" /home/pi/.config/rustdesk/RustDesk2.toml
  sudo chown pi:pi /home/pi/.config/rustdesk/RustDesk2.toml
  echo "Configuration copied to /home/pi/.config/rustdesk/RustDesk2.toml"
fi

echo "Installing required dependencies..."
apt-get update -y
apt-get install -y at-spi2-core

echo "Installing package..."
apt-get install -y ./rustdesk.deb || {
  echo "dpkg/apt install failed; trying to fix dependencies..."
  apt-get -f install -y
  dpkg -i rustdesk.deb || { echo "Install failed"; exit 6; }
}

# 3) Ensure rustdesk binary exists
if ! command -v rustdesk >/dev/null 2>&1; then
  echo "ERROR: rustdesk binary not found after install. Aborting."
  exit 7
fi

# Start rustdesk service (if package installed systemd unit)
echo "Starting rustdesk service..."
sudo systemctl start rustdesk.service 

echo "Waiting 30 sec for starting rustdesk service..."
sleep 30

# Set permanent password
if [[ -n "$PASSWORD" ]]; then
  echo "Setting permanent password for both root and pi users..."
  
  # Устанавливаем пароль от root
  echo "Setting password as root..."
  if sudo rustdesk --password "$PASSWORD"; then
    echo "✓ Password set successfully (as root)"
  else
    echo "✗ Password setup failed (as root)"
  fi
  
  # Устанавливаем пароль от пользователя pi
  echo "Setting password as user pi..."
  if sudo -u pi rustdesk --password "$PASSWORD"; then
    echo "✓ Password set successfully (as user pi)"
  else
    echo "✗ Password setup failed (as user pi)"
  fi
  
  echo "Password setup completed. If both failed, you can set it manually with:"
  echo "sudo rustdesk --password \"$PASSWORD\""
fi

# Получаем результирующий ID, сгенерированный RustDesk
echo "Getting RustDesk ID (most important result)..."
if sudo -u pi rustdesk --get-id >"$TMPDIR/rustdesk_getid.out" 2>&1; then
  RUSTDESK_ID=$(cat "$TMPDIR/rustdesk_getid.out" | tr -d '\r\n')
elif rustdesk --get-id >"$TMPDIR/rustdesk_getid.out" 2>&1; then
  RUSTDESK_ID=$(cat "$TMPDIR/rustdesk_getid.out" | tr -d '\r\n')
else
  RUSTDESK_ID="FAILED_TO_GET_ID"
fi

# Сохраняем результат установки во временную директорию
cat > "$TMPDIR/rustdesk_install_result.txt" <<EOF
rustdesk_id=${RUSTDESK_ID}
server=${SERVER}
server_public_key=${SERVER_PUBLIC_KEY}
password=${PASSWORD}
installed_from=${DOWNLOAD_URL}
installed_at=$(date -Iseconds)
EOF

echo "✓ RustDesk installation completed successfully!"
echo ""
echo "========================================"
echo "    ВАЖНО! СКОПИРУЙТЕ ЭТОТ ID:"
echo "========================================"
echo ""
echo "    RustDesk ID: $RUSTDESK_ID"
echo ""
echo "========================================"
echo ""
echo "Полная информация об установке:"
cat "$TMPDIR/rustdesk_install_result.txt"

echo ""
echo "ДЛЯ ПОДКЛЮЧЕНИЯ ИСПОЛЬЗУЙТЕ ID: $RUSTDESK_ID"
echo ""
echo "- Temporary files in $TMPDIR (left for inspection)."

# Получаем путь к текущему скрипту и удаляем его
SCRIPT_PATH="$(readlink -f "$0")"
echo ""
echo "Удаление установочного скрипта: $SCRIPT_PATH"
rm -f "$SCRIPT_PATH"

echo "Установочный скрипт удален. Система готова к работе."

exit 0
