#!/bin/bash

# Chromium-Gost xzm Module Builder for Porteus
# Version: 2026-07-21
#
# 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
export XZ_OPT="-T0"

PRGNAM=${PRGNAM:-chromium-gost}
OUTPUT=${OUTPUT:-/tmp}
TMPDIR=/tmp/portch
PKG="$TMPDIR/package-$PRGNAM"
PKGINFO="$PKG/var/lib/pkgtools/packages"
ARCH=$(uname -m)
RPM_FILE="${PRGNAM}-linux-amd64.rpm"

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

cleanup() { 
    printf "\n${BOLD}Cleaning up temporary files...${RESET}\n"
    rm -rf "$TMPDIR" "$PKG" 2>/dev/null
}
trap cleanup EXIT INT TERM HUP

[ "$(id -u)" -ne 0 ] && { printf "\n${RED}Error: You need to be root to run this script.${RESET}\n"; exit 1; }

# Fast version fetch
printf "\nFetching latest release info...\n"
VERSION=$(wget --spider -S "https://github.com/deemru/chromium-gost/releases/latest" 2>&1 | grep -i "location:" | grep -oE "[0-9]+(\.[0-9]+)+" | tail -n 1)

[[ -z "$VERSION" ]] && { printf "${RED}Failed to determine version.${RESET}\n"; exit 1; }
SOURCE="https://github.com/deemru/Chromium-Gost/releases/download/${VERSION}/${PRGNAM}-${VERSION}-linux-amd64.rpm"

# Check installed version
if [[ -f "/usr/bin/chromium-gost-stable" ]]; then
    MYVER=$(/usr/bin/chromium-gost-stable --product-version 2>/dev/null || true)
    printf "[${GREEN}OK${RESET}] Installed version: %s\n" "${MYVER:-Unknown}"
    if [[ "${MYVER:-}" == "$VERSION" ]]; then
        printf "You already have the latest ${GREEN}%s${RESET} version of %s.\n" "$MYVER" "$PRGNAM"
        exit 0
    fi
else
    printf "[${CYAN}INFO${RESET}] Chromium-Gost is not currently installed.\n"
fi

printf "Current: ${RED}${MYVER:-None}${RESET} | Available: ${GREEN}%s${RESET}\n" "$VERSION"
read -r -p "Build ${PRGNAM} ${GREEN}${VERSION}${RESET} xzm module? [y/N]: " -n 1 -r -s && echo
[[ ! $REPLY =~ ^[Yy]$ ]] && { printf "Build cancelled.\n"; exit 0; }

rm -rf "$PKG" "$TMPDIR"
mkdir -p "$PKG" "$OUTPUT"
cd "$PKG" || exit 1

printf "\nDownloading %s%s%s${RESET}\n" "${CYAN}" "${BOLD}" "${RPM_FILE}"
wget -q --show-progress "$SOURCE" -O "$RPM_FILE" || { printf "${RED}Download failed.${RESET}\n"; exit 1; }

printf "\nExtracting RPM...\n"
rpm2cpio "$RPM_FILE" | cpio -idm --quiet
rm -f "$RPM_FILE"
rm -rf "$PKG/usr/share/man" "$PKG/etc"

printf "Organizing icons...\n"
mkdir -p "$PKG/usr/share/icons/hicolor"/{24x24,32x32,48x48,64x64,128x128,256x256}/apps
rm -f "$PKG/opt/chromium-gost"/product_logo_{16,32}.png "$PKG/opt/chromium-gost/product_logo_32.xpm"

mv -f "$PKG/opt/chromium-gost/product_logo_24.png" "$PKG/usr/share/icons/hicolor/24x24/apps/chromium-gost.png"
cp -a "$PKG/opt/chromium-gost/product_logo_48.png" "$PKG/usr/share/icons/hicolor/32x32/apps/chromium-gost.png"
mv -f "$PKG/opt/chromium-gost/product_logo_"{48.png,64.png,128.png,256.png} \
      "$PKG/usr/share/icons/hicolor/48x48/apps/chromium-gost.png" \
      "$PKG/usr/share/icons/hicolor/64x64/apps/chromium-gost.png" \
      "$PKG/usr/share/icons/hicolor/128x128/apps/chromium-gost.png" \
      "$PKG/usr/share/icons/hicolor/256x256/apps/chromium-gost.png" 2>/dev/null || true

# Locale selection
select_locale() {
    local locales=(af am ar bg bn ca cs da de el en-GB en-US es-419 es et fa fi fil fr gu he hi hr hu id it ja kn ko lt lv ml mr ms nb nl pl pt-BR pt-PT ro ru sk sl sr sv sw ta te th tr uk ur vi zh-CN zh-TW)
    
    printf "\n${CYAN}Chromium-Gost locale setup${RESET}\n"
    printf "Available locales (%s):\n" "${#locales[@]}"
    
    local COLS=5
    local ROWS=$(( (${#locales[@]} + COLS - 1) / COLS ))
    for ((i=0; i<ROWS; i++)); do
        for ((j=0; j<COLS; j++)); do
            local idx=$((i + j * ROWS))
            if [ $idx -lt ${#locales[@]} ]; then
                local num=$((idx + 1))
                printf "  %2d) %-15s" "$num" "${locales[$idx]}"
            fi
        done
        echo
    done

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

    if [ "$choice" -gt 0 ]; then 
        CHOICE="${locales[$((choice-1))]}"
    else 
        CHOICE="en-US"
    fi
    
    printf "  -> Locale set to: ${GREEN}%s${RESET}\n" "$CHOICE"
}

select_locale

printf "\n${CYAN}Cleaning up unnecessary files...${RESET}\n"
if [[ -d "$PKG/opt/chromium-gost/locales" ]]; then
    printf "  -> Removing locales except en-US and %s...\n" "$CHOICE"
    find "$PKG/opt/chromium-gost/locales" -type f ! -name "en-US.pak" ! -name "${CHOICE}.pak" -delete
fi

printf "  -> Cleaning desktop files...\n"
rm -f "$PKG/usr/share/applications/org.chromium.Chromium.desktop"
find "$PKG/usr/share/applications/" -maxdepth 1 -name "*.desktop" -type f -exec sed -i '/^MimeType=/d' {} +

printf "  -> Generating metadata...\n"
mkdir -p "$PKGINFO"
{
    printf "PACKAGE NAME: %s-%s-%s\n" "$PRGNAM" "$VERSION" "$ARCH"
    printf "PACKAGE DESCRIPTION:\n"
    printf "chromium-gost: Chromium-Gost (Open Source Chrome with GOST support)\n"
    printf "chromium-gost: Un-googled version.\n"
    printf "chromium-gost: Homepage: https://github.com/deemru/Chromium-Gost\n"
    printf "FILE LIST:\n"
    find . -type f ! -path './var/*' -printf '%P\n' | sort
} > "$PKGINFO/${PRGNAM}-${VERSION}-${ARCH}"

# Module creation
printf "\n${CYAN}Building XZM module...${RESET}\n"
FINAL_MODULE="$OUTPUT/${PRGNAM}-${VERSION}-${ARCH}-${CHOICE}.xzm"

if ! dir2xzm "$PKG" "$FINAL_MODULE"; then
    printf "\n${RED}${BOLD}[FAIL] Failed to build the module.${RESET}\n\n"
    exit 1
fi

if [ -f "$FINAL_MODULE" ]; then
    MODULE_SIZE=$(du -h "$FINAL_MODULE" | cut -f1)
    printf "\n${BOLD}[OK] Module successfully created!${RESET}\n"
    printf "${BOLD}Location: ${GREEN}%s${RESET}\n" "$FINAL_MODULE"
    printf "${BOLD}Size: ${CYAN}%s${RESET}\n" "$MODULE_SIZE"
    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
