#!/bin/bash

# Telegram Desktop update script for Porteus
# Version: 2026-10-17
#
# Copyright 2023-2030, Blaze, Dankov, Russia
# All rights reserved.
#
# Redistribution and use of this script, with or without modification, is
# permitted provided that the following conditions are met:
#
# 1. Redistributions of this script must retain the above copyright
#    notice, this list of conditions and the following disclaimer.
#
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
# EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

export LC_ALL=C
set -euo pipefail

PRGNAM=${PRGNAM:-telegram}
SRCDIR=Telegram
BUILD=${BUILD:-1}
OUTPUT=${OUTPUT:-/tmp}
TMPDIR=/tmp/portch
PKG="$TMPDIR/package-$PRGNAM"
PKGINFO="$PKG/var/lib/pkgtools/packages"
ARCH=$(uname -m)

BOLD=$'\033[1m'
CYAN=$'\033[96m'
GREEN=$'\033[92m'
YELLOW=$'\033[93m'
RED=$'\033[91m'
RESET=$'\033[0m'

cleanup() { rm -rf "$TMPDIR" 2>/dev/null || true; }
trap cleanup EXIT INT TERM HUP

if [ "$(id -u)" -ne 0 ]; then
  printf "\n${RED}Root required.${RESET}\n"
  exit 1
fi

printf "\nFetching latest release info...\n"
VERSION=$(
  wget -qO- "https://api.github.com/repos/telegramdesktop/tdesktop/releases/latest" |
  grep '"tag_name":' |
  sed -E 's/.*"v([^"]+)".*/\1/' || true
)

if [ -z "$VERSION" ]; then
  printf "${RED}Failed to determine version.${RESET}\n"
  exit 1
fi

SOURCE="https://github.com/telegramdesktop/tdesktop/releases/download/v${VERSION}/td-setup-linux-x64-${VERSION}.tar.xz"
TICON="https://slackbuilds.org/slackbuilds/15.0/network/telegram/telegram.png"

MYVER=""
if [ -f "/opt/telegram/Telegram" ]; then
  PKG_FILE=$(ls /var/lib/pkgtools/packages/${PRGNAM}-* 2>/dev/null | head -n 1 || true)
  if [ -n "$PKG_FILE" ]; then
    MYVER=$(basename "$PKG_FILE" | cut -d'-' -f2)
  fi
fi

if [ -n "$MYVER" ]; then
  printf "[${GREEN}OK${RESET}] Installed version: ${YELLOW}%s${RESET}\n" "${MYVER}"
  if [ "$MYVER" = "$VERSION" ]; then
    printf "Already latest: ${GREEN}%s${RESET}\n" "$VERSION"
    exit 0
  fi
else
  printf "[${CYAN}INFO${RESET}] Telegram is not installed.\n"
fi

printf "Current: ${YELLOW}%s${RESET} | Available: ${GREEN}%s${RESET}\n" "${MYVER:-None}" "$VERSION"
printf "Build ${PRGNAM} ${GREEN}${VERSION}${RESET} xzm module? [y/N]: "
IFS= read -r -n 1 -s reply || true
printf "\n"

if [[ ! ${reply:-} =~ ^[Yy]$ ]]; then
  printf "Cancelled.\n"
  exit 0
fi

rm -rf "$TMPDIR"
mkdir -p "$PKG/usr/bin" "$PKG/opt/$PRGNAM" "$PKG/usr/share/applications" "$PKG/usr/share/pixmaps"
cd "$TMPDIR" || exit 1

printf "\nDownloading ${CYAN}${BOLD}td-setup-linux-x64-%s.tar.xz${RESET}\n" "$VERSION"
if ! wget -q --show-progress "$SOURCE" -O "tsetup-${VERSION}.tar.xz"; then
  printf "${RED}Download failed.${RESET}\n"
  exit 1
fi

printf "\nExtracting archive...\n"
if ! tar xf "tsetup-${VERSION}.tar.xz"; then
  printf "${RED}Extraction failed.${RESET}\n"
  exit 1
fi

if [ ! -d "$SRCDIR" ]; then
  printf "${RED}Directory %s not found after extraction. Archive format may have changed.${RESET}\n" "$SRCDIR"
  exit 1
fi

cd "$SRCDIR" || exit 1
chown -R root:root .

find -L . \
 \( -perm 777 -o -perm 775 -o -perm 750 -o -perm 711 -o -perm 555 -o -perm 511 \) -exec chmod 755 {} \; -o \
 \( -perm 666 -o -perm 664 -o -perm 640 -o -perm 600 -o -perm 444 -o -perm 440 -o -perm 400 \) -exec chmod 644 {} \;

cp -a * "$PKG/opt/$PRGNAM/"

find "$PKG" -print0 | xargs -0 file | grep -e "executable" -e "shared object" | grep ELF \
  | cut -f 1 -d : | xargs strip --strip-unneeded 2> /dev/null || true

ln -sf /opt/$PRGNAM/Telegram "$PKG/usr/bin/"

cat > "$PKG/usr/share/applications/$PRGNAM.desktop" << EOM
[Desktop Entry]
Name=Telegram
GenericName=Internet
Comment=Telegram Desktop Chat Client
Comment[ru]=Telegram чат клиент для ПК
Icon=telegram
Exec=Telegram -- %u
TryExec=Telegram
Terminal=false
Type=Application
Categories=Network;
EOM

printf "\nDownloading icon...\n"
wget -q -P "$PKG/usr/share/pixmaps" "$TICON"

cd "$PKG" || exit 1

printf "\n${CYAN}Writing package metadata...${RESET}\n"
mkdir -p "$PKGINFO"
{
  printf "PACKAGE NAME: %s-%s-%s\n" "$PRGNAM" "$VERSION" "$ARCH"
  printf "PACKAGE DESCRIPTION:\n"
  printf "telegram: Telegram Desktop messaging app.\n"
  printf "telegram: Cloud-based mobile and desktop messaging app with a focus on security and speed.\n"
  printf "telegram: https://telegram.org/\n"
  printf "FILE LIST:\n"
  find . | grep -v '^\./var' | sed 's|^\./||' | sort
} > "$PKGINFO/${PRGNAM}-${VERSION}-${ARCH}"

printf "\n${CYAN}Building XZM module...${RESET}\n"
MODULE="$OUTPUT/${PRGNAM}-${VERSION}-${ARCH}-${BUILD}.xzm"
if ! dir2xzm "$PKG" "$MODULE"; then
  printf "\n${RED}[FAIL] Module build failed.${RESET}\n"
  exit 1
fi

if [ -f "$MODULE" ]; then
  SIZE=$(du -h "$MODULE" | cut -f1)
  printf "\n${GREEN}[OK] Module created:${RESET} ${BOLD}%s${RESET}\n" "$MODULE"
  printf "${BOLD}Size:${RESET} ${CYAN}%s${RESET}\n" "$SIZE"
  printf "${BOLD}Copy it to /porteus/modules to survive reboot.${RESET}\n\n"
else
  printf "\n${RED}[FAIL] Module was not created.${RESET}\n"
  exit 1
fi
