#!/bin/bash
# shellcheck disable=2045,2086

ZSHFOLDER=$HOME/.config/zsh
CONFIG="$HOME/.config"

# Colours
RED='\033[0;31m'
GREEN='\033[0;0;32m'
NC='\033[0m'

function timestamp() {
    echo -e "${GREEN}[+]${NC} $(date +'%F %T') [INFO] $*"
}

function err() {
    echo -e "${RED}[-] $(date +'%F %T') [ERROR] $*${NC}" >&2
}

function command_start() {
    timestamp "Command $* has been started."
    if ! "$*"; then
        err "Command $* went wrong."
        exit
    fi
    timestamp "Command $* has been ended."
}

function update_pip() {
    # Update the pip
    python3 -m pip install --upgrade pip --user
}

function install_neovim_module_for_python() {
    # Python module in neovim
    pip3 install neovim --pre --user --force --quiet
}

function install_pyright() {
    # Install pyright
    sudo npm -s -g i pyright --force
}

function install_bash-language-server() {
    # Install bash-language-server
    sudo npm -s -g i bash-language-server --force
}

function install_yaml-language-server() {
    # Install yaml-language-server
    sudo npm -s -g i yaml-language-server --force
}

function install_shfmt() {
    # Install shfmt
    GO111MODULE=on go install mvdan.cc/sh/v3/cmd/shfmt@latest
}

function install_lazy() {
    # Install shfmt
    GO111MODULE=on go install github.com/jesseduffield/lazygit@latest
    GO111MODULE=on go install github.com/jesseduffield/lazydocker@latest
}

function install_terraform() {
    # Install terraform and terraform-ls
    GO111MODULE=on go install github.com/hashicorp/terraform@latest
    GO111MODULE=on go install github.com/hashicorp/terraform-ls@latest
    if [[ "$(uname)" == "Darwin" ]]; then
        brew install tflint -q
        brew install tfenv -q
        TFENV_ARCH=amd64 tfenv install latest
    else
        curl -s https://raw.githubusercontent.com/terraform-linters/tflint/master/install_linux.sh | bash
    fi
}

function install_terragrunt() {
    # Install terragrunt
    if [[ "$(uname)" == "Darwin" ]]; then
        brew install terragrunt -q
    else
        wget https://github.com/gruntwork-io/terragrunt/releases/latest/download/terragrunt_linux_amd64 -O $HOME/.local/bin/terragrunt
        chmod +x $HOME/.local/bin/terragrunt
    fi
}

function install_shellcheck() {
    # Install shellcheck
    if [[ "$(uname)" == "Darwin" ]]; then
        brew install shellcheck -q
    else
        curl -s https://raw.githubusercontent.com/terraform-linters/tflint/master/install_linux.sh | bash
    fi
}

function install_go() {
    # Install the golang
    if [[ "$(uname)" == "Darwin" ]]; then
        brew install golang -q
    elif [[ "$(uname -r)" =~ "gentoo" ]]; then
        sudo emerge dev-lang/go
    fi
}

function install_gopls() {
    # Install gopls
    GO111MODULE=on go install golang.org/x/tools/gopls@latest
}

function install_black() {
    # Install black
    pip3 install black --pre --user --force --quiet
}

function install_ansible() {
    # Install Ansible
    pip3 install ansible ansible-lint ansible-core --pre --user --force --quiet
}

function install_ansible-language-server() {
    # Install ansible-language-server
    sudo npm -s -g i @ansible/ansible-language-server --force
    sudo npm -s -g i yaml-language-server --force
}

function install_meraki_ansible() {
    # Install python, ansible module for meraki
    ansible-galaxy collection install cisco.meraki --force
    pip3 install meraki --user --force --quiet
}

function install_azure_cli() {
    # Install azure_cli
    pip3 install azure-cli --pre --user --force --quiet
}

function install_awscli() {
    # Install awscli
    pip3 install awscli --pre --user --force --quiet
}

function update() {
    if [ -d $CONFIG/fzf ]; then
        FOLDER="$CONFIG/fzf"
        cd $FOLDER || err "Folder $FOLDER has been NOT found"
        git pull -q && timestamp "Pulling the $FOLDER configuration"
    else
        FOLDER="$CONFIG/fzf"
        git clone https://github.com/junegunn/fzf.git $FOLDER && timestamp "Cloning the FZF"
        git pull -q && timestamp "Pulling the $FOLDER configuration"
    fi

    if [ ! -d $ZSHFOLDER/aws ]; then
        curl -s https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/plugins/aws/aws.plugin.zsh \
            -o "$ZSHFOLDER"/aws/aws.plugin.zsh &&
            timestamp "Downloaded the newest version of aws plugin for zsh"

        curl -s https://raw.githubusercontent.com/Azure/azure-cli/dev/az.completion \
            -o "$ZSHFOLDER"/azure-cli/az.completion &&
            timestamp "Downloaded the newest version of az plugin for zsh"

        mkdir -p "$ZSHFOLDER/azure-cli" "$ZSHFOLDER/aws"
        cd $ZSHFOLDER || err "Folder $ZSHFOLDER has been NOT found"
        git clone https://github.com/popstas/zsh-command-time.git &&
            timestamp "Cloning the zsh-command-time"
        git clone https://github.com/zsh-users/zsh-syntax-highlighting.git &&
            timestamp "Cloning the zsh-syntax-highlighting"
        git clone https://github.com/zsh-users/zsh-autosuggestions.git &&
            timestamp "Cloning the zsh-autosuggestions"
    fi

    for i in $(ls $ZSHFOLDER); do
        FOLDER="$ZSHFOLDER/$i"
        if [ -d "$FOLDER/.git" ]; then
            cd "$FOLDER" || err "Folder $FOLDER has been NOT found"
            git pull -q && timestamp "Pulling the $FOLDER configuration"
        fi
    done

    curl -s https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/plugins/aws/aws.plugin.zsh -o "$ZSHFOLDER"/aws/aws.plugin.zsh && timestamp "Downloaded the newest version of aws plugin for zsh"
    curl -s https://raw.githubusercontent.com/Azure/azure-cli/dev/az.completion -o "$ZSHFOLDER"/azure-cli/az.completion && timestamp "Downloaded the newest version of az plugin for zsh"

}

function main() {
    command_start update_pip
    command_start install_go
    command_start install_pyright
    command_start install_lazy
    command_start install_bash-language-server
    command_start install_yaml-language-server
    command_start install_ansible-language-server
    command_start install_shfmt
    command_start install_shellcheck
    command_start install_gopls
    command_start install_terraform
    command_start install_terragrunt
    command_start install_azure_cli
    command_start install_black
    command_start install_ansible
    command_start install_meraki_ansible
    command_start update
}

main