#!/bin/bash

clear
wallpaper=$HOME/.config/hypr/wallpaper_effects/.wallpaper_current
waybar_style="$HOME/.config/waybar/style/[Extra] Modern-Combined - Transparent.css"
waybar_config="$HOME/.config/waybar/configs/[TOP] Default"
waybar_config_laptop="$HOME/.config/waybar/configs/[TOP] Default Laptop"

# set some colors for output messages
OK="$(tput setaf 2)[OK]$(tput sgr0)"
ERROR="$(tput setaf 1)[ERROR]$(tput sgr0)"
NOTE="$(tput setaf 3)[NOTE]$(tput sgr0)"
INFO="$(tput setaf 4)[INFO]$(tput sgr0)"
WARN="$(tput setaf 1)[WARN]$(tput sgr0)"
CAT="$(tput setaf 6)[ACTION]$(tput sgr0)"
MAGENTA="$(tput setaf 5)"
ORANGE="$(tput setaf 214)"
WARNING="$(tput setaf 1)"
YELLOW="$(tput setaf 3)"
GREEN="$(tput setaf 2)"
BLUE="$(tput setaf 4)"
SKY_BLUE="$(tput setaf 6)"
RESET="$(tput sgr0)"

# check if running as root. if root, the script will exit
if [[ $EUID -eq 0 ]]; then
  echo "${ERROR} this script should ${WARNING}NOT${RESET} be executed as root! exiting..."
  printf "\n%.0s" {1..2}
  exit 1
fi

# function to print colorful text
print_color() {
  printf "%b%s%b\n" "$1" "$2" "$CLEAR"
}

# check /etc/os-release to see if this is an ubuntu or debian based distro
if grep -iq '^\(ID_LIKE\|ID\)=.*\(debian\|ubuntu\)' /etc/os-release >/dev/null 2>&1; then
  printf "\n%.0s" {1..1}
    print_color $WARNING "
    █▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀█
                    NIXOS-DOTS INCOMPATIBLE
    █▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄█

    debian / ubuntu detected. refer to nixos dots README
    for instructions on how to update your nixos-dots.

    exiting...
    "
  printf "\n%.0s" {1..3}
  exit 1
fi

printf "\n%.0s" {1..1}
echo -e "\e[35m
 ██░ ██▓██   ██▓ ██▓███   ██▀███  ▓█████▄  ▒█████  ▄▄▄█████▓  ██████ 
▓██░ ██▒▒██  ██▒▓██░  ██▒▓██ ▒ ██▒▒██▀ ██▌▒██▒  ██▒▓  ██▒ ▓▒▒██    ▒ 
▒██▀▀██░ ▒██ ██░▓██░ ██▓▒▓██ ░▄█ ▒░██   █▌▒██░  ██▒▒ ▓██░ ▒░░ ▓██▄   
░▓█ ░██  ░ ▐██▓░▒██▄█▓▒ ▒▒██▀▀█▄  ░▓█▄   ▌▒██   ██░░ ▓██▓ ░   ▒   ██▒
░▓█▒░██▓ ░ ██▒▓░▒██▒ ░  ░░██▓ ▒██▒░▒████▓ ░ ████▓▒░  ▒██▒ ░ ▒██████▒▒
 ▒ ░░▒░▒  ██▒▒▒ ▒▓▒░ ░  ░░ ▒▓ ░▒▓░ ▒▒▓  ▒ ░ ▒░▒░▒░   ▒ ░░   ▒ ▒▓▒ ▒ ░
 ▒ ░▒░ ░▓██ ░▒░ ░▒ ░       ░▒ ░ ▒░ ░ ▒  ▒   ░ ▒ ▒░     ░    ░ ░▒  ░ ░
 ░  ░░ ░▒ ▒ ░░  ░░         ░░   ░  ░ ░  ░ ░ ░ ░ ▒    ░      ░  ░  ░  
 ░  ░  ░░ ░                 ░        ░        ░ ░                 ░  
        ░ ░                        ░                                 
\e[0m"
printf "\n%.0s" {1..1}

# announcement
echo "${WARNING}! ! ! A T T E N T I O N ! ! !${RESET}"
echo "${SKY_BLUE}version v2.3.12 of nixos-dots requires nwg-displays and some fonts!${RESET}"
echo "${SKY_BLUE}if you installed using nixos-config install script, you do not need to tak eany actions${RESET}"
echo "${YELLOW}please visit the wiki for changelogs${RESET}"
printf "\n%.0s" {1..1}

# create directory for copy logs
if [ ! -d copy-logs ]; then
  mkdir copy-logs
fi

# set the name of the log file to include the current date and time
LOG="copy-logs/install-$(date +%d-%H%M%S)_dots.log"

# update home folders
xdg-user-dirs-update 2>&1 | tee -a "$LOG" || true

# setting up for nvidia
if lspci -k | grep -A 2 -E "(VGA|3D)" | grep -iq nvidia; then
  echo "${INFO} nvidia gpu detected, setting up proper env's and configs" 2>&1 | tee "$LOG" || true
  sed -i '/env = LIBVA_DRIVER_NAME,nvidia/s/^#//' config/hypr/UserConfigs/ENVariables.conf
  sed -i '/env = __GLX_VENDOR_LIBRARY_NAME,nvidia/s/^#//' config/hypr/UserConfigs/ENVariables.conf
  sed -i '/env = NVD_BACKEND,direct/s/^#//' config/hypr/UserConfigs/ENVariables.conf
  # enabling no hardware cursors if nvidia detected
  sed -i 's/^\([[:space:]]*no_hardware_cursors[[:space:]]*=[[:space:]]*\)false/\1true/' config/hypr/UserConfigs/UserSettings.conf  
  # disabling explicit sync for nvidia for now (Hyprland 0.42.0)
  #sed -i 's/  explicit_sync = 2/  explicit_sync = 0/' config/hypr/UserConfigs/UserSettings.conf
fi

# uncommenting WLR_RENDERER_ALLOW_SOFTWARE,1 if running in a VM is detected
if hostnamectl | grep -q 'Chassis: vm'; then
  echo "${INFO} system is running in a virtual machine. setting up proper env's and configs" 2>&1 | tee -a "$LOG" || true
  # enabling proper ENV's for Virtual Environment which should help
  sed -i 's/^\([[:space:]]*no_hardware_cursors[[:space:]]*=[[:space:]]*\)false/\1true/' config/hypr/UserConfigs/UserSettings.conf
  sed -i '/env = WLR_RENDERER_ALLOW_SOFTWARE,1/s/^#//' config/hypr/UserConfigs/ENVariables.conf
  #sed -i '/env = LIBGL_ALWAYS_SOFTWARE,1/s/^#//' config/hypr/UserConfigs/ENVariables.conf
  sed -i '/monitor = Virtual-1, 1920x1080@60,auto,1/s/^#//' config/hypr/UserConfigs/Monitors.conf
fi

# proper polkit for nixos
if hostnamectl | grep -q 'Operating System: NixOS'; then
  echo "${INFO} nixos distro detected. Setting up proper env's and configs." 2>&1 | tee -a "$LOG" || true
  sed -i -E '/^#?exec-once = \$scriptsDir\/Polkit-NixOS\.sh/s/^#//' config/hypr/UserConfigs/Startup_Apps.conf
  sed -i '/^exec-once = \$scriptsDir\/Polkit\.sh$/ s/^#*/#/' config/hypr/UserConfigs/Startup_Apps.conf
fi

# check if dpkg is installed (used to check if Debian or Ubuntu or based distros)
if grep -iq '^\(ID_LIKE\|ID\)=.*\(debian\|ubuntu\)' /etc/os-release >/dev/null 2>&1; then
	echo "${INFO} debian/ubuntu based distro. disabling pyprland since it does not work properly" 2>&1 | tee -a "$LOG" || true
  # disabling pyprland as causing issues
  sed -i '/^exec-once = pypr &/ s/^/#/' config/hypr/UserConfigs/Startup_Apps.conf
fi

# activating hyprcursor on env by checking if the directory ~/.icons/Bibata-Modern-Ice/hyprcursors exists
if [ -d "$HOME/.icons/Bibata-Modern-Ice/hyprcursors" ]; then
    HYPRCURSOR_ENV_FILE="config/hypr/UserConfigs/ENVariables.conf"
    echo "${INFO} bibata-hyprcursor directory detected. activating hyprcursor...." 2>&1 | tee -a "$LOG" || true
    sed -i 's/^#env = HYPRCURSOR_THEME,Bibata-Modern-Ice/env = HYPRCURSOR_THEME,Bibata-Modern-Ice/' "$HYPRCURSOR_ENV_FILE"
    sed -i 's/^#env = HYPRCURSOR_SIZE,24/env = HYPRCURSOR_SIZE,24/' "$HYPRCURSOR_ENV_FILE"
fi

printf "\n%.0s" {1..1}

# Function to detect keyboard layout using localectl or setxkbmap
detect_layout() {
  if command -v localectl >/dev/null 2>&1; then
    layout=$(localectl status --no-pager | awk '/X11 Layout/ {print $3}')
    if [ -n "$layout" ]; then
      echo "$layout"
    fi
  elif command -v setxkbmap >/dev/null 2>&1; then
    layout=$(setxkbmap -query | grep layout | awk '{print $2}')
    if [ -n "$layout" ]; then
      echo "$layout"
    fi
  fi
}

# detect the current keyboard layout
layout=$(detect_layout)

if [ "$layout" = "(unset)" ]; then
  while true; do
    printf "\n%.0s" {1..1}
    print_color $WARNING "
    █▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀█
            STOP AND READ
    █▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄█

    !!! IMPORTANT WARNING !!!

the default keyboard layout could not be detected
you need to set it manually

    !!! WARNING !!!

setting a wrong keyboard layout will cause Hyprland to crash
If you are not sure, just type ${YELLOW}us${RESET}
${SKYBLUE}you can change later in ~/.config/hypr/UserConfigs/UserSettings.conf${RESET}

${MAGENTA} NOTE:${RESET}
•  you can also set more than 2 keyboard layouts
•  for example: ${YELLOW}us, kr, gb, no${RESET}
"
    printf "\n%.0s" {1..1}
    read -p "${CAT} - please enter the correct keyboard layout: " new_layout

    if [ -n "$new_layout" ]; then
        layout="$new_layout"
        break
    else
        echo "${CAT} please enter a keyboard layout."
    fi
  done
fi

printf "${NOTE} detecting keyboard layout to prepare proper hyprland settings\n"

# prompt the user to confirm whether the detected layout is correct
while true; do
  printf "${INFO} current keyboard layout is ${MAGENTA}$layout${RESET}\n"
  read -p "${CAT} is this correct? [y/n] " keyboard_layout

  case $keyboard_layout in
    [yY])
      awk -v layout="$layout" '/kb_layout/ {$0 = "  kb_layout = " layout} 1' config/hypr/UserConfigs/UserSettings.conf > temp.conf
      mv temp.conf config/hypr/UserConfigs/UserSettings.conf

      echo "${NOTE} kb_layout ${MAGENTA}$layout${RESET} configured in settings" 2>&1 | tee -a "$LOG"
      break ;;
    [nN])
      printf: "\n%.0s" {1..2}
      print_color $WARNING "
    █▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀█
            STOP AND READ
    █▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄█

    !!! IMPORTANT WARNING !!!

the default keyboard layout could not be detected
you need to set it Manually

    !!! WARNING !!!

setting a wrong keyboard layout will cause hyprland to crash
if you are not sure, just type ${YELLOW}us${RESET}
${SKYBLUE}you can change later in ~/.config/hypr/UserConfigs/UserSettings.conf${RESET}

${MAGENTA} NOTE:${RESET}
•  you can also set more than 2 keyboard layouts
•  for example: ${YELLOW}us, kr, gb, no${RESET}
"
        printf "\n%.0s" {1..1}
        
        read -p "${CAT} - Please enter the correct keyboard layout: " new_layout

        awk -v new_layout="$new_layout" '/kb_layout/ {$0 = "  kb_layout = " new_layout} 1' config/hypr/UserConfigs/UserSettings.conf > temp.conf
        mv temp.conf config/hypr/UserConfigs/UserSettings.conf
        echo "${OK} kb_layout $new_layout configured in settings." 2>&1 | tee -a "$LOG" 
        break ;;
    *)
        echo "${ERROR} Please enter either 'y' or 'n'." ;;
  esac
done

# Check if asusctl is installed and add rog-control-center on Startup
if command -v asusctl >/dev/null 2>&1; then
    sed -i '/exec-once = rog-control-center &/s/^#//' config/hypr/UserConfigs/Startup_Apps.conf
fi

# Check if blueman-applet is installed and add blueman-applet on Startup
if command -v blueman-applet >/dev/null 2>&1; then
    sed -i '/exec-once = blueman-applet &/s/^#//' config/hypr/UserConfigs/Startup_Apps.conf
fi

# Check if ags is installed edit ags behaviour on configs
if command -v ags >/dev/null 2>&1; then
    sed -i '/#exec-once = ags &/s/^#//' config/hypr/UserConfigs/Startup_Apps.conf
    sed -i '/#ags -q && ags &/s/^#//' config/hypr/scripts/RefreshNoWaybar.sh
    sed -i '/#ags -q && ags &/s/^#//' config/hypr/scripts/Refresh.sh
fi

printf "\n%.0s" {1..1}

# Checking if neovim or vim is installed and offer user if they want to make as default editor
# Function to modify the ENVariables.conf file
update_editor() {
    local editor=$1
    sed -i "s/#env = EDITOR,.*/env = EDITOR,$editor #default editor/" config/hypr/UserConfigs/ENVariables.conf
    echo "${OK} default editor set to ${MAGENTA}$editor${RESET}." 2>&1 | tee -a "$LOG"
}

EDITOR_SET=0
# Check for neovim if installed
if command -v nvim &> /dev/null; then
    printf "${INFO} ${MAGENTA}neovim${RESET} is detected as installed\n"
    read -p "${CAT} do you want to make ${MAGENTA}neovim${RESET} the default editor? (y/N): " EDITOR_CHOICE
    if [[ "$EDITOR_CHOICE" == "y" ]]; then
        update_editor "nvim"
        EDITOR_SET=1
    fi
fi

printf "\n"

# Check for vim if installed, but only if neovim wasn't chosen
if [[ "$EDITOR_SET" -eq 0 ]] && command -v vim &> /dev/null; then
    printf "${INFO} ${MAGENTA}vim${RESET} is detected as installed\n"
    read -p "${CAT} do you want to make ${MAGENTA}vim${RESET} the default editor? (y/N): " EDITOR_CHOICE
    if [[ "$EDITOR_CHOICE" == "y" ]]; then
        update_editor "vim"
        EDITOR_SET=1
    fi
fi

if [[ "$EDITOR_SET" -eq 0 ]]; then
    echo "${YELLOW} Neither neovim nor vim is installed or selected as default." 2>&1 | tee -a "$LOG"
fi

printf "\n"

# Action to do for better appearance
while true; do
  echo "${NOTE} ${SKY_BLUE} by default, nixos-dots is configured for 1440p or 2k."
  echo "${WARN} if you dont select proper resolution, Hyprlock will look weird"
  echo "${INFO} if you are not sure what is your resolution, choose 1 here!"
  echo "${MAGENTA}select monitor resolution to properly configure appearance and fonts:"
  echo "$YELLOW  -- enter 1. for monitor resolution less than 1440p (< 1440p)"
  echo "$YELLOW  -- enter 2. for monitor resolution equal to or higher than 1440p (≥ 1440p)"
  read -p "$CAT enter the number of your choice (1 or 2): " res_choice

  case $res_choice in
    1)
        resolution="< 1440p"
        break
        ;;
    2)
        resolution="≥ 1440p"
        break
        ;;
    *)
        echo "${ERROR} invalid choice. please enter 1 for < 1440p or 2 for ≥ 1440p."
        ;;
  esac
done

# Use the selected resolution in your existing script
echo "${OK} you have chosen $resolution resolution." 2>&1 | tee -a "$LOG"

# Add your commands based on the resolution choice
if [ "$resolution" == "< 1440p" ]; then
  #cp -r config/rofi/resolution/1080p/* config/rofi/ 10-Feb-2025
  sed -i 's/font_size 16.0/font_size 42.0/' config/kitty/kitty.conf

  # hyprlock matters
  mv config/hypr/hyprlock.conf config/hypr/hyprlock-2k.conf &&
  mv config/hypr/hyprlock-1080p.conf config/hypr/hyprlock.conf

  # rofi fonts reduction
  themes_dir="config/rofi/themes"
  config_file="config/rofi/config.rasi"

  # Change rofi font size
  find "$themes_dir" -type f | while read -r file; do
      if grep -Pzoq 'element-text {\n  font: "JetBrainsMono Nerd Font SemiBold 12";\n}' "$file"; then
          sed -i 's/font: "JetBrainsMono Nerd Font SemiBold 12"/font: "JetBrainsMono Nerd Font SemiBold 10"/' "$file"
      fi
  done

  # Change rofi font size in ~/.config/rofi/config.rasi
  if [ -f "$config_file" ]; then
      if grep -Pzoq 'configuration {\n  font: "JetBrainsMono Nerd Font SemiBold 13";\n}' "$config_file"; then
          sed -i 's/font: "JetBrainsMono Nerd Font SemiBold 13"/font: "JetBrainsMono Nerd Font SemiBold 12"/' "$config_file"
      fi
  fi
fi

printf "\n%.0s" {1..1}

# Ask whether to change to 12hr format
while true; do
    echo -e "${NOTE} ${SKY_BLUE} by default, nixos-dots is configured in 24H clock format."
    read -p "$CAT do you want to change to 12H format or AM/PM format? (y/n): " answer

    # Convert the answer to lowercase for comparison
    answer=$(echo "$answer" | tr '[:upper:]' '[:lower:]')

    # Check if the answer is valid
    if [[ "$answer" == "y" ]]; then
        # Modify waybar clock modules if 12hr is selected    
        # Clock 1
        sed -i 's#^\(\s*\)//\("format": " {:%I:%M %p}",\) #\1\2 #g' config/waybar/Modules 2>&1 | tee -a "$LOG"
        sed -i 's#^\(\s*\)\("format": " {:%H:%M:%S}",\) #\1//\2#g' config/waybar/Modules 2>&1 | tee -a "$LOG"
        
        # Clock 2
        sed -i 's#^\(\s*\)\("format": "  {:%H:%M}",\) #\1//\2#g' config/waybar/Modules 2>&1 | tee -a "$LOG"
        
        # Clock 3
        sed -i 's#^\(\s*\)//\("format": "{:%I:%M %p - %d/%b}",\) #\1\2#g' config/waybar/Modules 2>&1 | tee -a "$LOG"
        sed -i 's#^\(\s*\)\("format": "{:%H:%M - %d/%b}",\) #\1//\2#g' config/waybar/Modules 2>&1 | tee -a "$LOG"
        
        # Clock 4
        sed -i 's#^\(\s*\)//\("format": "{:%B | %a %d, %Y | %I:%M %p}",\) #\1\2#g' config/waybar/Modules 2>&1 | tee -a "$LOG"
        sed -i 's#^\(\s*\)\("format": "{:%B | %a %d, %Y | %H:%M}",\) #\1//\2#g' config/waybar/Modules 2>&1 | tee -a "$LOG"

        # Clock 5
        sed -i 's#^\(\s*\)//\("format": "{:%A, %I:%M %P}",\) #\1\2#g' config/waybar/Modules 2>&1 | tee -a "$LOG"
        sed -i 's#^\(\s*\)\("format": "{:%a %d | %H:%M}",\) #\1//\2#g' config/waybar/Modules 2>&1 | tee -a "$LOG"
        
        # for hyprlock
        sed -i 's/^\s*text = cmd\[update:1000\] echo "\$(date +"%H")"/# &/' config/hypr/hyprlock.conf 2>&1 | tee -a "$LOG"
        sed -i 's/^\(\s*\)# *text = cmd\[update:1000\] echo "\$(date +"%I")" #AM\/PM/\1    text = cmd\[update:1000\] echo "\$(date +"%I")" #AM\/PM/' config/hypr/hyprlock.conf 2>&1 | tee -a "$LOG"

        sed -i 's/^\s*text = cmd\[update:1000\] echo "\$(date +"%S")"/# &/' config/hypr/hyprlock.conf 2>&1 | tee -a "$LOG"
        sed -i 's/^\(\s*\)# *text = cmd\[update:1000\] echo "\$(date +"%S %p")" #AM\/PM/\1    text = cmd\[update:1000\] echo "\$(date +"%S %p")" #AM\/PM/' config/hypr/hyprlock.conf 2>&1 | tee -a "$LOG"
        
        echo "${OK} 12H format set on waybar clocks successfully." 2>&1 | tee -a "$LOG"

      # Function to apply 12H format to SDDM themes
      apply_sddm_12h_format() {
      local sddm_directory=$1

      # Check if the directory exists
      if [ -d "$sddm_directory" ]; then
        echo "editing ${SKY_BLUE}$sddm_directory${RESET} to 12H format" 2>&1 | tee -a "$LOG"

        sudo sed -i 's|^## HourFormat="hh:mm AP"|HourFormat="hh:mm AP"|' "$sddm_directory/theme.conf" 2>&1 | tee -a "$LOG" || true
        sudo sed -i 's|^HourFormat="HH:mm"|## HourFormat="HH:mm"|' "$sddm_directory/theme.conf" 2>&1 | tee -a "$LOG" || true
      fi
      }

      # Applying to different SDDM themes
      apply_sddm_12h_format "/usr/share/sddm/themes/simple-sddm"
      apply_sddm_12h_format "/usr/share/sddm/themes/simple-sddm-2"

      # For SDDM (sequoia_2)
      sddm_directory_3="/usr/share/sddm/themes/sequoia_2"
      if [ -d "$sddm_directory_3" ]; then
        echo "${YELLOW}sddm sequoia_2${RESET} theme exists. editing to 12H format" 2>&1 | tee -a "$LOG"

        # Comment out the existing clockFormat="HH:mm" line
        sudo sed -i 's|^clockFormat="HH:mm"|## clockFormat="HH:mm"|' "$sddm_directory_3/theme.conf" 2>&1 | tee -a "$LOG" || true

        # Insert the new clockFormat="hh:mm AP" line if it's not already present
        if ! grep -q 'clockFormat="hh:mm AP"' "$sddm_directory_3/theme.conf"; then
          sudo sed -i '/^clockFormat=/a clockFormat="hh:mm AP"' "$sddm_directory_3/theme.conf" 2>&1 | tee -a "$LOG" || true
        fi

        echo "${OK} 12H format set to SDDM successfully." 2>&1 | tee -a "$LOG"
      fi

    break
     
    elif [[ "$answer" == "n" ]]; then
        echo "${NOTE} you chose not to change to 12H format." 2>&1 | tee -a "$LOG"
        break  # Exit the loop if the user chooses "n"
    else
        echo "${ERROR} invalid choice. please enter y for yes or n for no."
    fi
done
printf "\n%.0s" {1..1}

# Check if the user wants to disable Rainbow borders
echo "${NOTE} ${SKY_BLUE}by default, rainbow borders animation is enabled"
echo "${WARN} however, this uses a bit more CPU and Memory resources."

read -p "${CAT} do you want to disable Rainbow Borders animation? (y/N): " border_choice
if [[ "$border_choice" =~ ^[Yy]$ ]]; then
    mv config/hypr/UserScripts/RainbowBorders.sh config/hypr/UserScripts/RainbowBorders.bak.sh
    
    sed -i '/exec-once = \$UserScripts\/RainbowBorders.sh \&/s/^/#/' config/hypr/UserConfigs/Startup_Apps.conf
    sed -i '/^[[:space:]]*animation = borderangle, 1, 180, liner, loop/s/^/#/' config/hypr/UserConfigs/UserAnimations.conf
    
    echo "${OK} rainbow borders are now disabled." 2>&1 | tee -a "$LOG"
else
    echo "${NOTE} no changes made. rainbow borders remain enabled." 2>&1 | tee -a "$LOG"
fi
printf "\n%.0s" {1..1}

set -e

# Function to create a unique backup directory name with month, day, hours, and minutes
get_backup_dirname() {
  local timestamp
  timestamp=$(date +"%m%d_%H%M")
  echo "back-up_${timestamp}"
}

# Check if the ~/.config/ directory exists
if [ ! -d "$HOME/.config" ]; then
  echo "${ERROR} - $HOME/.config directory does not exist, creating it now"
  mkdir -p "$HOME/.config" && echo "${OK}directory successfully created" || echo "${ERROR}failed to create directory!"
fi

printf "${INFO} - copying dotfiles ${SKY_BLUE}first${RESET} part\n"
# config directories which will ask the user whether to replace or not
DIRS="
  ags
  fastfetch
  kitty
  rofi
  swaync
"
for DIR2 in $DIRS; do
  DIRPATH="$HOME/.config/$DIR2"
  
  if [ -d "$DIRPATH" ]; then
    while true; do
      printf "\n${INFO} found ${YELLOW}$DIR2${RESET} config found in ${HOME}/.config/\n"
      read -p "${CAT} do you want to replace ${YELLOW}$DIR2${RESET} config? (y/n): " DIR1_CHOICE
      case "$DIR1_CHOICE" in
        [Yy]* )
          BACKUP_DIR=$(get_backup_dirname)
          # Backup the existing directory
          mv "$DIRPATH" "$DIRPATH-backup-$BACKUP_DIR" 2>&1 | tee -a "$LOG"
          echo -e "${NOTE} - backed up $DIR2 to $DIRPATH-backup-$BACKUP_DIR." 2>&1 | tee -a "$LOG"

          # Copy the new config
          cp -r "config/$DIR2" "$HOME/.config/$DIR2" 2>&1 | tee -a "$LOG"
          echo -e "${OK} - replaced $DIR2 with new configuration." 2>&1 | tee -a "$LOG"
         
          # Restoring rofi themes directory unique themes
          if [ "$DIR2" = "rofi" ]; then
            if [ -d "$DIRPATH-backup-$BACKUP_DIR/themes" ]; then
              for file in "$DIRPATH-backup-$BACKUP_DIR/themes"/*; do
                [ -e "$file" ] || continue  # Skip if no files are found
                echo "copying $file to $HOME/.config/rofi/themes/" >> "$LOG"
                cp -n "$file" "$HOME/.config/rofi/themes/"
              done || true
            fi
          fi

          break
          ;;
        [Nn]* )
          echo -e "${NOTE} - skipping ${YELLOW}$DIR2${RESET}" 2>&1 | tee -a "$LOG"
          break
          ;;
        * )
          echo -e "${WARN} - invalid choice. please enter Y or N."
          ;;
      esac
    done
  else
    # Copy new config if directory does not exist
    cp -r "config/$DIR2" "$HOME/.config/$DIR2" 2>&1 | tee -a "$LOG"
    echo -e "${OK} - copy completed for ${YELLOW}$DIR2${RESET}" 2>&1 | tee -a "$LOG"
  fi
done

printf "\n%.0s" {1..1}

# special copy for waybar because of symlink
DIRW="waybar"
DIRPATHw="$HOME/.config/$DIRW"
if [ -d "$DIRPATHw" ]; then
    while true; do
        read -p "${CAT} do you want to replace ${YELLOW}$DIRW${RESET} config? (y/n): " DIR1_CHOICE
        case "$DIR1_CHOICE" in
            [Yy]* )
                BACKUP_DIR=$(get_backup_dirname)
                cp -r "$DIRPATHw" "$DIRPATHw-backup-$BACKUP_DIR" 2>&1 | tee -a "$LOG"
                echo -e "${NOTE} - backed up $DIRW to $DIRPATHw-backup-$BACKUP_DIR." 2>&1 | tee -a "$LOG"
                
                # Remove the old $DIRPATHw and copy the new one
                rm -rf "$DIRPATHw" && cp -r "config/$DIRW" "$DIRPATHw" 2>&1 | tee -a "$LOG"
                
                # step 1: handle waybar symlinks
                for file in "config" "style.css"; do
                    symlink="$DIRPATHw-backup-$BACKUP_DIR/$file"
                    target_file="$DIRPATHw/$file"
                    
                    if [ -L "$symlink" ]; then
                        symlink_target=$(readlink "$symlink")
                        if [ -f "$symlink_target" ]; then
                            rm -f "$target_file" && cp -f "$symlink_target" "$target_file"
                            echo -e "${NOTE} - copied $file as a regular file"
                        else
                            echo -e "${WARN} - symlink target for $file does not exist"
                        fi
                    fi
                done
                
                # Step 2: Copy non-existing directories and files under waybar/configs
                for dir in "$DIRPATHw-backup-$BACKUP_DIR/configs"/*; do
                    [ -e "$dir" ] || continue  # Skip if no files are found
                    if [ -d "$dir" ]; then
                        target_dir="$HOME/.config/waybar/configs/$(basename "$dir")"
                        if [ ! -d "$target_dir" ]; then
                            echo "copying directory $dir to $HOME/.config/waybar/configs/" >> "$LOG"
                            cp -r "$dir" "$HOME/.config/waybar/configs/"
                        else
                            echo "directory $target_dir already exists, skipping..." >> "$LOG"
                        fi
                    fi
                done

                for file in "$DIRPATHw-backup-$BACKUP_DIR/configs"/*; do
                    [ -e "$file" ] || continue  
                    target_file="$HOME/.config/waybar/configs/$(basename "$file")"
                    if [ ! -e "$target_file" ]; then
                        echo "Copying $file to $HOME/.config/waybar/configs/" >> "$LOG"
                        cp "$file" "$HOME/.config/waybar/configs/"
                    else
                        echo "file $target_file already exists, skipping..." >> "$LOG"
                    fi
                done || true
                
                # Step 3: Copy unique files in waybar/style
                for file in "$DIRPATHw-backup-$BACKUP_DIR/style"/*; do
                    [ -e "$file" ] || continue  
                    
                    if [ -d "$file" ]; then
                        target_dir="$HOME/.config/waybar/style/$(basename "$file")"
                        if [ ! -d "$target_dir" ]; then
                            echo "copying directory $file to $HOME/.config/waybar/style/" >> "$LOG"
                            cp -r "$file" "$HOME/.config/waybar/style/"
                        else
                            echo "directory $target_dir already exists, skipping..." >> "$LOG"
                        fi
                    else
                        target_file="$HOME/.config/waybar/style/$(basename "$file")"
                        if [ ! -e "$target_file" ]; then
                            echo "copying file $file to $HOME/.config/waybar/style/" >> "$LOG"
                            cp "$file" "$HOME/.config/waybar/style/"
                        else
                            echo "file $target_file already exists, skipping..." >> "$LOG"
                        fi
                    fi
                done || true

                # Step 4: restore Modules_Extras
                BACKUP_FILE="$DIRPATHw-backup-$BACKUP_DIR/UserModules"
                if [ -f "$BACKUP_FILE" ]; then
                  cp -f "$BACKUP_FILE" "$DIRPATHw/UserModules"
                fi

                break
                ;;
            [Nn]* )
                echo -e "${NOTE} - skipping ${YELLOW}$DIRW${RESET} config replacement" 2>&1 | tee -a "$LOG"
                break
                ;;
            * )
                echo -e "${WARN} - invalid choice, please enter Y or N"
                ;;
        esac
    done
else
    cp -r "config/$DIRW" "$DIRPATHw" 2>&1 | tee -a "$LOG"
    echo -e "${OK} - copy completed for ${YELLOW}$DIRW${RESET}" 2>&1 | tee -a "$LOG"
fi

printf "\n%.0s" {1..1}

printf "${INFO} - copying dotfiles ${SKY_BLUE}second${RESET} part\n"

# check if the config directory exists
if [ ! -d "config" ]; then
  echo "${ERROR} the 'config' directory does not exist"
  exit 1
fi

DIR="
  btop
  cava
  hypr
  Kvantum
  qt5ct
  qt6ct
  swappy
  wallust
  wlogout
"
for DIR_NAME in $DIR; do
  DIRPATH="$HOME/.config/$DIR_NAME"
  
  # Backup the existing directory if it exists
  if [ -d "$DIRPATH" ]; then
    echo -e "\n${NOTE} - config for ${YELLOW}$DIR_NAME${RESET} found, attempting to back up."
    BACKUP_DIR=$(get_backup_dirname)
    
    # Backup the existing directory
    mv "$DIRPATH" "$DIRPATH-backup-$BACKUP_DIR" 2>&1 | tee -a "$LOG"
    if [ $? -eq 0 ]; then
      echo -e "${NOTE} - backed up $DIR_NAME to $DIRPATH-backup-$BACKUP_DIR."
    else
      echo "${ERROR} - failed to back up $DIR_NAME."
      exit 1
    fi
  fi
  
  # Copy the new config
  if [ -d "config/$DIR_NAME" ]; then
    cp -r "config/$DIR_NAME/" $HOME/.config/"$DIR_NAME" 2>&1 | tee -a "$LOG"
    if [ $? -eq 0 ]; then
      echo "${OK} - copy of config for ${YELLOW}$DIR_NAME${RESET} completed!"
    else
      echo "${ERROR} - failed to copy $DIR_NAME."
      exit 1
    fi
  else
    echo "${ERROR} - directory config/$DIR_NAME does not exist to copy."
  fi
done

printf "\n%.0s" {1..1}

# automatically restore animations and monitor-profiles
# including monitors.conf and workspaces.conf
HYPR_DIR="$HOME/.config/hypr"
BACKUP_DIR=$(get_backup_dirname)
BACKUP_HYPR_PATH="$HYPR_DIR-backup-$BACKUP_DIR"

if [ -d "$BACKUP_HYPR_PATH" ]; then
  echo -e "\n${NOTE} restoring ${SKY_BLUE}animations and monitor profiles${RESET} directories into ${YELLOW}$HYPR_DIR${RESET}..."
  
  DIR_B=("Monitor_Profiles" "animations" "wallpaper_effects")
  # Restore directories automatically 
  for DIR_RESTORE in "${DIR_B[@]}"; do
    BACKUP_SUBDIR="$BACKUP_HYPR_PATH/$DIR_RESTORE"
    
    if [ -d "$BACKUP_SUBDIR" ]; then
      cp -r "$BACKUP_SUBDIR" "$HYPR_DIR/" 
      echo "${OK} - restored directory: ${MAGENTA}$DIR_RESTORE${RESET}" 2>&1 | tee -a "$LOG"
    fi
  done

  # Restore files automatically
  FILE_B=("monitors.conf" "workspaces.conf" "pyprland.toml")
  for FILE_RESTORE in "${FILE_B[@]}"; do
    BACKUP_FILE="$BACKUP_HYPR_PATH/$FILE_RESTORE"

    if [ -f "$BACKUP_FILE" ]; then
      cp "$BACKUP_FILE" "$HYPR_DIR/$FILE_RESTORE" 
      echo "${OK} - restored file: ${MAGENTA}$FILE_RESTORE${RESET}" 2>&1 | tee -a "$LOG"
    fi
  done
fi

printf "\n%.0s" {1..1}

# Restoring UserConfigs and UserScripts
DIRH="hypr"
FILES_TO_RESTORE=(
  "ENVariables.conf"
  "LaptopDisplay.conf"
  "Laptops.conf"
  "Startup_Apps.conf"
  "UserDecorations.conf"
  "UserAnimations.conf"
  "UserKeybinds.conf"
  "UserSettings.conf"
  "WindowRules.conf"
)

DIRPATH="$HOME/.config/$DIRH"
BACKUP_DIR=$(get_backup_dirname)
BACKUP_DIR_PATH="$DIRPATH-backup-$BACKUP_DIR/UserConfigs"

if [ -z "$BACKUP_DIR" ]; then
  echo "${ERROR} - backup directory name is empty, exiting."
  exit 1
fi

if [ -d "$BACKUP_DIR_PATH" ]; then
  echo -e "${NOTE} restoring previous ${MAGENTA}user-configs${RESET}... "
  echo -e "${WARN} ${WARNING}if you decide to restore the old configs, make sure to handle the updates or changes manually${RESET}."

  for FILE_NAME in "${FILES_TO_RESTORE[@]}"; do
    BACKUP_FILE="$BACKUP_DIR_PATH/$FILE_NAME"
    if [ -f "$BACKUP_FILE" ]; then
      printf "\n${INFO} found ${YELLOW}$FILE_NAME${RESET} in hypr backup...\n"
      read -p "${CAT} do you want to restore ${YELLOW}$FILE_NAME${RESET} from backup? (y/N): " file_restore

      if [[ "$file_restore" == [Yy]* ]]; then
        if cp "$BACKUP_FILE" "$DIRPATH/UserConfigs/$FILE_NAME"; then
          echo "${OK} - $FILE_NAME restored!" 2>&1 | tee -a "$LOG"
        else
          echo "${ERROR} - failed to restore $FILE_NAME!" 2>&1 | tee -a "$LOG"
        fi
      else
        echo "${NOTE} - skipped restoring $FILE_NAME."
      fi
    fi
  done
fi

printf "\n%.0s" {1..1}

# Restoring previous UserScripts
DIRSH="hypr"
SCRIPTS_TO_RESTORE=(
  "RofiBeats.sh"
  "Weather.py"
  "Weather.sh"
)

DIRSHPATH="$HOME/.config/$DIRSH"
BACKUP_DIR_PATH="$DIRSHPATH-backup-$BACKUP_DIR/UserScripts"

if [ -d "$BACKUP_DIR_PATH" ]; then
  echo -e "${NOTE} restoring previous ${MAGENTA}user-scripts${RESET}..."

  for SCRIPT_NAME in "${SCRIPTS_TO_RESTORE[@]}"; do
    BACKUP_SCRIPT="$BACKUP_DIR_PATH/$SCRIPT_NAME"

    if [ -f "$BACKUP_SCRIPT" ]; then
      printf "\n${INFO} found ${YELLOW}$SCRIPT_NAME${RESET} in hypr backup...\n"
      read -p "${CAT} do you want to restore ${YELLOW}$SCRIPT_NAME${RESET} from backup? (y/N): " script_restore
      if [[ "$script_restore" == [Yy]* ]]; then
        if cp "$BACKUP_SCRIPT" "$DIRSHPATH/UserScripts/$SCRIPT_NAME"; then
          echo "${OK} - $SCRIPT_NAME restored!" 2>&1 | tee -a "$LOG"
        else
          echo "${ERROR} - failed to restore $SCRIPT_NAME!" 2>&1 | tee -a "$LOG"
        fi
      else
        echo "${NOTE} - skipped restoring $SCRIPT_NAME."
      fi
    fi
  done
fi

printf "\n%.0s" {1..1}

# restoring some files in ~/.config/hypr
DIR_H="hypr"
FILES_2_RESTORE=(
  "hyprlock.conf"
  "hypridle.conf"
)

DIRPATH="$HOME/.config/$DIR_H"
BACKUP_DIR=$(get_backup_dirname)
BACKUP_DIR_PATH_F="$DIRPATH-backup-$BACKUP_DIR"

if [ -d "$BACKUP_DIR_PATH_F" ]; then
  echo -e "${NOTE} restoring some files in ${MAGENTA}$HOME/.config/hypr directory${RESET}..."

  for FILE_RESTORE in "${FILES_2_RESTORE[@]}"; do
    BACKUP_FILE="$BACKUP_DIR_PATH_F/$FILE_RESTORE"
  
    if [ -f "$BACKUP_FILE" ]; then
      echo -e "\n${INFO} found ${YELLOW}$FILE_RESTORE${RESET} in hypr backup..."
      read -p "${CAT} do you want to restore ${YELLOW}$FILE_RESTORE${RESET} from backup? (y/N): " file2restore

      if [[ "$file2restore" == [Yy]* ]]; then
        if cp "$BACKUP_FILE" "$DIRPATH/$FILE_RESTORE"; then
          echo "${OK} - $FILE_RESTORE restored!" 2>&1 | tee -a "$LOG"
        else
          echo "${ERROR} - failed to restore $FILE_RESTORE!" 2>&1 | tee -a "$LOG"
        fi
      else
        echo "${NOTE} - skipped restoring $FILE_RESTORE."
      fi
    else
      echo "${ERROR} - backup file $BACKUP_FILE does not exist."
    fi
  done
fi

printf "\n%.0s" {1..1}

# Define the target directory for rofi themes
rofi_DIR="$HOME/.local/share/rofi/themes"

if [ ! -d "$rofi_DIR" ]; then
  mkdir -p "$rofi_DIR"
fi
if [ -d "$HOME/.config/rofi/themes" ]; then
  if [ -z "$(ls -A $HOME/.config/rofi/themes)" ]; then
    echo '/* Dummy Rofi theme */' > "$HOME/.config/rofi/themes/dummy.rasi"
  fi
  ln -snf ~/.config/rofi/themes/* ~/.local/share/rofi/themes/
  # Delete the dummy file if it was created
  if [ -f "$HOME/.config/rofi/themes/dummy.rasi" ]; then
    rm "$HOME/.config/rofi/themes/dummy.rasi"
  fi
fi

printf "\n%.0s" {1..1}

# wallpaper stuff
mkdir -p $HOME/Pictures/wallpapers
if cp -r wallpapers $HOME/Pictures/; then
  echo "${OK} some ${MAGENTA}wallpapers${RESET} copied successfully!" | tee -a "$LOG"
else
  echo "${ERROR} failed to copy some ${YELLOW}wallpapers${RESET}" | tee -a "$LOG"
fi

# Set some files as executable
chmod +x "$HOME/.config/hypr/scripts/"* 2>&1 | tee -a "$LOG"
chmod +x "$HOME/.config/hypr/UserScripts/"* 2>&1 | tee -a "$LOG"
# Set executable for initial-boot.sh
chmod +x "$HOME/.config/hypr/initial-boot.sh" 2>&1 | tee -a "$LOG"

# Waybar config to symlink & retain based on machine type
if hostnamectl | grep -q 'Chassis: desktop'; then
    config_file="$waybar_config"
    config_remove=" Laptop"
else
    config_file="$waybar_config_laptop"
    config_remove=""
fi

# check if ~/.config/waybar/config does not exist or is a symlink
if [ ! -e "$HOME/.config/waybar/config" ] || [ -L "$HOME/.config/waybar/config" ]; then
  ln -sf "$config_file" "$HOME/.config/waybar/config" 2>&1 | tee -a "$LOG"
fi

# Remove inappropriate waybar configs
rm -rf "$HOME/.config/waybar/configs/[TOP] Default$config_remove" \
       "$HOME/.config/waybar/configs/[BOT] Default$config_remove" \
       "$HOME/.config/waybar/configs/[TOP] Default$config_remove (old v1)" \
       "$HOME/.config/waybar/configs/[TOP] Default$config_remove (old v2)" \
       "$HOME/.config/waybar/configs/[TOP] Default$config_remove (old v3)" \
       "$HOME/.config/waybar/configs/[TOP] Default$config_remove (old v4)" 2>&1 | tee -a "$LOG" || true

printf "\n%.0s" {1..1}

# for SDDM (sequoia_2)
sddm_sequioa="/usr/share/sddm/themes/sequoia_2"
if [ -d "$sddm_sequioa" ]; then
  while true; do
    read -rp "${CAT} SDDM sequoia_2 theme detected! apply current wallpaper as SDDM background? (y/n): " SDDM_WALL
    
    # Remove any leading/trailing whitespace or newlines from input
    SDDM_WALL=$(echo "$SDDM_WALL" | tr -d '\n' | tr -d ' ')

    case $SDDM_WALL in
      [Yy])
        # Copy the wallpaper, ignore errors if the file exists or fails
        sudo cp -r "config/hypr/wallpaper_effects/.wallpaper_current" "/usr/share/sddm/themes/sequoia_2/backgrounds/default" || true
        echo "${NOTE} current wallpaper applied as default SDDM background" 2>&1 | tee -a "$LOG"
        break
        ;;
      [Nn])
        echo "${NOTE} you chose not to apply the current wallpaper to SDDM." 2>&1 | tee -a "$LOG"
        break
        ;;
      *)
        echo "please enter 'y' or 'n' to proceed."
        ;;
    esac
  done
fi

# additional wallpapers
printf "\n%.0s" {1..1}
echo "${MAGENTA}by default only a few wallpapers are copied${RESET}..."

# TODO: download more wallpapers?

cleanup_backups() {
  CONFIG_DIR="$HOME/.config"
  BACKUP_PREFIX="-backup"

  # Loop through directories in $HOME/.config
  for DIR in "$CONFIG_DIR"/*; do
    if [ -d "$DIR" ]; then
      BACKUP_DIRS=()

      # Check for backup directories
      for BACKUP in "$DIR"$BACKUP_PREFIX*; do
        if [ -d "$BACKUP" ]; then
          BACKUP_DIRS+=("$BACKUP")
        fi
      done
	  
      # If more than one backup found
      if [ ${#BACKUP_DIRS[@]} -gt 1 ]; then
      	printf "\n%.0s" {1..2}
        echo -e "${INFO} found ${MAGENTA}multiple backups${RESET} for: ${YELLOW}${DIR##*/}${RESET}"
        echo "${YELLOW}backups: ${RESET}"

        # List the backups
        for BACKUP in "${BACKUP_DIRS[@]}"; do
          echo "  - ${BACKUP##*/}"
        done

        read -p "${CAT} do you want to delete the older backups of ${YELLOW}${DIR##*/}${RESET} and keep the latest backup only? (y/N): " back_choice
        if [[ "$back_choice" == [Yy]* ]]; then
          # Sort backups by modification time
          latest_backup="${BACKUP_DIRS[0]}"
          for BACKUP in "${BACKUP_DIRS[@]}"; do
            if [ "$BACKUP" -nt "$latest_backup" ]; then
              latest_backup="$BACKUP"
            fi
          done

          for BACKUP in "${BACKUP_DIRS[@]}"; do
            if [ "$BACKUP" != "$latest_backup" ]; then
              echo "deleting: ${BACKUP##*/}"
              rm -rf "$BACKUP"
            fi
          done
          echo "old backups of ${YELLOW}${DIR##*/}${RESET} deleted, keeping: ${MAGENTA}${latest_backup##*/}${RESET}"
        fi
      fi
    fi
  done
}
# Execute the cleanup function
cleanup_backups

# ln -sf "$waybar_style" "$HOME/.config/waybar/style.css" && \
# check if ~/.config/waybar/style.css does not exist or is a symlink
if [ ! -e "$HOME/.config/waybar/style.css" ] || [ -L "$HOME/.config/waybar/style.css" ]; then
  ln -sf "$waybar_style" "$HOME/.config/waybar/style.css" 2>&1 | tee -a "$LOG"
fi

printf "\n%.0s" {1..1}

# initialize wallust to avoid config error on hyprland
wallust run -s $wallpaper 2>&1 | tee -a "$LOG"

printf "\n%.0s" {1..2}
printf "${OK} nixos-dots is now ready"
printf "\n%.0s" {1..1}
printf "${INFO} however, it is ${MAGENTA}HIGHLY SUGGESTED${RESET} to logout and re-login or better reboot to avoid any issues"
printf "\n%.0s" {1..3}