#!/bin/bash

# Audacity AppImage Porteus module build script
# Version 2026-08-28
# Copyright 2023-2030, Blaze, Dankov, Russia. All rights reserved.

export LC_ALL=C
export XZ_OPT="-T0"

BOLD=$'\033[1m'; CYAN=$'\033[96m'; GREEN=$'\033[92m'; RED=$'\033[31m'; RESET=$'\033[0m'

[ "$(whoami)" != "root" ] && { printf "\n${RED}You need to be root to run this script.${RESET}\n"; exit 1; }

PRGNAM=${PRGNAM:-audacity}
BUILD=${BUILD:-1}
ARCH=$(uname -m)
CWD=$(pwd)
TMPDIR=/tmp/portch
PKG=$TMPDIR/package-$PRGNAM
PKGINFO=$PKG/var/lib/pkgtools/packages
OUTPUT=${OUTPUT:-/tmp}

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

printf "\nFetching latest release info...\n"
RELEASE_JSON=$(wget -q -O- "https://api.github.com/repos/audacity/audacity/releases/latest")
VERSION=$(printf '%s' "$RELEASE_JSON" | grep -m1 '"tag_name"' | sed -E 's/.*"Audacity-([0-9][0-9.]*).*/\1/')
DOWNLOAD_URL=$(printf '%s' "$RELEASE_JSON" | grep -oE 'https://github\.com/audacity/audacity/releases/download/Audacity-[0-9.]+/[^"]+\.AppImage' | head -n 1)

if [ -z "$VERSION" ]; then
    VERSION=$(lynx -head -dump "https://github.com/audacity/audacity/releases/latest" 2>/dev/null | grep Location | grep -o "[0-9].*$")
fi

if [ -z "$DOWNLOAD_URL" ] && [ -n "$VERSION" ]; then
    DOWNLOAD_URL="https://github.com/audacity/audacity/releases/download/Audacity-${VERSION}/audacity-linux-${VERSION}-x64-20.04.AppImage"
fi

[ -z "$VERSION" ] || [ -z "$DOWNLOAD_URL" ] && { printf "${RED}Failed to determine version or URL.${RESET}\n"; exit 1; }

INSTALLED_VERSION=""
[ -f "/opt/$PRGNAM/version.txt" ] && INSTALLED_VERSION=$(<"/opt/$PRGNAM/version.txt")

if [ "$INSTALLED_VERSION" = "$VERSION" ]; then
    printf "You have the latest ${GREEN}$INSTALLED_VERSION${RESET} version of $PRGNAM.\n"
    exit 0
else
    printf "Current: ${RED}${INSTALLED_VERSION:-None}${RESET} | Available: ${GREEN}$VERSION${RESET}\n"
    read -p "Build ${PRGNAM} ${GREEN}$VERSION${RESET} xzm module? [y/N]: " -n 1 -r -s && echo
    [[ ! $REPLY =~ ^[Yy]$ ]] && exit 0
fi

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

APPIMAGE_NAME="audacity-linux-${VERSION}-x64-20.04.AppImage"
printf "\nDownloading ${CYAN}${BOLD}$APPIMAGE_NAME${RESET}\n"
wget -q --show-progress -O "$TMPDIR/$APPIMAGE_NAME" "$DOWNLOAD_URL"

[ -s "$TMPDIR/$APPIMAGE_NAME" ] || { printf "${RED}Download failed or file is empty.${RESET}\n"; exit 1; }

printf "\nExtracting AppImage...\n"
chmod +x "$TMPDIR/$APPIMAGE_NAME"
"$TMPDIR/$APPIMAGE_NAME" --appimage-extract >/dev/null 2>&1

[ -d "squashfs-root" ] || { printf "${RED}Extraction failed: squashfs-root not found.${RESET}\n"; exit 1; }

printf "${GREEN}Extraction successful.${RESET}\n"

mv squashfs-root/* "$PKG/opt/$PRGNAM/" 2>/dev/null
mv squashfs-root/.DirIcon "$PKG/opt/$PRGNAM/" 2>/dev/null
rmdir squashfs-root 2>/dev/null
rm -f "$TMPDIR/$APPIMAGE_NAME"

APP="$PKG/opt/$PRGNAM"

# ============================================================================
# CLEANUP
# ============================================================================
printf "\n${CYAN}Cleaning up unnecessary files...${RESET}\n"

rm -rf "$APP/share/themes" "$APP/lib/girepository-1.0" "$APP/share/metainfo" \
       "$APP/share/glib-2.0" "$APP/lib/audacity/engines-1.1" \
       "$APP/usr/share/X11" "$APP/share/X11" "$APP/share/icons/hicolor/16x16" \
       "$APP/share/icons/hicolor/22x22" "$APP/share/icons/hicolor/24x24"
rm -f "$APP/bin/check_dependencies" "$APP/bin/crashpad_handler" "$APP/bin/crashreporter" "$APP/bin/ldd_recursive"
rm -f "$APP/audacity-url-handler.desktop" "$APP/share/applications/audacity-url-handler.desktop" "$APP/audacity.svg"
rm -f "$APP"/share/pixmaps/*.xpm
rm -f "$APP/audacity.desktop" "$APP/share/applications/audacity.desktop"
rm -f "$APP/lib/audacity/modules/mod-cloud-audiocom.so" "$APP/lib/audacity/modules/mod-musehub-ui.so"
rm -f "$APP/share/audacity/nyquist/nyinit-dbg.lsp" "$APP/share/audacity/nyquist/test.lsp"
# let system glib load system pcre2 (removes version warning)
rm -f "$APP/lib/libpcre2-8.so" "$APP/lib/libpcre2-8.so.0"
find "$APP" -type d \( -name licenses -o -name doc -o -name docs -o -name man -o -name info -o -name authors \) -exec rm -rf {} + 2>/dev/null
find "$APP" -type f \( -iname "README*" -o -iname "LICENSE*" -o -iname "COPYING*" -o -iname "CHANGELOG*" -o -iname "AUTHORS*" -o -iname "*.md" \) -delete 2>/dev/null

# neutralize hooks (AppRun sources them by name)
for h in install-url-handler.sh setup-gtk2-theme.sh; do
    printf '#!/bin/bash\n:\n' > "$APP/apprun-hooks/$h" 2>/dev/null
done
grep -oE 'apprun-hooks/[A-Za-z0-9._-]+\.sh' "$APP/AppRun" 2>/dev/null | sort -u | while read -r h; do
    [ -e "$APP/$h" ] || printf '#!/bin/bash\n:\n' > "$APP/$h" 2>/dev/null
done

printf "  -> Stripping binaries...\n"
find "$APP" -type f -name "*.so*" -exec strip --strip-unneeded {} + 2>/dev/null
find "$APP/bin" "$APP/usr/bin" -type f -executable -exec strip --strip-unneeded {} + 2>/dev/null

# locales: auto-detect dir, keep en + one chosen
CORE_LOCALE_DIR=$(find "$APP" -maxdepth 5 -type d -path "*/share/locale" 2>/dev/null | head -n 1)
printf "  -> Locale dir: %s\n" "${CORE_LOCALE_DIR:-not found}"
LANG_CHOICE="en"

if [ -n "$CORE_LOCALE_DIR" ]; then
    mapfile -t LANGUAGES < <(ls "$CORE_LOCALE_DIR" 2>/dev/null | grep -E '^[a-z]{2,3}([_@][A-Za-z0-9]+)*$' | sort -u)
    if [ ${#LANGUAGES[@]} -gt 0 ]; then
        printf "\n${CYAN}Audacity locale setup${RESET}\n"
        printf "Available locales (%s):\n" "${#LANGUAGES[@]}"

        COLS=5
        ROWS=$(( (${#LANGUAGES[@]} + COLS - 1) / COLS ))
        for ((i=0; i<ROWS; i++)); do
            for ((j=0; j<COLS; j++)); do
                idx=$((i + j * ROWS))
                if [ $idx -lt ${#LANGUAGES[@]} ]; then
                    num=$((idx + 1))
                    printf "  %2d) %-15s" "$num" "${LANGUAGES[$idx]}"
                fi
            done
            echo
        done

        while true; do
            echo
            read -p "Locale number to keep (en always kept) [1-${#LANGUAGES[@]}, Enter=en only]: " choice
            if [ -z "$choice" ]; then choice=0; break; fi
            [[ "$choice" =~ ^[0-9]+$ ]] && [ "$choice" -ge 1 ] && [ "$choice" -le "${#LANGUAGES[@]}" ] && break
            printf "${RED}Invalid input, try again.${RESET}\n"
        done

        [ "$choice" -gt 0 ] && LANG_CHOICE="${LANGUAGES[$((choice-1))]}"
    fi

    printf "  -> Removing locales except en and %s...\n" "$LANG_CHOICE"
    find "$CORE_LOCALE_DIR" -mindepth 1 -maxdepth 1 -type d ! -name "en*" ! -name "$LANG_CHOICE*" -exec rm -rf {} + 2>/dev/null
    printf "  -> Locales left: %s\n" "$(ls "$CORE_LOCALE_DIR" 2>/dev/null | tr '\n' ' ')"
fi

# restore lost .so symlinks
find "$APP" -type f -name "lib*.so.*" | while read -r f; do
    d=$(dirname "$f"); b=$(basename "$f")
    link="${b%%.so.*}.so"
    [ -e "$d/$link" ] || ln -s "$b" "$d/$link" 2>/dev/null
done

# expose portaudio as system lib (findlib finds it, no fallback message)
mkdir -p "$PKG/usr/lib64"
ln -sf /opt/audacity/fallback/libportaudio.so/libportaudio.so "$PKG/usr/lib64/libportaudio.so.2"
ln -sf libportaudio.so.2 "$PKG/usr/lib64/libportaudio.so"

printf "\n${GREEN}Cleanup complete.${RESET}\n"

printf '%s' "$VERSION" > "$APP/version.txt"
chmod +x "$APP/AppRun" 2>/dev/null

cp "$APP/audacity.png" "$PKG/usr/share/pixmaps/audacity.png" 2>/dev/null || \
cp "$APP/.DirIcon" "$PKG/usr/share/pixmaps/audacity.png" 2>/dev/null || \
wget -q -O "$PKG/usr/share/pixmaps/audacity.png" "https://slackbuilds.org/slackbuilds/15.0/audio/audacity/audacity.png"
chmod 644 "$PKG/usr/share/pixmaps/audacity.png"
rm -f "$APP/.DirIcon" "$APP/audacity.png"

find "$APP" -depth -type d -empty -delete 2>/dev/null

# AUDACITY_DEBUG=1 shows full unfiltered output
cat > "$PKG/usr/bin/audacity" << 'EOF'
#!/bin/bash
export APPDIR=/opt/audacity
export LD_LIBRARY_PATH="$APPDIR/lib:$APPDIR/usr/lib:$APPDIR/usr/lib/x86_64-linux-gnu${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}"
cd "$APPDIR" || exit 1
[ "$AUDACITY_DEBUG" = "1" ] && exec ./AppRun "$@"
./AppRun "$@" 2>&1 | grep -vE --line-buffered '^/usr/lib|^/lib/'
exit "${PIPESTATUS[0]}"
EOF
chmod 755 "$PKG/usr/bin/audacity"

cat > "$PKG/usr/share/applications/$PRGNAM.desktop" << EOM
[Desktop Entry]
Name=Audacity
GenericName=Audio Editor
GenericName[ru]=Аудиоредактор
Comment=Record and edit audio files
Comment[ru]=Запись и редактирование звука
Icon=/usr/share/pixmaps/audacity.png
Exec=audacity %F
Terminal=false
Type=Application
Categories=AudioVideo;Audio;AudioVideoEditing;
MimeType=application/x-audacity-project;audio/x-wav;audio/mpeg;audio/ogg;audio/flac;
EOM
chmod 644 "$PKG/usr/share/applications/$PRGNAM.desktop"

mkdir -p "$PKGINFO"
cat > "$PKGINFO/$PRGNAM-$VERSION-$ARCH" << EOM
PACKAGE NAME: $PRGNAM-$VERSION-$ARCH
PACKAGE DESCRIPTION:
audacity: Audacity is a free, easy-to-use, multi-track audio editor and recorder.
audacity: https://www.audacityteam.org/
FILE LIST:
EOM
cd "$PKG" || exit 1
find . -path ./var -prune -o -print | grep -v "^\./var" >> "$PKGINFO/$PRGNAM-$VERSION-$ARCH"
cd "$CWD" || exit 1

printf "\n${CYAN}Building XZM module...${RESET}\n"
dir2xzm "$PKG" "$OUTPUT/$PRGNAM-$VERSION-$ARCH-$BUILD.xzm"

if [ -f "$OUTPUT/$PRGNAM-$VERSION-$ARCH-$BUILD.xzm" ]; then
    MODULE_SIZE=$(du -h "$OUTPUT/$PRGNAM-$VERSION-$ARCH-$BUILD.xzm" | cut -f1)
    printf "\n${BOLD}[OK] Module successfully created!${RESET}\n"
    printf "${BOLD}Location: ${GREEN}$OUTPUT/$PRGNAM-$VERSION-${ARCH}-${BUILD}.xzm${RESET}\n"
    printf "${BOLD}Size: ${CYAN}$MODULE_SIZE${RESET}\n"
    printf "${BOLD}Action: Copy it to your /porteus/modules folder to survive a reboot.${RESET}\n\n"
else
    printf "\n${RED}${BOLD}[FAIL] Failed to build the module.${RESET}\n\n"
    exit 1
fi
