#!/usr/bin/env bash
# install-telegram.sh — Install Telegram Desktop from the latest official Linux build.
# Hardened: official download endpoint, arch-aware, idempotent, --dry-run.

set -euo pipefail
IFS=$'\n\t'

readonly SCRIPT_NAME="${0##*/}"
DRY_RUN=0
DOWNLOAD_URL="https://telegram.org/dl/desktop/linux"

usage() {
  cat <<EOF
Usage: sudo $SCRIPT_NAME [--dry-run] [--help]

Downloads Telegram Desktop from Telegram's official latest Linux endpoint,
installs it to /opt/Telegram, creates /usr/local/bin/telegram-desktop, and
installs a desktop launcher.

Options:
  --dry-run    Print actions without executing.
  --help, -h   Show this help.
EOF
}

log()  { printf '\033[1;34m[%s]\033[0m %s\n' "${SCRIPT_NAME%.sh}" "$*"; }
die()  { printf '\033[1;31m[%s] ERROR:\033[0m %s\n' "${SCRIPT_NAME%.sh}" "$*" >&2; exit 1; }
run()  { if (( DRY_RUN )); then printf '  DRY-RUN: %s\n' "$*"; else eval "$@"; fi; }
trap 'rc=$?; (( rc )) && printf "\033[1;31m[%s] failed at line %s (exit %d)\033[0m\n" "${SCRIPT_NAME%.sh}" "$LINENO" "$rc" >&2' ERR

while (( $# )); do
  case "$1" in
    --dry-run) DRY_RUN=1 ;;
    -h|--help) usage; exit 0 ;;
    *) die "Unknown argument: $1 (try --help)" ;;
  esac
  shift
done

(( EUID == 0 )) || die "Must run as root. Try: sudo $SCRIPT_NAME"

[[ -r /etc/os-release ]] || die "/etc/os-release not found."
# shellcheck disable=SC1091
. /etc/os-release
case "${ID:-}:${ID_LIKE:-}" in
  *ubuntu*|*debian*) : ;;
  *) die "Unsupported distro: ${PRETTY_NAME:-unknown}." ;;
esac

MACHINE="$(uname -m)"
case "$MACHINE" in
  x86_64|amd64) : ;;
  *) die "Telegram's official Linux desktop tarball targets x86_64 (detected: $MACHINE)." ;;
esac
log "Detected: ${PRETTY_NAME:-unknown}, arch: $MACHINE"

export DEBIAN_FRONTEND=noninteractive
log "Installing prerequisites..."
run "apt-get update -qq"
run "apt-get install -y curl ca-certificates tar xz-utils desktop-file-utils hicolor-icon-theme"

STAGE="$(mktemp -d -t telegram.XXXXXX)"
trap 'rm -rf "$STAGE"' EXIT
ARCHIVE="$STAGE/telegram.tar.xz"

log "Downloading latest Telegram Desktop..."
run "curl -fL -o '$ARCHIVE' '$DOWNLOAD_URL'"

if (( DRY_RUN )); then
  printf '  DRY-RUN: extract %s\n' "$ARCHIVE"
  printf '  DRY-RUN: install Telegram to /opt/Telegram\n'
  printf '  DRY-RUN: create /usr/local/bin/telegram-desktop symlink and desktop launcher\n'
  log "Done."
  exit 0
fi

log "Extracting Telegram..."
run "tar -xJf '$ARCHIVE' -C '$STAGE'"
[[ -x "$STAGE/Telegram/Telegram" ]] || die "Unexpected archive layout: Telegram/Telegram not found."

log "Installing Telegram..."
run "rm -rf /opt/Telegram"
run "install -d -m 0755 /opt"
run "cp -a '$STAGE/Telegram' /opt/Telegram"
run "ln -sfn /opt/Telegram/Telegram /usr/local/bin/telegram-desktop"

run "install -d -m 0755 /usr/share/applications /usr/share/icons/hicolor/256x256/apps"
if [[ -f /opt/Telegram/telegram.png ]]; then
  run "install -m 0644 /opt/Telegram/telegram.png /usr/share/icons/hicolor/256x256/apps/telegram.png"
fi

cat >/usr/share/applications/telegram-desktop.desktop <<'EOF'
[Desktop Entry]
Type=Application
Name=Telegram Desktop
GenericName=Messenger
Comment=Official Telegram desktop messaging app
Exec=/opt/Telegram/Telegram -- %u
Icon=telegram
Terminal=false
Categories=Network;InstantMessaging;Chat;
MimeType=x-scheme-handler/tg;
StartupNotify=false
StartupWMClass=TelegramDesktop
Keywords=telegram;chat;messenger;
EOF

run "desktop-file-validate /usr/share/applications/telegram-desktop.desktop"
run "update-desktop-database /usr/share/applications"
run "gtk-update-icon-cache -f -t /usr/share/icons/hicolor >/dev/null 2>&1 || true"
if command -v xdg-mime >/dev/null 2>&1; then
  run "xdg-mime default telegram-desktop.desktop x-scheme-handler/tg || true"
fi

log "Installed: $(/opt/Telegram/Telegram --version 2>/dev/null || echo Telegram Desktop)"
log "Done."
