#!/usr/bin/env bash
set -Eeuo pipefail

CONFIG_HOME=${XDG_CONFIG_HOME:-"$HOME/.config"}
MODE_FILE="$CONFIG_HOME/eczos/theme-mode"
REQUESTED_MODE=${1:-}
NIGHTLIGHT_STATE=
mkdir -p "$CONFIG_HOME/eczos"
exec 9>"$CONFIG_HOME/eczos/theme-switch.lock"
flock 9

if [[ "$REQUESTED_MODE" = --nightlight-state ]]; then
    [[ ${2:-} = light || ${2:-} = dark ]] || {
        printf 'Usage: eczos-theme-switch --nightlight-state [light|dark]\n' >&2
        exit 2
    }
    NIGHTLIGHT_STATE=$2
    REQUESTED_MODE=
elif [[ -n "$REQUESTED_MODE" ]]; then
    case "$REQUESTED_MODE" in
        default|nightlight|auto|light|dark)
            # "auto" was the ECZOS 0.1 clock-based mode.  Keep it as a
            # compatibility alias while storing the new Night Light mode.
            [[ "$REQUESTED_MODE" != auto ]] || REQUESTED_MODE=nightlight
            printf '%s\n' "$REQUESTED_MODE" > "$MODE_FILE"
            chmod 0600 "$MODE_FILE"
            ;;
        *)
            printf 'Usage: eczos-theme-switch [default|nightlight|light|dark]\n' >&2
            exit 2
            ;;
    esac
fi

MODE=nightlight
if [[ -s "$MODE_FILE" ]]; then
    MODE=$(cat "$MODE_FILE")
fi
# Transparently migrate the old clock-based preference.  Existing users keep
# automatic switching, but KWin Night Light becomes its single source of truth.
[[ "$MODE" != auto ]] || MODE=nightlight

if [[ -n "$NIGHTLIGHT_STATE" ]]; then
    # Ignore delayed D-Bus events after the user has selected a fixed theme.
    [[ "$MODE" = nightlight ]] || exit 0
    ACTIVE_MODE=$NIGHTLIGHT_STATE
fi

case "${ACTIVE_MODE:-}" in
    light|dark) ;;
    '') case "$MODE" in
    default)
        ACTIVE_MODE=default
        ;;
    nightlight)
        ACTIVE_MODE=$(/usr/lib/eczos/eczos-theme-nightlight-sync --print-state 2>/dev/null || printf 'light\n')
        ;;
    light|dark)
        ACTIVE_MODE=$MODE
        ;;
    *)
        printf 'Invalid mode in %s; using auto.\n' "$MODE_FILE" >&2
        ACTIVE_MODE=light
        ;;
    esac ;;
esac

if [[ "$ACTIVE_MODE" = default ]]; then
    LOOK_AND_FEEL=org.kde.breeze.desktop
    COLOR_SCHEME=BreezeLight
    WALLPAPER=/usr/share/eczos/branding/wallpapers/eczoswallpaper.png
    START_ICON=file:///usr/share/eczos/branding/logo/logo-dark.png
elif [[ "$ACTIVE_MODE" = light ]]; then
    LOOK_AND_FEEL=org.kde.breeze.desktop
    COLOR_SCHEME=BreezeLight
    WALLPAPER=/usr/share/eczos/branding/wallpapers/eczoswallpaper-light.png
    START_ICON=file:///usr/share/eczos/branding/logo/logo-dark.png
else
    LOOK_AND_FEEL=org.kde.breezedark.desktop
    COLOR_SCHEME=BreezeDark
    WALLPAPER=/usr/share/eczos/branding/wallpapers/eczoswallpaper-dark.png
    START_ICON=file:///usr/share/eczos/branding/logo/logo.png
fi

lookandfeeltool -a "$LOOK_AND_FEEL" || \
    printf 'ECZOS warning: Plasma look-and-feel was not ready yet.\n' >&2
plasma-apply-colorscheme "$COLOR_SCHEME" || \
    printf 'ECZOS warning: Plasma colors were not ready yet.\n' >&2
kwriteconfig6 --file kdeglobals --group KDE --key LookAndFeelPackage "$LOOK_AND_FEEL"
kwriteconfig6 --file kdeglobals --group General --key ColorScheme "$COLOR_SCHEME"
if ! timeout 12s plasma-apply-wallpaperimage --fill-mode preserveAspectCrop "$WALLPAPER"; then
    sleep 2
    timeout 12s plasma-apply-wallpaperimage --fill-mode preserveAspectCrop "$WALLPAPER" || \
        printf 'ECZOS warning: wallpaper activation will be retried next time the theme is selected.\n' >&2
fi
kwriteconfig6 --file ksplashrc --group KSplash --key Engine KSplashQML
kwriteconfig6 --file ksplashrc --group KSplash --key Theme org.eczos.desktop

WALLPAPER_URL="file://$WALLPAPER"
kwriteconfig6 --file kscreenlockerrc \
    --group Greeter --key WallpaperPlugin org.kde.image
kwriteconfig6 --file kscreenlockerrc \
    --group Greeter --group Wallpaper --group org.kde.image --group General \
    --key Image "$WALLPAPER_URL"
kwriteconfig6 --file kscreenlockerrc \
    --group Greeter --group Wallpaper --group org.kde.image --group General \
    --key PreviewImage "$WALLPAPER_URL"

# Notify already-running KDE and Qt applications after both the global theme
# and explicit colour scheme have been committed.
dbus-send --session --type=signal /KGlobalSettings \
    org.kde.KGlobalSettings.notifyChange int32:0 int32:0 2>/dev/null || true

if ! timeout 12s qdbus6 org.kde.plasmashell /PlasmaShell org.kde.PlasmaShell.evaluateScript "
var allPanels = panels();
for (var panelIndex = 0; panelIndex < allPanels.length; panelIndex++) {
    var panelWidgets = allPanels[panelIndex].widgets();
    for (var widgetIndex = 0; widgetIndex < panelWidgets.length; widgetIndex++) {
        if (panelWidgets[widgetIndex].type == \"org.kde.plasma.kickoff\") {
            panelWidgets[widgetIndex].currentConfigGroup = [\"General\"];
            panelWidgets[widgetIndex].writeConfig(\"icon\", \"$START_ICON\");
        }
    }
}"; then
    printf 'ECZOS warning: Plasma panel was not ready for the launcher icon.\n' >&2
fi

printf 'ECZOS appearance set to %s (preference: %s).\n' "$ACTIVE_MODE" "$MODE"
