#!/bin/bash

GAP=""

print_info() {
    echo -n "$GAP"

    local DESK="$(bspc query --names -D -d focused)"

    case $DESK in
        1)
            DESKICON=""
            ;;
        2)
            DESKICON=""
            ;;
        3)
            DESKICON=""
            ;;
        4)
            DESKICON=""
            ;;
        5)
            DESKICON=""
            ;;
        6)
            DESKICON=""
            ;;
        7)
            DESKICON=""
            ;;
        8)
            DESKICON=""
            ;;
        9)
            DESKICON=""
            ;;
        *)
            DESKICON=""
            ;;
    esac
   
    if [ "$1" = "Empty" ]; then
        echo "$DESKICON    $(whoami)@$(uname -n) - $(uname -r)"
    else
        local wid="$1"
        
        # Doesn't always work, so xprop is more realiable here 
        # WM_CLASS="$(bspc query -T -n "$Node" | jq -r '.client.className')"  
        local WM_CLASS="$(xprop -id "$wid" WM_CLASS | awk '{print $4}' | tr -d '"')"
        local WM_NAME="$(xprop -id $wid _NET_WM_NAME | awk -F '=' '{print $2}'  | tr -d '"')"

        case "$WM_CLASS" in
            'firefox')
                echo "$DESKICON    ${WM_NAME:0:100}";;
            'kitty')
                echo "$DESKICON    ${WM_NAME:0:100}";;
            'code-oss')
                echo "$DESKICON    ${WM_NAME:0:100}";;
            'Audacious')
                echo "$DESKICON  ﱘ  ${WM_NAME:0:100}";;
            'io.github.celluloid_player.Celluloid')
                echo "$DESKICON    ${WM_NAME:0:100}";;
            'Lutris')
                echo "$DESKICON    ${WM_NAME:0:100}";;
            'discord')
                echo "$DESKICON  ﭮ  ${WM_NAME:0:100}";;
            'Nemo')
                echo "$DESKICON    ${WM_NAME:0:100}";;
            *)
                # https://stackoverflow.com/questions/1538676/uppercasing-first-letter-of-words-using-sed
                echo "$DESKICON  ${WM_NAME:0:100}" | sed -e "s/\b\(.\)/\u\1/g";;
        esac
    fi
}


exists_fullscreen_node() {
    local fullscreen_nodes="$(bspc query -N -n .fullscreen.\!hidden -d "$1")"

    if [ -n "$fullscreen_nodes" ]; then 
        echo '1'
    else
        echo '0'
    fi
}

process_window() {
    local desk="$2"    
    local wid="$1"
    local WM_CLASS="$(xprop -id "$wid" WM_CLASS | awk '{print $4}' | tr -d '"')"
    
    # If there is a fullscreen node, don't show anything, 
    # since we shouldn't see it
    if [ "$(exists_fullscreen_node "$desk")" = "1" ]; then
        return 0;
    fi
   


    print_info "$wid"
}


is_desktop_empty() {
    local desk="$1"
    local nodes="$(bspc query -N -n .window.\!hidden  -d "$desk")"


    if [ -n "$nodes" ]; then 
        echo '0'
    else
        echo '1'
    fi
}

process_desktop() {
    local desk="$1"
    local is_empty="$(is_desktop_empty "$desk")"

    if [ "$is_empty" = "1" ]; then

        print_info "Empty"
    fi
}

bspc subscribe node_focus | while read -r Event Monitor Desktop Node
do
    # For some reason "$Node" and "$Desktop" are not always working 
    # properly with sticky windows
    Node="$(xdotool getactivewindow)"
    Desktop="$(bspc query -D -d focused)"

    process_window "$Node" "$Desktop"

done &

bspc subscribe node_state | while read -r Event Monitor Desktop Node State Active 
do
    Node="$(xdotool getactivewindow)"
    Desktop="$(bspc query -D -d focused)"

    if [ "$State" != "fullscreen" ]; then
        continue;
    fi
    
    # So, if you will focus on the other windows of the same app,
    # which are not fullscreen, you will see icon


    if ![ "$Active" = "on" ]; then
        process_window "$Node"  "$Desktop"
    fi

done &

bspc subscribe node_add | while read -r Event Monitor Desktop Ip Node 
do
    State="$(bspc query -T -n "$Node" | jq -r '.client.state')"
done &

bspc subscribe node_flag | while read -r Event Monitor Desktop Node Flag Active 
do
    if [ "$Flag" = "hidden" ] && [ "$Desktop" = "$(bspc query -D -d .focused)" ]; then
        process_desktop "$Desktop"
    fi

done &

bspc subscribe node_remove | while read -r Event Monitor Desktop Node 
do
    process_desktop "$Desktop"

done &

bspc subscribe desktop_focus | while read -r Event Monitor Desktop 
do

    if [ "$(exists_fullscreen_node "$Desktop")" = "1" ]; then

        continue;
    fi

    process_desktop "$Desktop"

done 

