#!/usr/bin/env nu

def log [msg: string]: nothing -> nothing {
    mkdir ~/.cache/bspwm
    $"(date now | format date "%+")|($msg)\n" | save --force --append ~/.cache/bspwm/log.txt
}

log "STARTING BSPWM"
log ($env.PATH | to nuon)

# connect a single monitor with xrandr
#
# when no external monitor is connected, the primary one is made auto
# when external monitors are connected, the first one is connected and the primary one is disconnected
def "xrandr connect monitor" [] {
    let monitors = ^xrandr
        | lines
        | find ' connected'
        | split column " " name . type
        | select name type

    let primary = $monitors | where type == primary | get 0.name
    let externals = $monitors | where type != primary

    if not ($externals | is-empty) {
        ^xrandr --output $primary --off --output ($externals | get 0.name) --auto
    } else {
        ^xrandr --auto
    }
}

def "bspc configure" [config: record] {
    bspc config border_width $config.border_width
    bspc config window_gap $config.window_gap
    bspc config top_padding $config.padding.top
    bspc config bottom_padding $config.padding.bottom
    bspc config left_padding $config.padding.left
    bspc config right_padding $config.padding.right
    if $config.monocle.single {
        bspc config single_monocle true
    }
    bspc config borderless_monocle ($config.monocle.borderless | into string)
    bspc config gapless_monocle ($config.monocle.gapless | into string)
    bspc config click_to_focus $config.focus.click
    if $config.focus.follow_pointer {
        bspc config focus_follows_pointer true
    }
    bspc config ignore_ewmh_focus ($config.focus.ignore_ewmh | into string)
    bspc config split_ratio ($config.split_ratio | into string)
    bspc config remove_disabled_monitors ($config.monitors.remove_disabled | into string)
    bspc config merge_overlapping_monitors ($config.monitors.merge_overlapping | into string)
    bspc config pointer_modifier ($config.pointers.modifier | into string)
    bspc config pointer_action1 $config.pointers.actions.0
    bspc config pointer_action2 $config.pointers.actions.1
    bspc config pointer_action3 $config.pointers.actions.2

    bspc config focused_border_color $config.color.border.focused
    bspc config active_border_color $config.color.border.active
    bspc config presel_feedback_color $config.color.presel_feedback
    bspc config normal_border_color $config.color.border.normal

    $config.windows.rules?.tile? | default [] | each {|name|
        bspc rule --add $name state=tiled focus=on follow=on manage=on
    }
    $config.windows.rules?.chat_clients? | default [] | each {|name|
        bspc rule --add $name desktop ($config.desktops | last) state=tiled focus=off follow=off manage=on
    }
    $config.windows.rules?.float? | default [] | each {|name|
        bspc rule --add $name state=floating focus=on follow=on manage=on rectangle=1600x900+160+90
    }

    bspc monitor --reset-desktops ...$config.desktops
}

let config_file = $env.CURRENT_FILE | path dirname | path join "config.nuon"
let keybindings_file = $env.CURRENT_FILE | path dirname | path join 'sxhkdrc'

let config = if ($config_file | path exists) {
    open $config_file
} else {
    {}
}

$config.env?
    | transpose var val
    | update var { prepend "WM_" | str join }
    | transpose --header-row
    | into record
    | load-env

bspc configure $config
log "bspc configured"

xrandr connect monitor
log "monitor connected"

if not (which dunst | is-empty) {
    # FIXME: do not use `bash -c "... &"`
    # related to https://github.com/nushell/nushell/issues/247
    bash -c "dunst -conf ~/.config/dunst/dunstrc &"
    log "dunst started"
}

if not (ps | find Xorg | is-empty) {
    xset s off
    xset -dpms
    log "DPMS disabled"
}

if not (pgrep sxhkd | is-empty) {
    killall sxhkd
}
# FIXME: do not use `bash -c "... &"`
# related to https://github.com/nushell/nushell/issues/247
bash -c $"sxhkd -c ($keybindings_file) ~/.config/sxhkd/sxhkdrc &"
log "SXHKD started"

notify-send --urgency normal --expire-time 3000 -- "bspwm has been fully loaded!"
log "BSPWM fully loaded"
