#!/bin/sh

# defaults
menu="tofi"
ls="eza"
files="nautilus"

# 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"
}

command_exists() {
  command -v "$1" >/dev/null 2>&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="
  alacritty
  btop
  zsh
  gBar
  caja
  yazi
  fastfetch
  hypr
  kitty
  neovide
  rofi
  swaync
  waybar
  wlogout
  wob
  "

  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="
  .bashrc
  .zshrc
  .tmux.conf
  .wezterm.lua
  "

  h_dirs="
  .qfc
  .tmux
  .zsh
  .icons
  .themes
  "

  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() {
  menu=""
  ls=""
  files=""

  echo_info "Choose a menu - [r]ofi || [t]ofi"
  read -r askMenu </dev/tty

  echo_info "Choose an ls helper - e[z]a || e[x]a || [l]sd"
  read -r askLs </dev/tty

  echo_info "Choose a filemanager - [n]autilus || [t]hunar || [d]olphin || [c]aja"
  read -r askFiles </dev/tty

  case "$askMenu" in
  [rR] | rofi) menu="rofi" ;;
  [tT] | tofi) menu="tofi" ;;
  esac

  case "$askLs" in
  [zZ] | eza) ls="eza" ;;
  [xX] | exa) ls="exa" ;;
  [lL] | lsd) ls="lsd" ;;
  esac

  case "$askFiles" in
  [Nn] | nautilus) files="nautilus" ;;
  [Tt] | thunar) files="thunar" ;;
  [Dd] | dolphin) files="dolphin" ;;
  esac
}

_dep() {
  _depss="
  wezterm
  btop
  $menu
  $files
  $ls
  entr
  yazi
  unzip
  zip
  fzf
  zoxide
  tmux
  thunar
  grimshot
  copyq
  wlogout
  "
  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
}

_monitors() {
  if [ ! -e "$HOME/.monitors.conf" ]; then
    touch "$HOME/.monitors.conf"
    echo "monitor = eDP-1, primary, 0x0, 1" >"$HOME/.monitors.conf"
  fi
}

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

  _ops="
  cowsay
  cmatrix
  trash-cli
  "
  case "$optional_" 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

  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
    Y | y)
      git clone --depth=1 https://git.k4li.de/dotfiles/nvim.git "$HOME/.config/nvim"
      ;;
    *)
      echo default
      ;;
    esac
  fi
}

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

main() {
  check_root
  get_packager
  # askThings

  terminal="wezterm"

  if ! command_exists "$terminal"; then
    echo_warning "$terminal was not found on the system. It's crucial, as the default terminal for this config is $terminal. Would you like to install $terminal and some other dependencies? (y/n): "
    read -r _deps
    case "$_deps" in
    Y | y)
      _dep
      ;;
    *)
      echo default
      ;;
    esac
  fi

  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 default
      ;;
    esac
  else
    echo_info "stow was found, going on to prepare to stow your config"
    sleep 0.3
    pre_stow
    _stow
  fi

  _optional
  _monitors
}

main
