#!/usr/bin/env bash
INSTALL_DIR="$HOME/.cadmus"
BIN_DIR="$HOME/.local/bin/"
mkdir "${BIN_DIR} > /dev/null

main () {
    me=`basename "$0"`

      HelpStatement $1
      UninstallQ $1
    printThis
    download_the_repo
    Install_bin
    check_path
    check_for_dependencies

    echo -e "\nInstallation Complete \n"
}

check_path () {
    echo "$PATH" | grep -q '.local/bin' || echo "bin-dir is not in path, you'll need to add it to the path"
}

function UninstallQ() {

    if [ "$1" == "-rm" ] || [ "$1" == "--rm"  ]; then
        echo "Removing..."
        rm "$HOME/.local/bin/cadmus"
        rm "${INSTALL_DIR}"
        exit 0
    fi

}

HelpStatement() {

    if [ "$1" == "-h" ] || [ "$1" == "--help"  ]; then
    echo -e "To uninstall do `basename $0` --rm ,

If you are on Arch stow 2.3.1-2 is broken, downgrade with

\e[1;35m
    sudo pacman -U https://archive.archlinux.org/packages/s/stow/stow-2.2.2-5-any.pkg.tar.xz
\e[0m

See this for more information:

\e[1;34m
    https://github.com/aspiers/stow/issues/65
\e[0m

        "
    fi
}

printThis () {

    echo "This Script will print to the terminal for review, press any key to continue"
    read -d '' -s -n1

    cd $(dirname "$0")
    pwd
    me=`basename "$0"`
    safePrint $me


    echo -e "\nAre you happy to proceed? Press y to continue \n"
    read -d '' -s -n1 proceedQ
    if [ "$proceedQ" != "y" ]; then
        exit 0
    fi
}

safePrint () {
    if hash highlight 2>/dev/null; then
        highlight "${1}" --syntax=bash --stdout
    else
        cat "${1}"
    fi
}


check_for_dependencies () {

    ## echo "Press Any Key to Check for dependencies, press the c Key to Skip this"
    ## read -d '' -s -n1 CheckDepQ
    ## if [ "$CheckDepQ" == "c" ]; then
    ##     return
    ## fi
    ##
    depLog="$(mktemp)"

    for i in ${StringArray[@]}; do
        command -v "$i" >/dev/null 2>&1 || { echo $i >> "${depLog}"; }
    done

    if [[ $(cat "${depLog}") == "" ]]; then
        echo -e "\nAll Dependencies Satisfied\n"
    else
        echo -e "\e[1;31m \nMissing the Following Dependencies \e[0m \n"
        echo -e "    \e[1;31m -------------------------\e[0m "
        echo -e "\e[1;32m \n"
        addBullets "$(cat "${depLog}")"
        echo -e "\e[0m \n"
        echo -e "They are listed in \e[1;34m "${depLog}" \e[0m \n"
    fi
}


addBullets() {
    command -v sed    >/dev/null 2>&1 || { echo >&2 "I require sed but it's not installed.  Aborting."; exit 1; }
    echo "$1" | sed 's/^/\t‣\ /g'
}

download_the_repo () {

    if [[ -d "${INSTALL_DIR}" ]]; then
        echo -e "Detected a cadmus install"

        if [ -f "${INSTALL_DIR}/config.json" ]; then
            oldConfigFile="$(mktemp)" && cat "${INSTALL_DIR}/config.json" > "${oldConfigFile}"
            echo -e "\n\tConfig File Backed up for later restore\n"
        fi

        ask_to_remove
        download_the_repo
        return
    else
        git clone https://github.com/RyanGreenup/cadmus "$HOME/.cadmus"
    fi

    echo -e "Repository is downloaded\n\n"

    if [[ "$CheckDepQ" == "y" ]] && [[ -f "${oldConfigFile}" ]]; then
        echo -e "Press y to restore the old config or any other key to continue otherwise\n"
        read -d '' -s -n1 CheckDepQ
        cp "${oldConfigFile}" "${INSTALL_DIR}/config.json"
        echo -e "Config Successfully restored"
    fi
}

ask_to_remove () {
    echo "press y to remove "${INSTALL_DIR}""

    read -d '' -s -n1 CheckDepQ
    if [ "$CheckDepQ" == "y" ]; then
            rm -rf "${INSTALL_DIR}"
    else
        exit 1
    fi
}

Install_bin() {
    if [ -f "${BIN_DIR}/cadmus" ]; then
        echo -e "The executable \e[1;32m "${BIN_DIR}"/cadmus \e[0m already exists, it must be replaced, press y to continue or any key to exit"
        read -d '' -s -n1 CheckDepQ
        if [ "$CheckDepQ" == "y" ]; then
                rm "${BIN_DIR}/cadmus"
        else
            exit 1
        fi
        Install_bin
    else
        ln -s "$HOME/.cadmus/bin/cadmus" "$HOME/.local/bin/" && echo -e "\nSuccessfully created symlink from $HOME/.cadmus/bin/cadmus to $HOME/.local/bin/ \n"
    fi
}

# Declare an array of string with type
declare -a StringArray=(
                        "highlight"
                        "node"
                        "nvim"
                        "fzf"
                        "code"
                        "sk"
                        "rg"
                        "perl"
                        "tectonic"
                        "stow"
                        "python"
                        "tmsu"
                        "ranger"
                        "mdcat"
                        "jq"
                        "shift"
                        "ip"
                        "xclip"
                        "sd"
                        "fd"
                        "sed"
                        "cut"
                        "grep"
                        "find"
                        "realpath"
                       )

# Iterate the string array using for loop
##

main "$@"
exit 0

## DONE Help
## DONE Uninstall