#!/usr/bin/env bash

# ANSI color codes
RED='\033[0;31m'
CYAN='\033[0;36m'
YELLOW='\033[0;33m'
LIGHT_GREEN='\033[0;92m'
BOLD='\033[1m'
NC='\033[0m' # No Color

echo_error() {
	printf "${BOLD}${RED}ERROR: ${NC}${RED}%s${NC}\n" "$1" >&2
}

echo_info() {
	printf "${BOLD}${CYAN}INFO: ${NC}${CYAN}%s${NC}\n" "$1"
}

echo_warning() {
	printf "${BOLD}${YELLOW}WARNING: ${NC}${YELLOW}%s${NC}\n" "$1"
}

echo_note() {
	printf "${BOLD}${LIGHT_GREEN}NOTE: ${NC}${LIGHT_GREEN}%s${NC}\n" "$1"
}

# ─< Check if the given command exists silently >─────────────────────────────────────────
command_exists() {
	command -v "$@" >/dev/null 2>&1
}

# ─< Check if the user is root and set sudo variable if necessary >───────────────────────
check_root() {
	if [ "$(id -u)" -ne 0 ]; then
		if command_exists sudo; then
			echo_info "User is not root. Using sudo for privileged operations."
			_sudo="sudo"
		else
			echo_error "No sudo found and you're not root! Can't install packages."
			return 1
		fi
	else
		echo_info "Root access confirmed."
		_sudo=""
	fi
}

# ─< Distribution detection and installation >────────────────────────────────────────
get_packager() {
	if [ -e /etc/os-release ]; then
		echo_info "Detecting distribution..."
		. /etc/os-release

		ID=$(printf "%s" "$ID" | tr '[:upper:]' '[:lower:]')
		ID_LIKE=$(printf "%s" "$ID_LIKE" | tr '[:upper:]' '[:lower:]')
		case "$ID" in
		ubuntu | pop) _install() { $_sudo apt-get install --assume-yes "$@"; } ;;
		debian) _install() { $_sudo apt-get install --assume-yes "$@"; } ;;
		fedora) _install() { $_sudo dnf install -y "$@"; } ;;
		alpine) _install() { $_sudo apk add "$@"; } ;;
		arch | archcraft | manjaro | garuda | endeavour) _install() { $_sudo pacman -S --noconfirm "$@"; } ;;
		opensuse*) _install() { $_sudo zypper in -y "$@"; } ;;
		*)
			if echo "$ID_LIKE" | grep -q "debian"; then
				_install() { $_sudo apt-get install --assume-yes "$@"; }
			elif echo "$ID_LIKE" | grep -q "ubuntu"; then
				_install() { $_sudo apt-get install --assume-yes "$@"; }
			elif echo "$ID_LIKE" | grep -q "arch"; then
				_install() { $_sudo pacman -S --noconfirm "$@"; }
			elif echo "$ID_LIKE" | grep -q "fedora"; then
				_install() { $_sudo dnf install -y "$@"; }
			elif echo "$ID_LIKE" | grep -q "suse"; then
				_install() { $_sudo zypper in -y "$@"; }
			else
				echo_error "Unsupported distribution: $ID"
				return 1
			fi
			;;
		esac
	else
		echo_error "Unable to detect distribution. /etc/os-release not found."
		return 1
	fi
}

silentexec() {
	"$@" >/dev/null 2>&1
}

__pre_stow__() {
	echo_note "__pre_stow__"
	conf="$HOME/.config"
	bak_dir="$HOME/.bak"
	dirs=(
		"btop"
		"zsh"
		"yazi"
		"tmux"
		"nvim"
		"ranger"
		"lf"
	)

	if [ ! -d "$bak_dir" ]; then
		echo_info "backup dir created at $bak_dir" &&
			silentexec mkdir "$bak_dir"
	else
		echo_info "Backup dir already present, clearing now" &&
			rm -rf "${bak_dir:?}/*"
	fi

	for _dirs in "${dirs[@]}"; do
		if [ -d "$conf/$_dirs" ]; then
			mv -f "$conf/$_dirs" "$bak_dir"
		fi
	done

	h_files=(
		".zshrc"
		".zshenv"
	)

	h_dirs=(
		".tmux"
		".zsh"
	)

	for _f in "${h_files[@]}"; do
		if [ -f "$HOME/$_f" ]; then
			mv -f "$HOME/$_f" "$bak_dir" && echo_info "Moved $_f to $bak_dir"
		fi
	done

	for _d in "${h_dirs[@]}"; do
		if [ -d "$HOME/$_d" ]; then
			mv -f "$HOME/$_d" "$bak_dir" && echo_info "Moved $_d to $bak_dir"
		fi
	done

	if [ -d "$HOME/.local/share/fastfetch/" ]; then
		mv -f "$HOME/.local/share/fastfetch" "$bak_dir"
	fi
}

askThings() {
	# echo_info "Choose a menu - [r]ofi || [t]ofi"
	# read -r askMenu </dev/tty

	[ ! -d "./dotfiles/.config/yazi" ] && [ ! -d "./dotfiles/.config/lf" ] && [ ! -d "./dotfiles/.config/ranger" ] && {
		echo_info "Choose a cli filemanager - [y]azi || [r]anger || [l]f"
		read -r askFilemgr </dev/tty
	}

	# echo_info "Choose a bar provider - [w]aybar || [g]Bar || [h]yprpanel"
	# read -r askBar </dev/tty
	#
	# echo_info "Choose a Terminal config (.)[G]hostty, [K]itty, [A]lacritty(.)"
	# read -r askTerminal </dev/tty

	echo_info "Do you also want to install optional packages? (y/n)"
	read -r askOptional </dev/tty

	case "$askOptional" in
	[yY]) __optional__="true" ;;
	[nN]) __optional__="false" ;;
	esac
}

cloneDots() {
	choise="$1"

	if command_exists git; then
		[ -d ./dotfiles ] &&
			[ ! -d "./dotfiles/${choise}" ] &&
			git clone --depth=1 "https://git.k4li.de/dotfiles/${choise}.git" "./dotfiles/.config/${choise}"

	else
		echo_error "Git was not found"
	fi
}

__validate__() {
	if askThings; then
		case "$askFilemgr" in
		[yY] | yazi) cloneDots "yazi" ;;
		[rR] | ranger) cloneDots "ranger" ;;
		[lL] | lf) cloneDots "lf" ;;
		esac
	else
		echo_error "Something went terribly wrong"
		exit 1
	fi

	# if [ ! -d "$HOME/.config/nvim" ]; then
	#   echo_note "There was no nvim config found, do you want to clone the pika nvim? (y/n)"
	#   read -r _neovim </dev/tty
	#   case "$_neovim" in
	#   [yY])
	#     git clone --recursive --depth=1 https://git.k4li.de/dotfiles/nvim.git "$HOME/.config/nvim"
	#     ;;
	#   esac
	# fi
}

__dep__() {
	_depss=(
		"stow"
		"btop"
		"entr"
		"unzip"
		"zip"
		"fzf"
		"tmux"
		"rsync"
		"zoxide"
	)

	for hyprdots_dependency in "${_depss[@]}"; do
		if ! command_exists "$hyprdots_dependency"; then
			echo_note "--- installing $hyprdots_dependency ---"
			_install "$hyprdots_dependency"
		else
			echo_info "$hyprdots_dependency is already installed"
		fi
	done
}

pkg_optional() {
	_ops=(
		"cowsay"
		"cmatrix"
		"trash-cli"
	)
	case "$_ops" in
	Y | y)
		for _o_ in "${_ops[@]}"; do
			if command_exists "$_o_"; then
				echo_note "$_o_ - is already installed"
			else
				echo_info "Installing $_o_"
				_install "$_o_"
			fi
		done
		;;
	*)
		echo default
		;;
	esac

}

__stow__() {
	stow --verbose --target="$HOME" --defer=.gitmodules --restow */
}

main() {
	check_root
	get_packager

	__validate__
	__dep__

	if ! command_exists stow; then
		echo_error "we couldn't find stow on the machine, do you want us to install it? (y/n): "
		read -r ask_stow
		case "$ask_stow" in
		Y | y)
			_install stow
			;;
		*)
			echo_error "You cannot proceed without installing stow! Please install manually"
			exit 1
			;;
		esac
	else
		echo_info "stow was found, going on to prepare to stow your config"
		sleep 0.3
	fi

	__pre_stow__
	__stow__

	sleep 2

	[ "$__optional__" == 'true' ] &&
		pkg_optional

	# __monitors__
	# echo_note "found resolution ${res}"
}

main
