#!/usr/bin/env sh
# Script for opening a file, intended for use by a terminal file manager.

function help_exit() {
    echo "Utility for opening different filetypes.

Usage:
  $ opener [-n {num}] {file} # Open the file in the current shell
  $ opener [-n {num}] detatch {file} # Detatch the program into a new shell

[num]: which opener to use, in order of precedence. defaults to 1
"
    exit 0
}

num=1
[ "$1" = "-n" ] && num=$2 && shift 2

# Whether to open in a new window
detatch=0
[ "$1" = "detatch" ] && detatch=1 && shift 1

list=0
[ "$1" = "list" ] && list=1 && shift 1

# First arg must be a file
file="$1"
[ ! -f "$file" ] && echo "Not a file: '$file'" && help_exit
while [ -L "$file" ]; do
    # Resolve symlinks
    file=$(readlink "$file")
done

function list_exit() {
    [ "$list" -ne 1 ] && return
    i=1
    for arg in "$@"; do
        echo "$i: $arg"
        i=$((i + 1))
    done
    exit 0
}

function launch_gui() {
    if [ "$detatch" -eq 0 ]; then
        [ -n "$WAYLAND_DISPLAY" ] \
            && precmd="swallow" `# For Hyprland` \
            || precmd="devour"   # For X
    else
        precmd="setsid -f"
    fi

    $precmd "$@" >/dev/null 2>&1
}

function launch_term() {
    if [ "$detatch" -eq 1 ]; then
        # This is a bit of a hack.  Shell only expects a single argument into
        # the -c flag, so it needs to be wrapped in quotes.  However, if "$@"
        # wher passed in with `mpv "my file.mp3"`, it would not preserve the
        # $2 having a space and would instead split it up into 3 arguments
        # into the new shell.  Wrapping everything argument in quotes is the
        # only general solution I could come up with.
        command_string=""
        while [ $# -gt 0 ]; do
            command_string="$command_string \"$1\""
            shift
        done
        setsid -f $TERMINAL -e $SHELL -c "$command_string; exec $SHELL" >/dev/null 2>&1
    else
        clear
        "$@"
    fi
}

case $(file --mime-type "$file" -b) in
    application/javascript|\
    application/json|\
	application/pgp-encrypted|\
    application/x-subrip|\
    inode/x-empty|\
    text/*)
        list_exit \
            "Neovim" \
            "Emacs GUI" \
            "Emacs TUI"

        if [ "$num" -eq 2 ]; then
            launch_gui emacsclient -c -a emacs "$file"
        elif [ "$num" -eq 3 ]; then
            launch_term emacsclient -nw -a 'emacs -nw' "$file"
        else
            launch_term nvim "$file"
        fi
        ;;
    image/*)
        list_exit \
            "nsxiv"
        launch_gui nsxiv "$file"
        ;;
	video/*) 
        list_exit \
            "Neovim" \
            "Emacs GUI" \
            "Emacs TUI"
        launch_gui mpv -quiet "$file"
        ;;
    application/epub*|\
    application/octet-stream|\
    application/pdf|\
    application/postscript|\
    application/vnd.djvu|\
    image/vnd.djvu)
        list_exit \
            "Zathura"
        launch_gui zathura "$file"
        ;;
    audio/*|\
    video/x-ms-asf) 
        list_exit \
            "MPV"
        # If it has an album cover, launch graphical mpv
        [ -z "$(mediainfo "$1" | grep "Cover\s*: Yes")" ] \
            && (launch_term mpv --audio-display=no "$file") \
            || (launch_gui mpv "$file")
        ;;
    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)
        list_exit \
            "LibreOffice"
        launch_gui libreoffice "$file"
        ;;
    *)
        echo "No program defined for this filetype."
        ;;
esac

exit 0

