#!/usr/bin/env zsh

# https://github.com/gokcehan/lf/blob/master/doc.md
# ^ List of all options

## LF VARS

set shellopts '-eu' # Treat undefined env vars as errors.  Exit upon error.
set ifs "\n"
set scrolloff 10
set icons # Use icons
set info "size"
set period 1 # Poll directory status every X seconds
set sixel true
set hiddenfiles ".*:*.aux:*.log:*.bbl:*.bcf:*.blg:*.run.xml"
set cleaner '~/.config/lf/cleaner' # Clear preview
set previewer '~/.config/lf/previewer' # Make preview
set autoquit true
set cursorpreviewfmt "" # No cursor in the directory preview pane
# set cursoractivefmt "\033[1m"
set drawbox true

## MAPPINGS

# LF control mappings
map <c-r> reload
map <c-s> set hidden!
map <enter> shell

# Spawn new terminal/lf windows
map <a-enter> $setsid -f $TERMINAL -e $SHELL >/dev/null 2>&1 &
map <a-e> $setsid -f $TERMINAL -e $SHELL -c -i "lfcd && exec $SHELL" >/dev/null 2>&1 &

# Opening commands
map l open
map L open new_window
map o $mimeopen --ask "$f"

# CRUD commands
# map D delete
map D push :delete?<space>[y/N]:<space>
map N push :mkdir<space>
map n push :touch<space>
map x push :chmod<space>
map U push :extract?<space>[y/N]:<space>
map Y $printf "%s" "$fx" | xclip -selection clipboard

# Renaming commands
map A :rename; cmd-end # at the very end
map a :rename; cmd-right # after extension
map r push A<c-u> # new rename
map i :rename # before extension
map I :rename; cmd-home # at the very beginning

map R drag-and-drop

# Fuzzy finding
map <c-f> $lf -remote "send $id select \"$(fzf)\""
map F broot_jump

map b set_bg one
map B set_bg all


## COMMAND DEFINITIONS

cmd touch %touch $1 && lf -remote "send $id load" && lf -remote "send $id select $1"

cmd mkdir %mkdir $1 && lf -remote "send $id load" && lf -remote "send $id select $1"

cmd chmod %chmod $1 "$fx" && lf -remote "send $id reload"

cmd delete? ${{
    [ -v 2 ] || exit 0 # Makes sure argument was passed in
    [ ! "$2" = "y" ] && exit 0 # Exit if delete not confirmed
    rm -rf -- $fx
}}

cmd set_bg ${{
    if [ -z "$(pidof Hyprland)" ]; then
        rm -f ~/.config/wallpaper
        cp "$fx" ~/.config/wallpaper
        feh --bg-fill --no-fehbg "$HOME/.config/wallpaper"
        exit
    fi  
    if [ "$1" = "all" ]; then
        swww img "$fx"
    else
        output="$(slurp -o -f "%o")"
        swww img "$fx" --outputs "$output"
    fi
}}

cmd drag-and-drop ${{
    GKD_BACKEND=11 setsid -f dragon "$fx" >/dev/null 2>&1
}}

cmd extract? ${{
    [ -v 2 ] || exit 0 # Makes sure argument was passed in
    [ ! "$2" = "y" ] && exit 0 # Exit if delete not confirmed

    case $(file --mime-type "$(readlink -f $f)" -b) in
    application/x-rar)
        unrar x $fx
        ;;
    *)
        aunpack $fx
        ;;
    esac
}}

cmd broot_jump ${{
  f=$(mktemp)
  res="$(broot --outcmd $f && cat $f | sed 's/cd //')"
  rm -f "$f"
  if [ -f "$res" ]; then
    cmd="select"
  elif [ -d "$res" ]; then
    cmd="cd"
  fi
  lf -remote "send $id $cmd \"$res\""
}}

cmd open ${{
    # Set $new_window based on arguments
    [ ! -z $@ ] && [ "$@" = "new_window" ] && new_window=1

    function launch {
        [ -v WAYLAND_DISPLAY ] && swallower="swallow" || swallower="devour"

        if [ ! -v new_window ]; then
            $swallower "$@" >/dev/null 2>&1
        else
            setsid -f "$@" >/dev/null 2>&1
        fi
    }

    case $(file --mime-type "$(readlink -f $f)" -b) in
    application/json|\
    application/x-subrip|\
	application/pgp-encrypted|\
    inode/x-empty|\
    text/*)
        case "${f##*.}" in
            org|typ)
                # Any "document" like file ought to be in emacs
                launch emacsclient -c "$fx"
                exit
                ;;
        esac
        [ -v new_window ] \
            && ($TERMINAL -e $SHELL -c "$EDITOR \"$fx\"" >/dev/null 2>&1 &) \
            || ($EDITOR "$fx")
        ;;
    audio/*|video/x-ms-asf) 
        launch mpv --audio-display=no "$f"
        ;;
	video/*) 
        launch mpv -quiet "$f"
        ;;
    application/epub*|\
    application/octet-stream|\
    application/pdf|\
    application/postscript|\
    application/vnd.djvu|\
    image/vnd.djvu)
        launch zathura "$fx"
        ;;
    image/*) 
        find . -maxdepth 1 -type f -exec file -i {} \; | 
        grep -E 'image/.*' | 
        awk -F: '{ print substr($0, 1, length($0) - length($NF) - 1) }' |
        rotdir $f |
		launch nsxiv -aio |
        while read -r file; do
			[ -z "$file" ] && continue
			lf -remote "send select \"$file\""
			lf -remote "send toggle"
		done &
		;;
    application/msword|\
    application/octet-stream|\
    application/vnd.ms-powerpoint|\
    application/vnd.oasis.opendocument.database|\
    application/vnd.oasis.opendocument.formula|\
    application/vnd.oasis.opendocument.graphics|\
    application/vnd.oasis.opendocument.graphics-template|\
    application/vnd.oasis.opendocument.presentation|\
    application/vnd.oasis.opendocument.presentation-template|\
    application/vnd.oasis.opendocument.spreadsheet|\
    application/vnd.oasis.opendocument.spreadsheet-template|\
    application/vnd.oasis.opendocument.text|\
    application/vnd.openxmlformats-officedocument.presentationml.presentation|\
    application/vnd.openxmlformats-officedocument.spreadsheetml.sheet|\
    application/vnd.openxmlformats-officedocument.wordprocessingml.document)
        launch libreoffice "$fx"
        ;;
    *)
        ;;
    esac
}}

cmd open_new_window ${{
    new_window=1 && cmd open
}}

