#!/bin/bash

# get initial focused workspace
focusedws=$(hyprctl -j monitors | jq -r '.[] | select(.focused == true) | .activeWorkspace.id')

declare -A o=([1]=0 [2]=0 [3]=0 [4]=0 [5]=0 [6]=0 [7]=0 [8]=0 [9]=0 [10]=0)
declare -A monitormap
declare -A workspaces

# handle workspace create/destroy
workspace_event() {
    if (( $1 <= 10 )); then
        o[$1]=$2
        while read -r k v; do workspaces[$k]="$v"; done < <(hyprctl -j workspaces | jq -r '.[]|"\(.id) \(.monitor)"')
    fi
    if [ "$2" == "0" ]; then
        unset "workspaces[$1]"
    fi
}

# handle monitor (dis)connects
monitor_event() {
    while read -r k v; do monitormap["$k"]=$v; done < <(hyprctl -j monitors | jq -r '.[]|"\(.name) \(.id) "')
}

# generate the json for eww
generate() {

    unset activeWorkspaces

    while read -r i w; do
        activeWorkspaces[$w]=$i
    done < <(hyprctl -j monitors | jq -r '.[]|"\(.id) \(.activeWorkspace.id)"')
    
    echo -n '['

    for i in {1..10}; do
        echo -n ''$([ $i -eq 1 ] || echo ,)'{"ID":"'$i'","occupied":"'${o[$i]}'","activeID":"'${activeWorkspaces[$i]}'"}'
    done

    echo ']'
}

# setup

# add monitors
monitor_event

# add workspaces
while read -r k v; do workspaces[$k]="$v"; done < <(hyprctl -j workspaces | jq -r '.[]|"\(.id) \(.monitor)"')

# get active workspace
activeWorkspace=$(hyprctl -j monitors | jq -r '.[] | select(.focused == true) | .activeWorkspace.id')

# check occupied workspaces
for num in "${!workspaces[@]}"; do
    o[$num]=1
done
# generate initial widget
generate

socat -u UNIX-CONNECT:/tmp/hypr/"$HYPRLAND_INSTANCE_SIGNATURE"/.socket2.sock - | while read -r line; do
    case ${line%>>*} in
        "createworkspace")
            o=([1]=0 [2]=0 [3]=0 [4]=0 [5]=0 [6]=0 [7]=0 [8]=0 [9]=0 [10]=0)
            workspaces=()
            # add workspaces
            while read -r k v; do workspaces[$k]="$v"; done < <(hyprctl -j workspaces | jq -r '.[]|"\(.id) \(.monitor)"')
            # check occupied workspaces
            for num in "${!workspaces[@]}"; do
                o[$num]=1
            done
            # focusedws=${line#*>>}
            generate
            ;;
        "movewindow")
            generate
            ;;
        "moveworkspace")
            generate
            ;;
        "destroyworkspace")
            o=([1]=0 [2]=0 [3]=0 [4]=0 [5]=0 [6]=0 [7]=0 [8]=0 [9]=0 [10]=0)
            workspaces=()
            # add workspaces
            while read -r k v; do workspaces[$k]="$v"; done < <(hyprctl -j workspaces | jq -r '.[]|"\(.id) \(.monitor)"')
            # check occupied workspaces
            for num in "${!workspaces[@]}"; do
                o[$num]=1
            done
            generate
            ;;
        "monitor"*)
            monitor_event
            generate
            ;;
        "workspace")
            generate
            ;;
    esac
done