#!/bin/bash
set -o pipefail

# bldbasalt — Build Basalt Linux ISO using live-build
# Revision: 1.3 — Docker-ready, clean sequence
# (MIT License)

# ============================================================
# CONFIGURATION
# ============================================================
WKDIR="$(pwd)"
FLDIR="basalt"
BLDDIR="basaltOS"

# Sudo — works passwordless in Docker (Dockerfile has NOPASSWD)
# Run as root directly if available (simpler in Docker with --privileged)
if [ "$(id -u)" -eq 0 ]; then
    SUDO=""
else
    SUDO="sudo"
fi

# ============================================================
# FUNCTIONS
# ============================================================
section() {
    echo ""; echo "========================================"
    echo "  $1"
    echo "========================================"
}

clean_build() {
    section "CLEAN: Removing old build artifacts"
    mkdir -p "$BLDDIR"
    cd "$BLDDIR"
    $SUDO lb clean 2>/dev/null || true
    cd "$WKDIR"
}

configure_lb() {
    section "CONFIG: live-build configuration"
    cd "$BLDDIR"
    $SUDO lb config \
        --binary-images iso-hybrid \
        --mode debian \
        --architectures amd64 \
        --linux-flavours amd64 \
        --distribution trixie \
        --archive-areas "main contrib non-free non-free-firmware" \
        --debian-installer none \
        --updates true --security true --cache true \
        --apt-recommends true \
        --firmware-binary true --firmware-chroot true \
        --win32-loader false \
        --iso-application "Basalt Linux 1.2 Obsidian" \
        --iso-preparer "basalt-https://basaltlinux.gitlab.io" \
        --iso-publisher "basalt-https://basaltlinux.gitlab.io" \
        --image-name "Basalt-1.2-Obsidian" \
        --iso-volume "Basalt Linux" \
        --checksums sha512 \
        --color \
        --bootappend-live "boot=live components quiet splash vt.handoff=7" \
        --mirror-bootstrap "http://deb.debian.org/debian" \
        --mirror-chroot "http://deb.debian.org/debian" \
        --mirror-binary "http://deb.debian.org/debian"
    $SUDO chown -R user:user "$WKDIR/$BLDDIR/config/" 2>/dev/null || true
    cd "$WKDIR"
}

setup_cache() {
    section "CACHE: Persistent apt cache (Docker volume)"
    $SUDO rm -rf "$WKDIR/$BLDDIR/config/cache" 2>/dev/null || true
    mkdir -p /var/cache/lb
    $SUDO ln -sf /var/cache/lb "$WKDIR/$BLDDIR/config/cache"
}

create_package_lists() {
    section "PACKAGES: Creating package lists"

    # Core desktop — Xfce
    echo "accountsservice orchis-gtk-theme dconf-cli galculator gnome-keyring \
light-locker lightdm lightdm-gtk-greeter mousepad network-manager-gnome \
pavucontrol pulseaudio system-config-printer xarchiver xfce4 \
xfce4-power-manager xfce4-terminal" \
    > "$WKDIR/$BLDDIR/config/package-lists/xfcedesktop.list.chroot"

    # Apps, drivers, utilities
    echo "alsa-utils apt-transport-https atril audacious audacious-plugins \
bibata-cursor-theme blueman bluez cryptsetup cryptsetup-initramfs cups cups-filters \
curl dbus-user-session dbus-x11 dialog dirmngr exfatprogs fastfetch ffmpeg firefox-esr \
flac flatpak fonts-noto-color-emoji fonts-noto-core foomatic-db foomatic-db-engine \
frei0r-plugins fuse3 gdebi ghostscript gnome-disk-utility gparted grub-common grub2-common \
gstreamer1.0-plugins-bad gstreamer1.0-plugins-ugly gstreamer1.0-plugins-good gvfs \
gvfs-backends gvfs-fuse haveged htop hunspell-en-us hyphen-en-us ibus ibus-data ibus-gtk \
ibus-gtk3 ibus-m17n im-config inxi isolinux iw less libibus-1.0-5 libqt5opengl5t64 \
libreoffice-calc libreoffice-draw libreoffice-impress libreoffice-writer libreoffice-gtk3 \
libreoffice-help-en-us libnss-mdns libxcb-xtest0 linux-headers-amd64 live-build lsb-release \
lshw mtools mythes-en-us nvidia-detect openssh-client os-prober p7zip-full p7zip-rar \
packagekit papirus-icon-theme pciutils perl plymouth plymouth-label plymouth-themes \
plymouth-x11 printer-driver-gutenprint pulseaudio-module-bluetooth python3-gi \
gir1.2-gtk-3.0 python3-ibus-1.0 ristretto squashfs-tools sudo synaptic syslinux \
syslinux-common systemd-timesyncd thunar-archive-plugin timeshift upower vlc unrar unzip \
wget x11-common x265 x264 xauth xclip xdg-utils xfce4-clipman xfce4-notifyd \
xfce4-screenshooter xfce4-taskmanager xfce4-whiskermenu-plugin yad xorg \
xserver-xorg-input-all xserver-xorg-video-all xorriso zip zstd" \
    > "$WKDIR/$BLDDIR/config/package-lists/morepackages.list.chroot"

    # Firmware
    echo "atmel-firmware bluez-firmware firmware-linux-free midisport-firmware \
firmware-misc-nonfree firmware-amd-graphics firmware-atheros firmware-bnx2 firmware-bnx2x \
firmware-brcm80211 firmware-cavium firmware-intel-sound firmware-iwlwifi firmware-libertas \
firmware-linux firmware-linux-nonfree firmware-misc-nonfree firmware-myricom \
firmware-netronome firmware-netxen firmware-qcom-media firmware-qcom-soc firmware-qlogic \
firmware-realtek firmware-samsung firmware-siano firmware-ti-connectivity firmware-sof-signed \
firmware-zd1211 firmware-b43-installer broadcom-sta-dkms" \
    > "$WKDIR/$BLDDIR/config/package-lists/firmware.list.chroot"

    # Calamares installer dependencies
    echo "btrfs-progs dosfstools e2fsprogs ntfs-3g qml6-module-qtquick \
qml6-module-qtquick-controls qml6-module-qtquick-layouts qml6-module-qtquick-templates \
qml6-module-qtquick-window qt6-image-formats-plugins udisks2 xfsprogs" \
    > "$WKDIR/$BLDDIR/config/package-lists/calamares-needs.list.chroot"

    # Calamares + Debian settings
    echo "calamares calamares-settings-debian" \
    > "$WKDIR/$BLDDIR/config/package-lists/calamares.list.chroot"

    # GRUB EFI (binary)
    echo "efibootmgr grub-efi grub-efi-amd64 grub-efi-amd64-bin grub-efi-amd64-signed \
grub-efi-amd64-unsigned mokutil shim-helpers-amd64-signed shim-signed shim-unsigned" \
    > "$WKDIR/$BLDDIR/config/package-lists/grub-efi.list.binary"

    # GRUB Legacy/BIOS (binary)
    echo "grub-pc grub-pc-bin grub-common grub2-common" \
    > "$WKDIR/$BLDDIR/config/package-lists/grub-pc.list.binary"
}

copy_branding_and_configs() {
    section "CONFIG: Copying branding, configs, and assets"

    mkdir -p "$WKDIR/$BLDDIR/config/includes.chroot/etc/"
    cp -r "$WKDIR/$FLDIR/calamares/" "$WKDIR/$BLDDIR/config/includes.chroot/etc/"

    # OS release files
    for f in os-release lsb-release issue issue.net hostname; do
        cp "$WKDIR/$FLDIR/etc/$f" "$WKDIR/$BLDDIR/config/includes.chroot/etc/"
    done

    # Live config, GRUB defaults, initramfs
    mkdir -p "$WKDIR/$BLDDIR/config/includes.chroot/etc/live/"
    cp "$WKDIR/$FLDIR/etc/live/config.conf" "$WKDIR/$BLDDIR/config/includes.chroot/etc/live/"
    mkdir -p "$WKDIR/$BLDDIR/config/includes.chroot/etc/default/"
    cp "$WKDIR/$FLDIR/etc/default/grub" "$WKDIR/$BLDDIR/config/includes.chroot/etc/default/"
    mkdir -p "$WKDIR/$BLDDIR/config/includes.chroot/etc/initramfs-tools/conf.d/"
    cp "$WKDIR/$FLDIR/etc/initramfs-tools/conf.d/splash" \
       "$WKDIR/$BLDDIR/config/includes.chroot/etc/initramfs-tools/conf.d/"
    cp "$WKDIR/$FLDIR/etc/initramfs-tools/modules" \
       "$WKDIR/$BLDDIR/config/includes.chroot/etc/initramfs-tools/"
    cp "$WKDIR/$FLDIR/etc/initramfs-tools/initramfs.conf" \
       "$WKDIR/$BLDDIR/config/includes.chroot/etc/initramfs-tools/"
}

copy_assets_and_scripts() {
    section "ASSETS: Copying themes, icons, scripts, configs"

    mkdir -p "$WKDIR/$BLDDIR/config/includes.chroot/usr/local/bin/"
    mkdir -p "$WKDIR/$BLDDIR/config/includes.chroot/etc/skel/"
    mkdir -p "$WKDIR/$BLDDIR/config/includes.chroot/usr/share/backgrounds/"
    mkdir -p "$WKDIR/$BLDDIR/config/includes.chroot/usr/share/applications/"
    mkdir -p "$WKDIR/$BLDDIR/config/includes.chroot/usr/share/icons/default/"
    mkdir -p "$WKDIR/$BLDDIR/config/includes.chroot/usr/share/plymouth/"
    mkdir -p "$WKDIR/$BLDDIR/config/includes.chroot/usr/share/xfce4/backdrops/"
    mkdir -p "$WKDIR/$BLDDIR/config/includes.chroot/usr/lib/firefox-esr/distribution/"

    # User avatar
    cp "$WKDIR/$FLDIR/config/skel/.face" "$WKDIR/$BLDDIR/config/includes.chroot/etc/skel/"
    cp "$WKDIR/$FLDIR/config/skel/.face.icon" "$WKDIR/$BLDDIR/config/includes.chroot/etc/skel/"

    # Bootloaders, configs, scripts, icons, hooks, plymouth
    cp -r "$WKDIR/$FLDIR/bootloaders/" "$WKDIR/$BLDDIR/config/"
    cp -r "$WKDIR/$FLDIR/" "$WKDIR/$BLDDIR/config/includes.chroot/usr/share/"
    cp -r "$WKDIR/$FLDIR/modprobe.d/" "$WKDIR/$BLDDIR/config/includes.chroot/etc/"
    cp -r "$WKDIR/$FLDIR/usr/share/plymouth/" "$WKDIR/$BLDDIR/config/includes.chroot/usr/share/"

    # Hooks and scripts
    mkdir -p "$WKDIR/$BLDDIR/config/hooks/normal/"
    cp "$WKDIR/$FLDIR/hooks/"* "$WKDIR/$BLDDIR/config/hooks/normal/"
    cp "$WKDIR/$FLDIR/scripts/"* "$WKDIR/$BLDDIR/config/includes.chroot/usr/local/bin/"

    # Icons (default + hicolor)
    cp "$WKDIR/$FLDIR/icons/"* "$WKDIR/$BLDDIR/config/includes.chroot/usr/share/icons/default/"
    mkdir -p "$WKDIR/$BLDDIR/config/includes.chroot/usr/share/icons/hicolor/scalable/apps/"
    cp "$WKDIR/$FLDIR/icons/"* "$WKDIR/$BLDDIR/config/includes.chroot/usr/share/icons/hicolor/scalable/apps/"

    # Wallpapers
    cp "$WKDIR/$FLDIR/backgrounds/"*.jpg "$WKDIR/$BLDDIR/config/includes.chroot/usr/share/backgrounds/"
    cp "$WKDIR/$FLDIR/backgrounds/"*.jpg "$WKDIR/$BLDDIR/config/includes.chroot/usr/share/xfce4/backdrops/"

    # Xfce 4.20 backdrop override
    mkdir -p "$WKDIR/$BLDDIR/config/includes.chroot/usr/share/backgrounds/xfce/"
    cp "$WKDIR/$FLDIR/backgrounds/basalt-desktop-4.jpg" \
       "$WKDIR/$BLDDIR/config/includes.chroot/usr/share/backgrounds/xfce/xfce-x.svg"

    # Desktop launchers + panel launchers
    cp "$WKDIR/$FLDIR/launchers/"*.desktop "$WKDIR/$BLDDIR/config/includes.chroot/usr/share/applications/" 2>/dev/null || true
    cp "$WKDIR/$FLDIR/xfce4/panel/"*.desktop "$WKDIR/$BLDDIR/config/includes.chroot/usr/share/applications/" 2>/dev/null || true
    sed -i '/^Categories=/a\NoDisplay=true' \
        "$WKDIR/$BLDDIR/config/includes.chroot/usr/share/applications/basalt-"*.desktop 2>/dev/null || true

    # Firefox homepage
    cp "$WKDIR/$FLDIR/usr/lib/firefox-esr/distribution/policies.json" \
       "$WKDIR/$BLDDIR/config/includes.chroot/usr/lib/firefox-esr/distribution/"
}

setup_xfce_and_autostart() {
    section "XFCE: Panel config, autostart, DNS, and user settings"

    # Xfce panel config
    mkdir -p "$WKDIR/$BLDDIR/config/includes.chroot/etc/skel/.config/"
    cp -r "$WKDIR/$FLDIR/xfce4/" "$WKDIR/$BLDDIR/config/includes.chroot/etc/skel/.config/"

    # DNS for chroot (Cloudflare — privacy-first)
    printf "nameserver 1.1.1.1\nnameserver 1.0.0.1\n" \
        > "$WKDIR/$BLDDIR/config/includes.chroot/etc/resolv.conf"

    # Autostart entries
    mkdir -p "$WKDIR/$BLDDIR/config/includes.chroot/etc/xdg/autostart/"
    cp "$WKDIR/$FLDIR/config/basalt-wallpaper-setup.desktop" \
       "$WKDIR/$BLDDIR/config/includes.chroot/etc/xdg/autostart/"
    cp "$WKDIR/$FLDIR/config/basalt-welcome.desktop" \
       "$WKDIR/$BLDDIR/config/includes.chroot/etc/xdg/autostart/"
    cp "$WKDIR/$FLDIR/config/xdg/xfce4-clipman-plugin-autostart.desktop" \
       "$WKDIR/$BLDDIR/config/includes.chroot/etc/xdg/autostart/"
}

build_iso() {
    section "BUILD: Running live-build (this takes ~30 minutes)"
    cd "$WKDIR/$BLDDIR"

    # Clean build state (keep cache and config)
    $SUDO rm -rf chroot 2>/dev/null || true
    $SUDO rm -f binary.modified_timestamps chroot.files chroot.packages.* 2>/dev/null || true

    $SUDO lb build 2>&1 | tee "/home/user/basalt-build.log"
    BUILD_EXIT=${PIPESTATUS[0]}

    if [ $BUILD_EXIT -eq 0 ] && [ -f "Basalt-1.2-Obsidian-amd64.hybrid.iso" ]; then
        mv "Basalt-1.2-Obsidian-amd64.hybrid.iso" "Basalt-1.2-Obsidian-amd64.iso"
        echo "========================================"
        echo "  BUILD SUCCESS: Basalt-1.2-Obsidian-amd64.iso"
        echo "========================================"
    else
        echo "========================================"
        echo "  BUILD FAILED — check basalt-build.log"
        echo "========================================"
    fi
    cd "$WKDIR"
    return $BUILD_EXIT
}

# ============================================================
# MAIN BUILD SEQUENCE
# ============================================================
echo ""
echo "  Basalt Linux 1.2 — ISO Builder"
echo "  =============================="
echo "  $(date)"

clean_build
setup_cache
configure_lb
create_package_lists
copy_branding_and_configs
copy_assets_and_scripts
setup_xfce_and_autostart
build_iso
