#!/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() {

  activeWorkspace=$(hyprctl -j monitors | jq -r '.[] | select(.focused == true) | .activeWorkspace.id')
  
  echo -n '['

  for i in {1..10}; do
    active=0
    if [[ $activeWorkspace == $i ]]; then
      active=1
    fi
    echo -n ''$([ $i -eq 1 ] || echo ,)'{"num":"'$i'","occupied":"'${o[$i]}'","active":"'$active'"}'
    # echo -n ''$([ $i -eq 1 ] || echo ,) '{ "number": "'"$i"'", "activity": "'"$(status_activity $i)"'", "color": "'$(status "$i")'" }'
  done

  # echo -n ',{"num":"'$focusedws'","clr":"'$(status "$focusedws")'"}'

  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
  # echo "${#workspaces[@]} ${#o[@]}"
  # echo $line
  case ${line%>>*} in
    "focusedmon")
      focusedws=${line#*,}
      generate
      ;;
    "createworkspace")
      # workspace_event "${line#*>>}" 1
      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
      ;;
    "destroyworkspace")
      # workspace_event "${line#*>>}" 0
      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
  # echo $line
  # generate
done