#! /bin/sh

################################################################################
#                ██████╗ ███████╗██████╗ ██╗    ██╗███╗   ███╗                 #
#                ██╔══██╗██╔════╝██╔══██╗██║    ██║████╗ ████║                 #
#                ██████╔╝███████╗██████╔╝██║ █╗ ██║██╔████╔██║                 #
#                ██╔══██╗╚════██║██╔═══╝ ██║███╗██║██║╚██╔╝██║                 #
#                ██████╔╝███████║██║     ╚███╔███╔╝██║ ╚═╝ ██║                 #
#                ╚═════╝ ╚══════╝╚═╝      ╚══╝╚══╝ ╚═╝     ╚═╝                 #
################################## By: srdusr ##################################

# ##############################################################################
# #                                  ENV VARS                                  #
# ##############################################################################

## Environments
export PATH="${PATH}:${HOME}/.config/bspwm/bin"

# Get the name of the primary monitor
mainmonitor=$(xrandr --query | awk '/ primary/{print $1}')

## Monitors
# If no primary monitor is identified, use the first connected monitor
if [ "$mainmonitor" = "" ]; then
    mainmonitor=$(xrandr --query | awk '/ connected/ {print $1; exit}')
fi

# Set up workspaces on the primary monitor
bspc monitor "$mainmonitor" -d 󰲡 󰲣 󰲥 󰲧 󰲩 #1 2 3 4 5

# Check the number of connected monitors
connected_monitors=$(xrandr --query | grep -c " connected")

if [ "$connected_monitors" -gt 1 ]; then
    # Get the name of the secondary monitor (exclude the primary monitor)
    secondmonitor=$(xrandr --query | awk '/ connected/ && $1 != "'"$mainmonitor"'" {print $1; exit}')

    # Set up workspaces on the secondary monitor
    bspc monitor "$secondmonitor" -d 󰲫 󰲭 󰲯 󰲱 󰿭 #6 7 8 9 10
    # Check if the secondary monitor is connected and configure the layout
    if [ "$secondmonitor" != "" ]; then
        xrandr --output "$mainmonitor" --primary --auto --output "$secondmonitor" --auto --right-of "$mainmonitor"
    fi
fi

#INTERNAL_MONITOR="LVDS-1"
#EXTERNAL_MONITOR="HDMI-1"
## on first load setup default workspaces
#if [[ "$1" = 0 ]]; then
#	if [[ $(xrandr -q | grep "${EXTERNAL_MONITOR} connected") ]]; then
#		bspc monitor "$EXTERNAL_MONITOR" -d 1 2 3 4 5
#		bspc monitor "$INTERNAL_MONITOR" -d 6 7 8 9 10
#		bspc wm -O "$EXTERNAL_MONITOR" "$INTERNAL_MONITOR"
#	else
#		bspc monitor "$INTERNAL_MONITOR" -d 1 2 3 4 5 6 7 8 9 10
#	fi
#fi

# ##############################################################################
# #                                  FUNCTIONS                                 #
# ##############################################################################

config() { bspc config "$@" & }
rule() { bspc rule -a "$@" & }
run_once() {
    if [ ! "$(pgrep -f "$1")" ]; then
        "$@" &
    fi
}

# ##############################################################################
# #                                 WINDOW RULES                               #
# ##############################################################################

## Rules
bspc rule -r *:* # remove all rules first
rule '*' --one-shot state=below private=border_width:10
rule '*:Tiled' --one-shot state=tiled rectangle=50x50+0+50
rule '*' --one-shot state=floating rectangle=50x50+0+50
#rule \* rectangle=680x700+340+40
rule '*:*:Picture-in-Picture' state=floating sticky=on layer=above
rule '*:*:Picture in picture' state=floating sticky=on layer=above
rule firefox:Toolkit focus=on state=floating sticky=on layer=above rectangle=400x280+955+475 #320x190+1030+480 #522x316-10+280
rule "https://www.youtube.com - Enhancer for YouTube™ — Mozilla Firefox" state=floating sticky=on layer=above
rule Wezterm state=floating
rule Zathura state=tiled
rule Pavucontrol state=floating rectangle=490x260+862+37
rule Blueman-manager state=floating rectangle=536x420+818+37 #490x260-9+37
rule scratchpad sticky=on state=floating # SCRATCHPAD
rule heads-up-display sticky=on state=floating rectangle=360x160+990+40 # Heads Up Display (scratchpad)
rule Onboard sticky=on state=floating rectangle=700x205+480-89 # Virtual keyboard
rule Plank layer=above border=off
rule Protonvpn state=floating
rule firefox desktop='^1'
#rule Spotify desktop='^5'
#rule "Spotify (ad-block)" desktop='^5'
#bspc rule -a Spotify:spotify desktop='^󰲥' state=tiled
#bspc rule -a '*:spotify' desktop='^3' state=tiled


# ##############################################################################
# #                                AUTOSTART APPS                              #
# ##############################################################################

#"$HOME"/.scripts/bspwm_setup_monitors &
pgrep -x sxhkd >/dev/null || sxhkd &
picom -b --experimental-backends &
#xfce4-panel --disable-wm-check &
"$HOME"/.config/polybar/launch.sh &
dunst &     # notification daemon
run_once unclutter & # Remove mouse when idle
nitrogen --force-setter=xinerama --restore &
"$HOME"/.scripts/lockscreen-wallpaper &
xss-lock -- betterlockscreen -l &

# Run polkit daemon if doesn't started.
#[ "$(pidof xfce-polkit)" != "" ] || /usr/lib/xfce-polkit/xfce-polkit &
/usr/lib/polkit-gnome/polkit-gnome-authentication-agent-1 &

#rm "$HOME"/.cache/dunst.log
#rm -r "$HOME"/.cache/dunst/
#rm "$HOME"/.cache/eww-control-center.lock
pkill eww
eww daemon
#eww open notification-popup
#"$HOME"/.local/bin/eww open bar &
#xdo lower -N eww-bar
#"$(which eww)" -c "$HOME"/.config/eww --restart open bar &
#pkill hotspots
#hotspots &
#pkill logs.sh
#logs.sh &

# Volume and brightness indicator (xob)
# Activate virtual environment
source "$HOME"/.virtualenvs/bin/activate
run_once "$HOME"/.config/xob/launch.sh &
## Deactivate virtual environment
deactivate

#wmname LG3D # Fixes Java applications
#export QT_QPA_PLATFORMTHEME="qt5ct" # Use qt5ct to set Qt theme
run_once low-bat-notifier &
pkill plank.sh
plank.sh &
#run_once signal-desktop --start-in-tray & #--use-tray-icon
#run_once onboard --not-show-in=DESKTOPS &

declare -a restart=(plank flameshot clipit redshift blueman-applet)
for i in "${restart[@]}"; do
    pgrep -x "$i" | xargs kill
    sleep 0.5
    eval "$i" &
done

if [[ ! $(pidof stalonetray) ]]; then
    stalonetray &
    sleep 0.5
    xdo hide -N stalonetray
    touch "/tmp/syshide.lock"
fi


# ##############################################################################
# #                            CONFIGURATION                                   #
# ##############################################################################

## Config
PANEL_HEIGHT=30
config top_padding "$PANEL_HEIGHT"
config honor_size_hints true
config automatic_scheme alternate
config initial_polarity second_child
config pointer_modifier mod1
#config pointer_modifier mod2
config pointer_action1 move
config pointer_action2 resize_side
config pointer_action3 resize_corner
config focus_follows_pointer false
config remove_disabled_monitors true
config remove_unplugged_monitors true
config merge_overlapping_monitors true
config border_width 2
config window_gap 10
config split_ratio 0.52
config borderless_monocle true
config gapless_monocle true
config swallow_first_click false
#config pointer_action1 resize_side
#config pointer_action1 resize_corner
#config pointer_action3 move
config normal_border_color "#404040"
config focused_border_color "#000000"
config active_border_color "#000000"
config presel_feedback_color "#BF616A"
#config normal_border_color "#282828"
#config active_border_color "#ebdbb2"
#config focused_border_color "#fe8019"


# ##############################################################################
# #                                 MISCELLANEOUS                              #
# ##############################################################################

## Fullscreen
bspc subscribe node_state | while read -r _ _ _ _ state flag; do
    if [[ "$state" != fullscreen ]]; then continue; fi
    if [[ "$flag" == on ]]; then
        xdo lower -N Plank
        #"$(which eww)" -c "$HOME"/.config/eww close-all
    else
        xdo raise -N Plank
        #"$(which eww)" -c "$HOME"/.config/eww open bar
    fi
done &

## Title-bar
pkill -9 title-bar && pkill -9 lemonbar
# Check if title-bar is already running
if ! pgrep -x "title-bar" >/dev/null; then
    # Create a lock file
    lockfile="/tmp/title-bar.lock"

    # Check if the lock file exists
    if [ ! -e "$lockfile" ]; then
        # Create the lock file
        touch "$lockfile"

        # Start bspc subscribe in the background
        bspc subscribe | while read; do
            if ! pgrep -x "title-bar" >/dev/null; then
                bash "$HOME/.scripts/title-bar" &
            fi
        done &

        # Remove the lock file when the script exits
        trap 'rm -f "$lockfile"' EXIT
    else
        echo "title-bar is already running."
    fi
fi

config external_rules_command ~/.config/bspwm/scripts/external_rules.sh
