#!/bin/sh

# Quit on escape
set -o emacs
bind '"\e": "\C-W\c-d"'

OPEN_MODE="new_pane"

debug () {
    if [ "$VERBOSE" = true ]; then
        echo $1
    fi
}

spinner() {
  local s="⣾⣽⣻⢿⡿⣟⣯⣷"
  local -i i=0
  while :; do
    printf "%s\\r" "${s:$((i++%4)):1}" >&2
    sleep .1
  done

}

open_local () {
    tmux send-keys "cd $PROJECT_PATH" Enter

    # Close tmux popup if any
    tmux display-popup -C
}

open_new_pane () {
    tmux has-session -t $SESSION_NAME 2>/dev/null
    if [ $? != 0 ]; then
        debug "Session $SESSION_NAME missing, creating it."
        tmux new-session -s $SESSION_NAME -d -n $PROJECT_NAME -c $PROJECT_PATH
    fi

    tmux has-session -t $SESSION_NAME:$PROJECT_NAME 2>/dev/null
    if [ $? != 0 ]; then
        debug "Window $PROJECT_NAME in $SESSION_NAME not found, creating it."
        tmux new-window -t $SESSION_NAME -n $PROJECT_NAME -d -c $PROJECT_PATH
    fi

    tmux switch-client -t $SESSION_NAME:$PROJECT_NAME

    # Close tmux popup if any
    tmux display-popup -C
}

while getopts "lv" option; do
    debug "Reading option $option"
    case $option in
        l)
            OPEN_MODE="local"
            ;;
        v)
            VERBOSE=true
            ;;
    esac
done

declare -A CUSTOM_SESSIONS
CUSTOM_SESSIONS[Projects]=Halia

spinner &
spinner_pid=$!

PROJECT_LIST=$(find ~/* -name .git -type d -not -path "~/.*" -prune 2>/dev/null)

kill $spinner_pid

SELECTED=$(echo $PROJECT_LIST | sed 's/\/.git/\n/g' | sed "s/$(echo $HOME | sed 's/\//\\\//g')//" | cut -d'/' -f2- | fzf)

debug "Selected $SELECTED"

PROJECT_PATH=$(echo $PROJECT_LIST | sed 's/\/.git/\n/g' | grep "${SELECTED}$")
PROJECT_ROOT=$(echo $SELECTED | cut -d '/' -f1)
PROJECT_NAME=$(echo $SELECTED | rev | cut -d '/' -f1 | rev)

SESSION_NAME=$([ -z "${CUSTOM_SESSIONS[$PROJECT_ROOT]}" ] && echo "$PROJECT_ROOT" || echo "${CUSTOM_SESSIONS[$PROJECT_ROOT]}")

debug "Project path is $PROJECT_PATH"
debug "Opening in $OPEN_MODE"

case $OPEN_MODE in
    "new_pane")
        open_new_pane
        ;;
    "local")
        open_local
        ;;
esac