# replace /home/$USER by ~
def tildize [] {
    if ($in | path split | zip ($env.HOME | path split) | all { $in.0 == $in.1 }) {
        ($in | str replace $env.HOME "~")
    } else {
        $in
    }
}

# remove extension shortcut
def rm-ext [] {
    $in | path parse | udpate extension "" | get parent stem | str join "/"
}

# ls builtin
alias _ls = ls

# shortcut for ls builtin
alias l = _ls

def _ls_format_mode [mode: string] {
    let chars = $mode | split chars
    let r1 = if ($chars | get 0) == "r" { [(ansi yellow_bold), "r", (ansi reset)] } else { [(ansi grey), "-"] }
    let w1 = if ($chars | get 1) == "w" { [(ansi red_bold), "w", (ansi reset)] } else { [(ansi grey), "-"] }
    let x1 = if ($chars | get 2) == "x" { [(ansi green_bold), "x", (ansi reset)] } else { [(ansi grey), "-"] }
    let r2 = if ($chars | get 3) == "r" { [(ansi yellow), "r", (ansi reset)] } else { [(ansi grey), "-"] }
    let w2 = if ($chars | get 4) == "w" { [(ansi red), "w"] } else { [(ansi grey), "-"] }
    let x2 = if ($chars | get 5) == "x" { [(ansi green), "x"] } else { [(ansi grey), "-"] }
    let r3 = if ($chars | get 6) == "r" { [(ansi yellow), "r", (ansi reset)] } else { [(ansi grey), "-"] }
    let w3 = if ($chars | get 7) == "w" { [(ansi red), "w"] } else { [(ansi grey), "-"] }
    let x3 = if ($chars | get 8) == "x" { [(ansi green), "x"] } else { [(ansi grey), "-"] }
    [$r1, $w1, $x1, $r2, $w2, $x2, $r3, $w3, $x3] | each { $in | str join } | str join
}

# quick and easy ls
def ls [dir?: string] {
    let output = _ls (if $dir == null { "" } else { $dir }) | sort-by type name -i
    if ($output | length) == 0 { "" | cat } else { $output | grid -c -s "  " | cat }
}

# ls with hidden files
def la [dir?: string] {
    _ls -al (if $dir == null { "" } else { $dir })
        | sort-by type name -i
        | each { $in | update mode (_ls_format_mode $in.mode) }
        | select mode name target user size modified
}

# ls with details
def ll [dir?: string] {
    _ls -l (if $dir == null { "" } else { $dir })
        | each { $in | update mode (_ls_format_mode $in.mode) }
        | sort-by type name -i
        | select mode name target user size modified
}

# du builtin
alias _du = du

# non recursive du
def du [...args] {
    let parsed_args = if ($args | is-empty) { ["*"] } else { $args }
    $parsed_args | each { _du -a $in | select path apparent physical } | flatten
}

# df
def df [] {
    ^df -h
        | str replace "Sys. de fichiers" "@"
        | str replace "Monté sur" "@"
        | detect columns
        | rename "filesystem" "size" "used" "available" "used%" "mountpoint"
}

# easy markdown formamtter
def to-md [] {
    let arg = $in
    $env.config.table.mode = markdown;
    echo $arg
}

# Useful aliases

# colored ip
alias ip = ip -c

# neovim
alias v = nvim

# quit
alias :q = exit

# evince in background
def pdf [arg: string] {
    pueue add -e evince $arg
}

# ripgrep
alias rg = rg -uu

# mkdir && cd
def --env mkcd [dir: string] { mkdir $dir; cd $dir }

# run command in background
alias pa = pueue add --immediate

# show background commands
def pst [] {
    pueue status -j
        | from json
        | get tasks
        | transpose
        | each { $in | get column1 }
        | each {
            let stdin = $in

            $stdin | update status (
                if $stdin.status == "Running" {
                    ((ansi yellow) + "Running")
                } else if not (echo $stdin.status | get -i Done | is-empty) {
                    let exit_value = $stdin.status | get "Done"

                    if ($exit_value == "Success") {
                        ((ansi green) + "Success")
                    } else {
                        (ansi red) + "Failed (" + ($exit_value | get "Failed" | into string) + ")"
                    }
                } else {
                    "Unknown???"
                }
              )
            | update path ($in.path | tildize)
            | update start ((ansi magenta) + ($in.start | date humanize))
            | update end ((ansi magenta) + ($in.end | date humanize))
        }
        | select status command path start end
}