#!/bin/sh

# Cd into a directory using fzf
fcd () {
    dir=$(fd -a --type d --hidden --exclude ".git|.github" --color=never | fzf --prompt "Choose directory: ")
    [ -z $dir ] && return 1
    cd $dir
}

# Cd into specific repo
fr () {
    dir=$(fd . ~/repos --maxdepth 1 -a --type d --hidden --exclude ".git|.github" --color=never | fzf --prompt "Choose directory: ")
    [ -z $dir ] && return 1
    cd $dir
}

# Remove choosed stuff
frm () {
    remove=$(fd --hidden --maxdepth 1 --color=never | fzf -m --prompt "Choose to delete: ")
    [ -z $remove ] && return 1
    rm -rf $(printf '%s' $remove)
}

# Quicly choose stuff to add using fzf
fga () {
    git add $(git status -s | awk '{ print $2 }' | fzf -m)
}

# Open a script in path with vim quicly
vish () {
    nvim $(which $1)
}

# Create a directory and change into it
md () {
    mkdir -p "$@" && cd "$@"
}

# Move a file and create a link in it's place
mvln () {
    from=$(readlink -f $1)
    to="$2"
    [ ! -d "$(dirname $to)" ] && mkdir "$(dirname $to)"
    mv $from $to
    ln -s $to $from
}

# Find my script and let me edit them
se() {
    fd . ~/bin -L --type f --color=never | fzf --prompt "Choose script to edit: " \
        --preview 'bat --color=always --style=plain --pager=never {}' | xargs -r $EDITOR
}

# List my config and open the dir in a editor
ce() {
    current=$(pwd)
    dir=$(fd . ~/.config -L --maxdepth 1 --color=never | fzf --prompt \
        "Choose config to edit: " --preview 'tree -a -C {}')
    [ "$dir" = "" ] && return
    cd "$dir" && nvim .
    cd "$current"
}

# List files in a directory and edit choosen one
vf(){
    fd -L --maxdepth 1 --type f --color=never --hidden | fzf --prompt "Choose file to edit: " \
        --preview 'bat --color=always --style=plain --pager=never {}' | xargs -r $EDITOR
}

# history search
h() {
  print -z $( ([ -n "$ZSH_NAME" ] && fc -l 1 || history) | fzf +s --tac | sed -E 's/ *[0-9]*\*? *//' | sed -E 's/\\/\\\\/g')
}

# Copy current working directory
cpdir() {
    pwd | tr -d "\r\n" | xclip -sel c
}

# Copy content of a file.
cf() {
    cat $1 | xclip -sel c
}

# Open a bookmark from buku in browser
fb() {
  buku --nostdin -p -f5 | fzf | cut -f1 | xargs -r buku --nostdin -o
}

# Extract all archive in current path and remove the archive
erm() {
    for file in *.zip; do
        printf '%s\n' "Extracting $file"
        unzip $file
        rm -f $file
        printf '%s\n' ""
    done
}

# Check use flags of package in world
u() {
    cat /var/lib/portage/world | fzf --prompt "Choose package to uninstall: " --preview "equery u {}" --multi
}

# Check dependencies of packages in world
d() {
    cat /var/lib/portage/world | fzf --prompt "Choose package to uninstall: " --preview "emerge -pqe {}"
}

n () {
    # Block nesting of nnn in subshells
    [ "${NNNLVL:-0}" -eq 0 ] || {
        echo "nnn is already running"
        return
    }

    # Tempfile location
    NNN_TMPFILE="${XDG_CONFIG_HOME:-$HOME/.config}/nnn/.lastd"

    nnn "$@"

    [ ! -f "$NNN_TMPFILE" ] || {
        . "$NNN_TMPFILE"
        rm -f "$NNN_TMPFILE" > /dev/null
    }
}

upfast () {
    curl -F "file=@$(readlink -f $1)" "https://upfast.cronyakatsuki.xyz/"
}

# mblaze functions

# Get new mail for current profile
mnew () {
  maildir=$(grep "^Maildir:" $HOME/.mblaze/profile | cut -d: -f 2 | sed 's/ //g')
  profile=$(basename $maildir)
  if [ "$profile" = "local" ]; then
    mlist -s "$maildir"| msort -dr | mseq -S
  else
    mbsync -V $profile
    mlist -s "$maildir"/INBOX | msort -dr | mseq -S
  fi
}

# Get full mail for current profile including threads
mall () {
  maildir=$(grep "^Maildir:" $HOME/.mblaze/profile | cut -d: -f 2 | sed 's/ //g')
  sent=$(grep "^Outbox:" $HOME/.mblaze/profile | cut -d: -f 2 | sed 's/ //g')
  profile=$(basename $maildir)
  if [ "$profile" = "local" ]; then
    mlist "$maildir" | mthread -r -S "$maildir" | mseq -S
  else
    mbsync -V $profile
    mlist "$maildir"/INBOX | mthread -r -S "$sent" | mseq -S
  fi
}