#!/bin/bash

# Flameshot AppImage for Porteus
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}Run as root.${RESET}\n"; exit 1; }

PRGNAM=${PRGNAM:-flameshot}
BUILD=${BUILD:-1}
ARCH=$(uname -m)
TMPDIR=/tmp/portch
PKG=$TMPDIR/pkg-$PRGNAM
OUTPUT=${OUTPUT:-/tmp}

trap 'rm -rf "$TMPDIR"' EXIT INT TERM

printf "\nFetching latest release...\n"
API="https://api.github.com/repos/flameshot-org/flameshot/releases/latest"
JSON=$(wget -qO- "$API")
VERSION=$(printf '%s' "$JSON" | grep -m1 '"tag_name"' | sed -E 's/.*"v?([^"]+)".*/\1/')
URL=$(printf '%s' "$JSON" | grep -i "browser_download_url.*appimage" | head -1 | sed -E 's/.*"([^"]+)".*/\1/')
[ -z "$VERSION" ] || [ -z "$URL" ] && { printf "${RED}Failed.${RESET}\n"; exit 1; }

CUR=$(cat "/opt/$PRGNAM/version.txt" 2>/dev/null)
[ "$CUR" = "$VERSION" ] && { printf "Up to date: ${GREEN}$VERSION${RESET}\n"; exit 0; }
printf "Current: ${RED}${CUR:-None}${RESET} | Available: ${GREEN}$VERSION${RESET}\n"
read -p "Build $PRGNAM $VERSION? [y/N]: " -n1 -rs; echo
[[ ! $REPLY =~ ^[Yy]$ ]] && exit 0

rm -rf "$TMPDIR"
mkdir -p "$PKG"/{opt/$PRGNAM,usr/{bin,share/{applications,pixmaps,flameshot}},var/lib/pkgtools/packages}
mkdir -p "$PKG/usr/share/icons/hicolor"/{256x256,128x128,64x64,scalable}/apps
mkdir -p "$PKG/usr/share/translations"
cd "$TMPDIR" || exit 1

# Download AppImage
FN=$(basename "$URL")
if [[ "$FN" == *.zip ]]; then
    wget -q --show-progress -O dl.zip "$URL"
    unzip -q dl.zip -d z
    mv "$(find z -iname "*.AppImage" -type f | head -1)" app.AppImage
else
    wget -q --show-progress -O app.AppImage "$URL"
fi

chmod +x app.AppImage
./app.AppImage --appimage-extract >/dev/null 2>&1
R=squashfs-root
[ -d "$R" ] || { printf "${RED}Extract failed.${RESET}\n"; exit 1; }

# ==============================================================================
# AGGRESSIVE CLEANUP
# ==============================================================================
printf "${CYAN}Optimizing and cleaning up...${RESET}\n"

find "$R" -type d \( -name licenses -o -name doc -o -name docs -o -name man -o -name info -o -name __pycache__ -o -name metainfo -o -name appdata \) -exec rm -rf {} +
find "$R" -type f \( -iname "README*" -o -iname "LICENSE*" -o -iname "COPYING*" -o -iname "CHANGELOG*" -o -name "*.pyc" \) -delete

rm -rf "$R"/usr/share/{bash-completion,fish,zsh} 2>/dev/null

for p in "$R"/{usr/,}{lib/,}{qt6/,}plugins "$R"/usr/lib/x86_64-linux-gnu/qt6/plugins; do
    [ -d "$p" ] || continue
    find "$p" -mindepth 1 -maxdepth 1 -type d \
        ! -name iconengines ! -name imageformats ! -name platforminputcontexts \
        ! -name platforms ! -name styles ! -name tls ! -name networkinformation \
        ! -name 'wayland-*' ! -name xcbglintegrations \
        -exec rm -rf {} +
done

if [ -d "$R/usr/share/icons/hicolor" ]; then
    find "$R/usr/share/icons/hicolor" -mindepth 1 -maxdepth 1 -type d \
        -regextype posix-extended -regex '.*/[0-9]+x[0-9]+' \
        ! -name 256x256 ! -name 128x128 ! -name 64x64 -exec rm -rf {} +
    rm -rf "$R"/usr/share/icons/hicolor/{icon-theme.cache,index.theme}
fi

rm -rf "$R"/usr/share/X11/xkb/{compat,geometry,rules,types} 2>/dev/null

find "$R" -type f -name "*.so*" \
    ! -name "libssl*" ! -name "libcrypto*" \
    ! -path "*/plugins/tls/*" \
    -exec strip --strip-unneeded {} + 2>/dev/null

rm -f "$R"/.appimage* "$R"/*.appimage 2>/dev/null

# ==============================================================================
# LOCALE SELECTION
# ==============================================================================
SYS_LANG="${LANG%%.*}"
SYS_LANG="${SYS_LANG%%_*}"
SYS_LANG=$(echo "$SYS_LANG" | tr '[:upper:]' '[:lower:]')

FL_TRANS="$R/usr/share/flameshot/translations"
KEEP_LANGS="en"

if [ -d "$FL_TRANS" ]; then
    mapfile -t ALL_LANGS < <(find "$FL_TRANS" -name "Internationalization_*.qm" -exec basename {} .qm \; | \
        sed 's/^Internationalization_//' | grep -v '^en$' | sort -u)

    if [ -n "$SYS_LANG" ] && printf '%s\n' "${ALL_LANGS[@]}" | grep -qx "$SYS_LANG"; then
        KEEP_LANGS="$KEEP_LANGS $SYS_LANG"
    fi

    if [ ${#ALL_LANGS[@]} -gt 0 ]; then
        printf "\n${CYAN}Select additional locale (English and system locale are kept automatically):${RESET}\n"
        COLS=4; ROWS=$(( (${#ALL_LANGS[@]} + COLS - 1) / COLS ))
        for ((i=0; i<ROWS; i++)); do
            for ((j=0; j<COLS; j++)); do
                x=$((i + j * ROWS))
                [ $x -lt ${#ALL_LANGS[@]} ] && printf "  %3d) %-15s" "$((x+1))" "${ALL_LANGS[$x]}"
            done; echo
        done; echo
        read -p "Number [1-${#ALL_LANGS[@]}, Enter=none]: " n
        if [[ "$n" =~ ^[0-9]+$ ]] && [ "$n" -ge 1 ] && [ "$n" -le ${#ALL_LANGS[@]} ]; then
            EXTRA="${ALL_LANGS[$((n-1))]}"
            if [[ ! " $KEEP_LANGS " =~ " $EXTRA " ]]; then
                KEEP_LANGS="$KEEP_LANGS $EXTRA"
            fi
        fi
    fi
fi

if [ -d "$FL_TRANS" ]; then
    find "$FL_TRANS" -name "Internationalization_*.qm" | while read -r f; do
        b=$(basename "$f" .qm | sed 's/^Internationalization_//')
        keep=0
        for k in $KEEP_LANGS; do
            [[ "$b" == "$k" ]] && keep=1 && break
        done
        [ "$keep" -eq 0 ] && rm -f "$f"
    done
fi

# ==============================================================================
# INSTALL
# ==============================================================================
cp -a "$R"/. "$PKG/opt/$PRGNAM/"
echo "$VERSION" > "$PKG/opt/$PRGNAM/version.txt"
chmod +x "$PKG/opt/$PRGNAM/AppRun"

printf "${CYAN}Copying system libssl/libcrypto...${RESET}\n"
find "$PKG/opt/$PRGNAM/usr/lib" -name "libssl.so*" -delete 2>/dev/null
find "$PKG/opt/$PRGNAM/usr/lib" -name "libcrypto.so*" -delete 2>/dev/null

if [ -f /usr/lib64/libssl.so.3 ]; then
    cp -a /usr/lib64/libssl.so.3 "$PKG/opt/$PRGNAM/usr/lib/"
    ln -sf libssl.so.3 "$PKG/opt/$PRGNAM/usr/lib/libssl.so"
fi
if [ -f /usr/lib64/libcrypto.so.3 ]; then
    cp -a /usr/lib64/libcrypto.so.3 "$PKG/opt/$PRGNAM/usr/lib/"
    ln -sf libcrypto.so.3 "$PKG/opt/$PRGNAM/usr/lib/libcrypto.so"
fi

printf "${CYAN}Copying Qt translations...${RESET}\n"
mkdir -p "$PKG/opt/$PRGNAM/usr/translations"
for qtdir in /usr/lib64/qt6/translations /usr/lib64/qt/translations \
             /usr/share/qt6/translations /usr/share/qt/translations; do
    if [ -d "$qtdir" ]; then
        for lang in $KEEP_LANGS; do
            cp -a "$qtdir"/qt_${lang}.qm "$PKG/opt/$PRGNAM/usr/translations/" 2>/dev/null
            cp -a "$qtdir"/qtbase_${lang}.qm "$PKG/opt/$PRGNAM/usr/translations/" 2>/dev/null
            cp -a "$qtdir"/qt_${lang}_*.qm "$PKG/opt/$PRGNAM/usr/translations/" 2>/dev/null
            cp -a "$qtdir"/qtbase_${lang}_*.qm "$PKG/opt/$PRGNAM/usr/translations/" 2>/dev/null
        done
        break
    fi
done

printf "${CYAN}Installing Flameshot translations...${RESET}\n"
mkdir -p "$PKG/usr/share/flameshot/translations"
if [ -d "$PKG/opt/$PRGNAM/usr/share/flameshot/translations" ]; then
    cp -a "$PKG/opt/$PRGNAM/usr/share/flameshot/translations/"*.qm \
        "$PKG/usr/share/flameshot/translations/" 2>/dev/null
fi

find "$PKG/opt/$PRGNAM" -maxdepth 1 -type f \( -name "*.desktop" -o -name "*.png" -o -name "*.svg" -o -name ".DirIcon" \) -delete 2>/dev/null
find "$PKG/opt/$PRGNAM/usr/share/applications" -name "org.flameshot.*" -delete 2>/dev/null
find "$PKG/opt/$PRGNAM/usr/share/icons" -name "org.flameshot.*" -delete 2>/dev/null

ICON_SRC=""
ICON_DST=""
ICON_PATH=""

for s in scalable 256x256 128x128 64x64; do
    for e in svg png; do
        if [ -f "$PKG/opt/$PRGNAM/usr/share/icons/hicolor/$s/apps/flameshot.$e" ]; then
            ICON_SRC="$PKG/opt/$PRGNAM/usr/share/icons/hicolor/$s/apps/flameshot.$e"
            ICON_DST="$PKG/usr/share/icons/hicolor/$s/apps/flameshot.$e"
            ICON_PATH="/usr/share/icons/hicolor/$s/apps/flameshot.$e"
            break 2
        fi
    done
done

if [ -z "$ICON_SRC" ] && [ -f "$PKG/opt/$PRGNAM/.DirIcon" ]; then
    ICON_SRC="$PKG/opt/$PRGNAM/.DirIcon"
    ICON_DST="$PKG/usr/share/icons/hicolor/256x256/apps/flameshot.png"
    ICON_PATH="/usr/share/icons/hicolor/256x256/apps/flameshot.png"
fi

if [ -n "$ICON_SRC" ]; then
    cp "$ICON_SRC" "$ICON_DST"
    cp "$ICON_SRC" "$PKG/usr/share/pixmaps/flameshot.${ICON_SRC##*.}"
else
    wget -qO "$PKG/usr/share/icons/hicolor/scalable/apps/flameshot.svg" \
        "https://raw.githubusercontent.com/flameshot-org/flameshot/master/data/img/app/flameshot.svg"
    ICON_PATH="/usr/share/icons/hicolor/scalable/apps/flameshot.svg"
fi

chmod 644 "$ICON_DST" 2>/dev/null
chmod 644 "$PKG/usr/share/pixmaps/"* 2>/dev/null

# Wrapper
cat > "$PKG/usr/bin/flameshot" << 'WRAP'
#!/bin/bash
export APPDIR=/opt/flameshot

unset LC_ALL

export LD_LIBRARY_PATH="$APPDIR/usr/lib:$APPDIR/lib:/usr/lib64:/lib64${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}"
export QT_PLUGIN_PATH="$APPDIR/usr/plugins:$APPDIR/usr/lib/qt6/plugins:$APPDIR/plugins${QT_PLUGIN_PATH:+:$QT_PLUGIN_PATH}"
export QML2_IMPORT_PATH="$APPDIR/usr/qml:$APPDIR/qml${QML2_IMPORT_PATH:+:$QML2_IMPORT_PATH}"
export QT_TRANSLATIONS_PATH="$APPDIR/usr/translations"
export GI_TYPELIB_PATH="$APPDIR/usr/lib/girepository-1.0${GI_TYPELIB_PATH:+:$GI_TYPELIB_PATH}"
export XDG_DATA_DIRS="$APPDIR/usr/share:/usr/share${XDG_DATA_DIRS:+:$XDG_DATA_DIRS}"

mkdir -p "$HOME/.config/flameshot"
if [ ! -f "$HOME/.config/flameshot/flameshot.ini" ]; then
    printf "[General]\nuseX11LegacyScreenshot=true\n" > "$HOME/.config/flameshot/flameshot.ini"
elif ! grep -q "useX11LegacyScreenshot" "$HOME/.config/flameshot/flameshot.ini"; then
    printf "\n[General]\nuseX11LegacyScreenshot=true\n" >> "$HOME/.config/flameshot/flameshot.ini"
fi

unset WAYLAND_DISPLAY
export XDG_SESSION_TYPE=x11
export QT_QPA_PLATFORM=xcb
export QT_QPA_PLATFORMTHEME=""
export GTK_USE_PORTAL=0
export QT_XDG_DESKTOP_PORTAL=0
export QT_USE_PORTAL=0

exec "$APPDIR/AppRun" "$@"
WRAP
chmod 755 "$PKG/usr/bin/flameshot"

# Desktop entry (FIXED: Exec=flameshot instead of flameshot gui)
cat > "$PKG/usr/share/applications/$PRGNAM.desktop" << EOF
[Desktop Entry]
Name=Flameshot
GenericName=Screenshot tool
Comment=Powerful yet simple to use screenshot software
Icon=$ICON_PATH
Exec=flameshot
Terminal=false
Type=Application
Categories=Graphics;Utility;Qt;
StartupWMClass=flameshot
StartupNotify=false
EOF

# Package info
INFO="$PKG/var/lib/pkgtools/packages/$PRGNAM-$VERSION-$ARCH"
printf 'PACKAGE NAME: %s\nPACKAGE DESCRIPTION:\nflameshot: Screenshot tool\nFILE LIST:\n' \
    "$PRGNAM-$VERSION-$ARCH" > "$INFO"
(cd "$PKG" && find . -mindepth 1 -path ./var -prune -o -print) | grep -v '^\./var' >> "$INFO"

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

if [ -f "$OUTPUT/$PRGNAM-$VERSION-$ARCH-$BUILD.xzm" ] && [ -s "$OUTPUT/$PRGNAM-$VERSION-$ARCH-$BUILD.xzm" ]; then
    printf "\n${BOLD}[OK]${RESET} ${GREEN}$OUTPUT/$PRGNAM-$VERSION-$ARCH-$BUILD.xzm${RESET}\n"
    printf "Size: ${CYAN}$(du -h "$OUTPUT/$PRGNAM-$VERSION-$ARCH-$BUILD.xzm" | cut -f1)${RESET}\n"
    printf "Move to ${BOLD}/porteus/modules${RESET}\n\n"
else
    printf "\n${RED}[FAIL]${RESET}\n"; exit 1
fi
