#!/bin/bash
# ABOUTME: Wrapper that merges system waybar config with per-machine userconfig.
# ABOUTME: Handles array prepend/append that waybar's native include cannot do.

SYSTEM_CONFIG="/etc/xdg/waybar/config"
SYSTEM_STYLE="/etc/xdg/waybar/style.css"
USER_DIR="${XDG_CONFIG_HOME:-$HOME/.config}/waybar"
USERCONFIG="$USER_DIR/userconfig"
OUTPUT="$USER_DIR/config"
USER_STYLE="$USER_DIR/style.css"

merge_config() {
    mkdir -p "$USER_DIR"

    if ! jq -s '
        .[0] as $sys | .[1] as $user |
        (($user.prepend // {}) | to_entries) as $prepends |
        (($user.append  // {}) | to_entries) as $appends |
        $sys |
        reduce $prepends[] as $p (.;
            .[$p.key] = ($p.value + (.[$p.key] // []))
        ) |
        reduce $appends[] as $a (.;
            .[$a.key] = ((.[$a.key] // []) + $a.value)
        ) |
        ($user | del(.prepend) | del(.append)) as $extras |
        . * $extras
    ' "$SYSTEM_CONFIG" "$USERCONFIG" > "${OUTPUT}.tmp" 2>&1; then
        local err
        err=$(cat "${OUTPUT}.tmp")
        rm -f "${OUTPUT}.tmp"
        logger -t moonarch-waybar "Config merge failed: $err"
        notify-send -u critical "moonarch-waybar" "Config merge failed — using system config.\n$err"
        return 1
    fi

    mv "${OUTPUT}.tmp" "$OUTPUT"
}

bootstrap_style() {
    if [[ ! -f "$USER_STYLE" ]]; then
        mkdir -p "$USER_DIR"
        cat > "$USER_STYLE" << 'CSS'
/* Generated by moonarch-waybar — add custom styles below */
@import url("/etc/xdg/waybar/style.css");
CSS
    fi
}

if [[ -f "$USERCONFIG" ]]; then
    if [[ ! -f "$OUTPUT" ]] ||
       [[ "$USERCONFIG" -nt "$OUTPUT" ]] ||
       [[ "$SYSTEM_CONFIG" -nt "$OUTPUT" ]]; then
        # On merge failure the previous $OUTPUT is stale — remove it so waybar
        # falls back to XDG's system config instead of running with stale merged data.
        merge_config || rm -f "$OUTPUT"
    fi
    bootstrap_style
fi

exec waybar "$@"
