#!/usr/bin/env bash

[ -z $SQL_PROXY_HOST ] && SQL_PROXY_HOST="localhost"
CONNECTION_CACHE="$HOME/.cache/sqlproxy_$SQL_PROXY_HOST"

HELP="Usage: myssh [ls|connect]
SUBCOMMANDS:
  ls: list available database hosts
  connect: connect to a database host
  disconnect: Quit existing ssh master session

SYNTAX connect host [-u user] [-p password] [-c client]
"

ssh_status() {
    ssh -O check -S $HOME/.ssh/controlmasters/%r@%h:%p $SQL_PROXY_HOST > /dev/null 2>&1
    echo $?
}

connect() {
    mkdir -p $HOME/.ssh/controlmasters

    if [ $(ssh_status) -ne 0 ]
    then
        echo "" > $CONNECTION_CACHE
        ssh -o "ControlPersist=10m" -M -S $HOME/.ssh/controlmasters/%r@%h:%p $SQL_PROXY_HOST q
    fi
}

disconnect() {
    if [ $(ssh_status) -eq 0 ]
    then
        ssh -O stop -S $HOME/.ssh/controlmasters/%r@%h:%p $SQL_PROXY_HOST q
    fi
}

port_forward() {
    ACTIVE_HOST=$(cat $CONNECTION_CACHE)
    if [ -z $ACTIVE_HOST ] || [ $ACTIVE_HOST != $1 ]
    then
        if [ ! -z $ACTIVE_HOST ]
        then
            ssh -O cancel -L 3306:$ACTIVE_HOST:3306 -S $HOME/.ssh/controlmasters/%r@%h:%p $SQL_PROXY_HOST q
        fi
        ssh -O forward -L 3306:$1:3306 -S $HOME/.ssh/controlmasters/%r@%h:%p $SQL_PROXY_HOST
    fi
    echo $1 > $CONNECTION_CACHE
}

ls_hosts() {
    ssh -S $HOME/.ssh/controlmasters/%r@%h:%p $SQL_PROXY_HOST ls
}

run_client() {
    if [ $(uname -s) = "Linux" ]
    then
        mysql --protocol=TCP -u $1 -p$2 -h localhost -P 3306
    else
        open "mysql://$1:$2@localhost:3306" -a "Sequel Ace"
    fi
}

MAIN_OPTION=$1
shift

# ensure connection
connect
case $MAIN_OPTION in
    ls)
        ls_hosts;;
    connect)
        # check if host is valid
        TARGET_HOST=$1
        shift
        ls_hosts | grep -qe "^$TARGET_HOST$"
        GREP_EXIT_CODE=$?
        if [ $GREP_EXIT_CODE -eq 0 ]
        then
            while getopts "u:p:" o
            do
                case "$o" in
                    u) MYSQL_USERNAME="$OPTARG" ;;
                    p) MYSQL_PASSWORD="$OPTARG" ;;
                esac
            done
            port_forward $TARGET_HOST
            if [ ! -z $MYSQL_USERNAME ] && [ ! -z $MYSQL_PASSWORD ]
            then
                run_client $MYSQL_USERNAME $MYSQL_PASSWORD
            fi
        else
            echo "Invalid Hostname: $TARGET_HOST."
        fi
        ;;
    disconnect)
        disconnect;;
    *)
        echo -e "Usage: myssh [ls|connect]\n\n";;
esac