#!/bin/bash

# Headless
NVIM=true
ZSH=true
PROFILE=true
TMUX=true

# GUI
AWESOME=false
ALACRITTY=false
MPV=false

SUDO="sudo"

if [[ $(whoami) == "root" ]]; then
    SUDO=""
fi

#################################################
# Basic Preparation                             #
#################################################
OS=$(grep -E '^(NAME)=' /etc/os-release )

if [[ -z "${XDG_CONFIG_HOME}" ]]; then
    mkdir -p "$HOME"/.config
    XDG_CONFIG_HOME="$HOME"/.config
fi

if [[ -z "${XDG_DATA_HOME}" ]]; then
    mkdir -p "$HOME"/.local/share
    XDG_DATA_HOME="$HOME"/.local/share
fi

#################################################
# Neovim                                        #
#################################################

if $NVIM; then
    dependencies="neovim git unzip fzf cmake gcc make curl wget ripgrep"
    if [[ $OS == "NAME=\"Arch Linux\"" ]]; then
        $SUDO pacman -Sy --needed --noconfirm $dependencies npm go fd dotnet-sdk
    elif [[ $OS == "NAME=\"Ubuntu\"" ]]; then
        $SUDO apt update
        $SUDO apt install -y software-properties-common
        $SUDO add-apt-repository ppa:neovim-ppa/unstable -y
        $SUDO curl -sL https://deb.nodesource.com/setup_21.x | $SUDO bash -
        declare repo_version=$(if command -v lsb_release &> /dev/null; then lsb_release -r -s; else grep -oP '(?<=^VERSION_ID=).+' /etc/os-release | tr -d '"'; fi)
        wget https://packages.microsoft.com/config/ubuntu/$repo_version/packages-microsoft-prod.deb -O packages-microsoft-prod.deb
        $SUDO dpkg -i packages-microsoft-prod.deb
        rm packages-microsoft-prod.deb
        $SUDO apt update
        $SUDO apt install -y $dependencies python3-venv python3-pip nodejs golang fd-find cargo dotnet-sdk-8.0
    fi

    ln -s "$PWD"/nvim "$XDG_CONFIG_HOME"/nvim
    ln -s "$PWD"/clang/.clang-tidy "$HOME"/.clang-tidy
    nvim --headless "+Lazy! sync" +qa
    nvim --headless "+MasonInstall bash-language-server pyright typescript-language-server rust-analyzer clangd cmake-language-server css-lsp dockerfile-language-server emmet-ls gopls html-lsp jdtls json-lsp ltex-ls lua-language-server ruff-lsp rustfmt rustywind texlab vetur-vls vim-language-server yaml-language-server csharp-language-server typst-lsp" +qa

fi

#################################################
# ZSH                                           #
#################################################
if $ZSH; then
    PROFILE=true
    dependencies="fzf zsh curl zoxide"
    if [[ $OS == "NAME=\"Arch Linux\"" ]]; then
        $SUDO pacman -Sy --needed --noconfirm $dependencies zsh-autosuggestions
        echo "Please manually install yay"
    elif [[ $OS == "NAME=\"Ubuntu\"" ]]; then
        $SUDO apt update
        $SUDO apt install -y $dependencies
    fi

    ln -s "$PWD"/zsh "$XDG_CONFIG_HOME"/zsh
    ln -s "$PWD"/zsh/.zshrc "$HOME"/.zshrc
    mkdir -p "$HOME"/.local/state/zsh/

    git clone https://github.com/cxreg/smartcd.git /tmp/smartcd
    cd /tmp/smartcd || exit
    make install
    ln -s "$XDG_CONFIG_HOME"/zsh/.smartcd_config "$HOME"/.smartcd_config
    cd - || exit
fi

#################################################
# Profile                                       #
#################################################
if $PROFILE; then
    rm -rf "$HOME"/.profile && ln -s "$PWD"/profile/.profile "$HOME"/.profile
fi

#################################################
# Awesome                                       #
#################################################

if $AWESOME; then
    dependencies="awesome picom numlockx xcape rofi"
    if [[ $OS == "NAME=\"Arch Linux\"" ]]; then
        $SUDO pacman -Sy --needed --noconfirm $dependencies network-manager-applet xorg-xmodmap adobe-source-code-pro-fonts noto-fonts ttf-nerd-fonts-symbols
    elif [[ $OS == "NAME=\"Ubuntu\"" ]]; then
        $SUDO apt update
        $SUDO apt install -y $dependencies awesome-extra
    fi

    ln -s "$PWD"/awesome "$XDG_CONFIG_HOME"/awesome
    ln -s "$PWD"/picom/picom.conf "$XDG_CONFIG_HOME"/picom.conf
    ln -s "$PWD"/xmodmap/.Xmodmap "$XDG_CONFIG_HOME"/.Xmodmap
    ln -s "$PWD"/rofi "$XDG_CONFIG_HOME"/rofi
fi

#################################################
# Alacritty                                     #
#################################################

if $ALACRITTY; then
    dependencies="alacritty"
    if [[ $OS == "NAME=\"Arch Linux\"" ]]; then
        $SUDO pacman -Sy --needed --noconfirm $dependencies
    elif [[ $OS == "NAME=\"Ubuntu\"" ]]; then
        $SUDO apt update
        $SUDO apt install -y software-properties-common
        $SUDO add-apt-repository ppa:aslatter/ppa -y
        $SUDO apt update
        $SUDO apt install -y $dependencies
    fi

    ln -s "$PWD"/alacritty "$XDG_CONFIG_HOME"/alacritty
fi

#################################################
# MPV                                           #
#################################################

if $MPV; then
    dependencies="mpv"
    if [[ $OS == "NAME=\"Arch Linux\"" ]]; then
        $SUDO pacman -Sy --needed --noconfirm $dependencies
    elif [[ $OS == "NAME=\"Ubuntu\"" ]]; then
        $SUDO apt update
        $SUDO apt install -y $dependencies
    fi

    ln -s "$PWD"/mpv "$XDG_CONFIG_HOME"/mpv
fi

#################################################
# Tmux                                          #
#################################################

if $TMUX; then
    dependencies="tmux git zsh xdg-utils"
    if [[ $OS == "NAME=\"Arch Linux\"" ]]; then
        $SUDO pacman -Sy --needed --noconfirm $dependencies

        ln -s "$PWD"/tmux "$XDG_CONFIG_HOME"/tmux
        git clone https://github.com/tmux-plugins/tpm "$XDG_DATA_HOME"/tmux/plugins/tpm
        "$XDG_DATA_HOME"/tmux/plugins/tpm/bin/install_plugins
    elif [[ $OS == "NAME=\"Ubuntu\"" ]]; then
        $SUDO apt update
        $SUDO apt install -y $dependencies

        ln -s "$PWD"/tmux "$HOME"/.tmux
        ln -s "$PWD"/tmux/tmux.conf "$HOME"/.tmux.conf
        git clone https://github.com/tmux-plugins/tpm "$HOME"/.tmux/plugins/tpm
        "$HOME"/.tmux/plugins/tpm/bin/install_plugins
    fi
fi