#!/bin/bash

# Krita 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:-krita}
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"
VERSION=$(wget -q -O- "https://gitlab.archlinux.org/archlinux/packaging/packages/krita/-/raw/main/.SRCINFO?ref_type=heads" | grep -m1 "^pkgver" | awk '{print $3}')
if [ -z "$VERSION" ]; then
    HTML=$(wget -q -O- "https://download.kde.org/stable/krita/")
    VERSION=$(printf '%s' "$HTML" | grep -oP 'href="\K[0-9]+(\.[0-9]+)+(?=/")' | sort -V | tail -n 1)
fi

DOWNLOAD_URL="https://download.kde.org/stable/krita/${VERSION}/krita-${VERSION}-x86_64.AppImage"

[ -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="krita-${VERSION}-x86_64.AppImage"
printf "\nDownloading ${CYAN}${BOLD}$APPIMAGE_NAME${RESET}\n"
wget -q --show-progress -O "$TMPDIR/$APPIMAGE_NAME" "$DOWNLOAD_URL"

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

if [ $? -ne 0 ] || [ ! -d "squashfs-root" ]; then
    printf "${RED}Extraction failed.${RESET}\n"
    exit 1
fi

KRITA="squashfs-root"
printf "${GREEN}Extraction successful.${RESET}\n"

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

# 1. Auto-detect and clean Python bloat (KEEP site-packages for Krita plugins!)
PY_DIR=$(find "$KRITA" -maxdepth 3 -type d -name "python3.*" | head -n 1)
if [ -n "$PY_DIR" ]; then
    PY_VER=$(basename "$PY_DIR")
    printf "  -> Removing %s bloat...\n" "$PY_VER"
    rm -rf "$PY_DIR/idlelib" "$PY_DIR/turtledemo" "$PY_DIR/ensurepip" \
           "$PY_DIR/test" "$PY_DIR/Tools" "$PY_DIR/venv" \
           "$PY_DIR/unittest" "$PY_DIR/pydoc_data" "$PY_DIR/tkinter" \
           "$PY_DIR"/config-* 2>/dev/null
    find "$PY_DIR" -type d -name "__pycache__" -exec rm -rf {} + 2>/dev/null
    find "$PY_DIR" -type f \( -name "*.pyc" -o -name "*.opt-1.pyc" -o -name "*.opt-2.pyc" \) -delete 2>/dev/null
fi

# 2. Remove docs, licenses, READMEs
printf "  -> Removing docs and licenses...\n"
find "$KRITA" -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 "$KRITA" -type f \( -iname "README*" -o -iname "LICENSE*" -o -iname "COPYING*" -o -iname "CHANGELOG*" -o -iname "AUTHORS*" \) -delete 2>/dev/null

# 3. Remove unused Qt6 plugins and styles
printf "  -> Cleaning Qt6 plugins and styles...\n"
for pdir in "$KRITA/usr/plugins"; do
    [ -d "$pdir" ] || continue
    for subdir in "$pdir"/*/; do
        [ -d "$subdir" ] || continue
        case "$(basename "$subdir")" in
            iconengines|imageformats|platforminputcontexts|platforms|sqldrivers|tls|wayland-decoration-client|wayland-graphics-integration-client|wayland-shell-integration|xcbglintegrations) ;;
            *) rm -rf "$subdir" 2>/dev/null ;;
        esac
    done
done
rm -rf "$KRITA/usr/qml/QtQuick/Controls/designer"
rm -rf "$KRITA/usr/qml/QtQuick/Controls/Fusion"
rm -rf "$KRITA/usr/qml/QtQuick/Controls/Imagine"
rm -rf "$KRITA/usr/qml/QtQuick/Controls/Material"
rm -rf "$KRITA/usr/qml/QtQuick/Controls/Universal"
rm -rf "$KRITA/usr/qml/QtQuick/Controls/FluentWinUI3"

# 4. Reduce icon sizes (keep 256x256, 128x128, 64x64, scalable)
printf "  -> Reducing icon sizes...\n"
find "$KRITA/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 {} + 2>/dev/null
rm -f "$KRITA/usr/share/icons/hicolor/icon-theme.cache" "$KRITA/usr/share/icons/hicolor/index.theme" 2>/dev/null

# 5. Remove X11/xkb bloat (host provides it)
printf "  -> Removing X11/xkb bloat...\n"
rm -rf "$KRITA/usr/share/X11/xkb/compat" "$KRITA/usr/share/X11/xkb/geometry" "$KRITA/usr/share/X11/xkb/rules" "$KRITA/usr/share/X11/xkb/types" 2>/dev/null
if [ -d "$KRITA/usr/share/X11/xkb/symbols" ]; then
    find "$KRITA/usr/share/X11/xkb/symbols" -mindepth 1 -maxdepth 1 -type d -name "*_vndr" -exec rm -rf {} + 2>/dev/null
    find "$KRITA/usr/share/X11/xkb/symbols" -type f ! -name "us" ! -name "ru" ! -name "compose" ! -name "ctrl" ! -name "level*" ! -name "group" ! -name "altwin" ! -name "capslock" ! -name "shift" ! -name "lock" ! -name "eurosign" ! -name "inet" ! -name "pc" ! -name "terminate" ! -name "srvr_ctrl" -delete 2>/dev/null
fi

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

# ============================================================================
# LOCALE CLEANUP
# ============================================================================
CORE_LOCALE_DIR="$KRITA/usr/share/locale"
LANG_CHOICE="en"

if [ -d "$CORE_LOCALE_DIR" ]; then
    mapfile -t LANGUAGES < <(ls "$CORE_LOCALE_DIR" 2>/dev/null | grep -E '^[a-z]{2,3}(_[A-Z]{2})?$' | sort -u)
    if [ ${#LANGUAGES[@]} -gt 0 ]; then
        printf "\n${CYAN}Krita 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
fi

printf "\n  -> Removing locales except en and %s...\n" "$LANG_CHOICE"

# Clean Krita core locales
find "$CORE_LOCALE_DIR" -mindepth 1 -maxdepth 1 -type d ! -name "en*" ! -name "$LANG_CHOICE*" -exec rm -rf {} + 2>/dev/null

# Clean Qt translations
QT_TR="$KRITA/usr/translations"
if [ -d "$QT_TR" ]; then
    QT_LANG="${LANG_CHOICE%%_*}"
    find "$QT_TR" -type f -name "*.qm" | while read -r qm; do
        bn=$(basename "$qm" .qm)
        if [[ "$bn" == "qt" || "$bn" == "qtbase" || "$bn" == "catalogs" ]]; then
            continue
        fi
        if [[ "$bn" == *_en || "$bn" == *_en_* || "$bn" == *_"$QT_LANG" || "$bn" == *_"$LANG_CHOICE" || "$bn" == *_"$LANG_CHOICE"_* ]]; then
            continue
        fi
        rm -f "$qm"
    done
fi

# Final empty directory cleanup
find "$KRITA" -type d -empty -delete 2>/dev/null

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

# ============================================================================
# INSTALLATION
# ============================================================================
rm -f "$TMPDIR/$APPIMAGE_NAME"
mv "$KRITA"/* "$PKG/opt/$PRGNAM/" 2>/dev/null
mv "$KRITA"/.DirIcon "$PKG/opt/$PRGNAM/" 2>/dev/null
rmdir "$KRITA" 2>/dev/null

printf '%s' "$VERSION" > "$PKG/opt/$PRGNAM/version.txt"
chmod +x "$PKG/opt/$PRGNAM/AppRun"

# Icon
cp "$PKG/opt/$PRGNAM/usr/share/icons/hicolor/256x256/apps/krita.png" \
   "$PKG/usr/share/pixmaps/krita.png" 2>/dev/null || \
cp "$PKG/opt/$PRGNAM/.DirIcon" "$PKG/usr/share/pixmaps/krita.png" 2>/dev/null || \
wget -q -O "$PKG/usr/share/pixmaps/krita.png" "https://upload.wikimedia.org/wikipedia/commons/thumb/6/61/Krita_icon.svg/128px-Krita_icon.svg.png"
chmod 644 "$PKG/usr/share/pixmaps/krita.png"

# Wrapper script
cat > "$PKG/usr/bin/krita" << 'EOF'
#!/bin/bash
export APPDIR=/opt/krita
cd "$APPDIR" || exit 1
exec ./AppRun "$@"
EOF
chmod 755 "$PKG/usr/bin/krita"

# Desktop entry
cat > "$PKG/usr/share/applications/$PRGNAM.desktop" << EOM
[Desktop Entry]
Name=Krita
GenericName=Digital Painting
GenericName[ru]=Цифровая живопись
Comment=Digital Painting and Illustration
Comment[ru]=Цифровая живопись и редактирование изображений
Icon=/usr/share/pixmaps/krita.png
Exec=krita %F
Terminal=false
Type=Application
Categories=Graphics;2DGraphics;RasterGraphics;Qt;KDE;
MimeType=application/x-krita;
EOM
chmod 644 "$PKG/usr/share/applications/$PRGNAM.desktop"

# Remove duplicate desktop/icon files from package root
rm -f "$PKG/opt/$PRGNAM/org.kde.krita.desktop" "$PKG/opt/$PRGNAM/krita.png" 2>/dev/null

# Package info
mkdir -p "$PKGINFO"
cat > "$PKGINFO/$PRGNAM-$VERSION-$ARCH" << EOM
PACKAGE NAME: $PRGNAM-$VERSION-$ARCH
PACKAGE DESCRIPTION:
krita: Krita is a free and open source cross-platform application for digital art.
krita: https://krita.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

# Build module
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
