#
# ~/.bashrc
#

# $HOME/Syncthing/Scripts/Bash/quotes-parser/parse_quotes.sh

## Save history of multiple terminal windows
#-https://unix.stackexchange.com/questions/1288/preserve-bash-history-in-multiple-terminal-windows
# Avoid duplicates
# borked, doesn't save in correct order and inserts random entries
# HISTCONTROL=ignoredups:erasedups
# # When the shell exits, append to the history file instead of overwriting it
# shopt -s histappend

# # After each command, append to the history file and reread it
# PROMPT_COMMAND="${PROMPT_COMMAND:+$PROMPT_COMMAND$'\n'}history -a; history -c; history -r"


# Softlink ~ config file to syncthing config fodler
# ln -s /home/yuriy/Syncthing/Configurations/Linux.config/.bashrc /home/yuriy/.bashrc


# If not running interactively, don't do anything
[[ $- != *i* ]] && return

[[ -f ~/.welcome_screen ]] && . ~/.welcome_screen

_set_my_PS1() {
    PS1='[\u@\h \W]\$ '
    if [ "$(whoami)" = "liveuser" ] ; then
        local iso_version="$(grep ^VERSION= /usr/lib/endeavouros-release 2>/dev/null | cut -d '=' -f 2)"
        if [ -n "$iso_version" ] ; then
            local prefix="eos-"
            local iso_info="$prefix$iso_version"
            PS1="[\u@$iso_info \W]\$ "
        fi
    fi
}
_set_my_PS1
unset -f _set_my_PS1

ShowInstallerIsoInfo() {
    local file=/usr/lib/endeavouros-release
    if [ -r $file ] ; then
        cat $file
    else
        echo "Sorry, installer ISO info is not available." >&2
    fi
}



[[ "$(whoami)" = "root" ]] && return

[[ -z "$FUNCNEST" ]] && export FUNCNEST=100          # limits recursive functions, see 'man bash'

## Use the up and down arrow keys for finding a command in history
## (you can write some initial letters of the command first).
bind '"\e[A":history-search-backward'
bind '"\e[B":history-search-forward'

################################################################################
## Some generally useful functions.
## Consider uncommenting aliases below to start using these functions.


_GeneralCmdCheck() {
    # A helper for functions UpdateArchPackages and UpdateAURPackages.

    echo "$@" >&2
    "$@" || {
        echo "Error: '$*' failed." >&2
        exit 1
    }
}

_CheckInternetConnection() {
    # curl --silent --connect-timeout 8 https://8.8.8.8 >/dev/null
    eos-connection-checker
    local result=$?
    test $result -eq 0 || echo "No internet connection!" >&2
    return $result
}

_CheckArchNews() {
    local conf=/etc/eos-update-notifier.conf

    if [ -z "$CheckArchNewsForYou" ] && [ -r $conf ] ; then
        source $conf
    fi

    if [ "$CheckArchNewsForYou" = "yes" ] ; then
        local news="$(yay -Pw)"
        if [ -n "$news" ] ; then
            echo "Arch news:" >&2
            echo "$news" >&2
            echo "" >&2
            # read -p "Press ENTER to continue (or Ctrl-C to stop): "
        else
            echo "No Arch news." >&2
        fi
    fi
}

UpdateArchPackages() {
    # Updates Arch packages.

    _CheckInternetConnection || return 1

    _CheckArchNews

    #local updates="$(yay -Qu --repo)"
    local updates="$(checkupdates)"
    if [ -n "$updates" ] ; then
        echo "Updates from upstream:" >&2
        echo "$updates" | sed 's|^|    |' >&2
        _GeneralCmdCheck sudo pacman -Syu "$@"
        return 0
    else
        echo "No upstream updates." >&2
        return 1
    fi
}

UpdateAURPackages() {
    # Updates AUR packages.

    _CheckInternetConnection || return 1

    local updates
    if [ -x /usr/bin/yay ] ; then
        updates="$(yay -Qua)"
        if [ -n "$updates" ] ; then
            echo "Updates from AUR:" >&2
            echo "$updates" | sed 's|^|    |' >&2
            _GeneralCmdCheck yay -Syua "$@"
        else
            echo "No AUR updates." >&2
        fi
    else
        echo "Warning: /usr/bin/yay does not exist." >&2
    fi
}


################################################################################
## My Personal Functions


# copy last command
_copy_last_command() {
    # Use `history -p !!` and capture only the second line
    local last_command=$(history -p !! | tail -n 1)

    echo -n "${last_command}" | xclip -sel clip
    # copyq add "${last_command}"
    echo "Copied to copyQ, but not to clipboard"
}



psyu() {
    # Updates all packages in the system.
    # Upstream (i.eUpdate. Arch) packages are updated first.
    # If there are Arch updates, you should run
    # this function a second time to update
    # the AUR packages too.

    UpdateArchPackages || UpdateAURPackages
}

_open_files_for_editing() {
    # Open any given document file(s) for editing (or just viewing).
    # Note1: Do not use for executable files!
    # Note2: uses mime bindings, so you may need to use
    #        e.g. a file manager to make some file bindings.

    if [ -x /usr/bin/exo-open ] ; then
        echo "exo-open $*" >&2
        /usr/bin/exo-open "$@" >& /dev/null &
        return
    fi
    if [ -x /usr/bin/xdg-open ] ; then
        for file in "$@" ; do
            echo "xdg-open $file" >&2
            /usr/bin/xdg-open "$file" >& /dev/null &
        done
        return
    fi

    echo "Sorry, none of programs [$progs] is found." >&2
    echo "Tip: install one of packages" >&2
    for prog in $progs ; do
        echo "    $(pacman -Qqo "$prog")" >&2
    done
}

_Pacdiff() {
    local differ pacdiff=/usr/bin/pacdiff

    if [ -n "$(echo q | DIFFPROG=diff $pacdiff)" ] ; then
        for differ in kdiff3 meld diffuse ; do
            if [ -x /usr/bin/$differ ] ; then
                DIFFPROG=$differ su-c_wrapper $pacdiff
                break
            fi
        done
    fi
}


# Reboot directly to Windows
# https://unix.stackexchange.com/questions/43196/how-can-i-tell-grub-i-want-to-reboot-into-windows-before-i-reboot
# Inspired by http://askubuntu.com/questions/18170/how-to-reboot-into-windows-from-ubuntu
bootwindows ()
{
    windows_title=$(grep -i windows /boot/grub/grub.cfg | cut -d "'" -f 2)
    notify-send -t 1000 "$windows_title"
    # sudo grub-reboot "$windows_title" && sudo reboot
}
# alias reboot-to-windows='reboot_to_windows'

## FZF
# https://github.com/junegunn/fzf/wiki/examples#opening-files
fe() {
  IFS=$'\n' files=($(fzf --query="$1" --multi --select-1 --exit-0))
  [[ -n "$files" ]] && zeditor "${files[@]}"
}

## FZF

# Modified version where you can press
#   - CTRL-O to open with `open` command,
#   - CTRL-E or Enter key to open with the $EDITOR
fo() {
  # cd /home/$USER/
  IFS=$'\n' out=("$(fzf -e --query="$1" --exit-0 --expect=alt-e,alt-o,ctrl-o,ctrl-e,ctrl-p)")
  key=$(head -1 <<< "$out")
  file=$(head -2 <<< "$out" | tail -1)
  # echo "key1: $key"

  if [ -n "$file" ]; then
    file=${PWD}/${file}
    echo file: $file
    case "$key" in
      *ctrl-p*) echo ${file} | xclip -sel c ;;  # copy variable contents to clip
      *alt-o*) Directory="$(dirname "${file}")" ; dolphin "${Directory}";;
      *alt-e*)
        # FullFilepath=/home/me/mydir/file.c
        Directory="$(dirname "${file}")" # Get directory
        FileNameWExt="$(basename "${file}")" # File Name wExtension
        FileNameNoExt=${file%.*} # File name wOut Extension
        FileExtension="${file##*.}" # File Extension
        # echo "$Directory"
        # echo "$FileNameWExt"
        # echo "$FileNameNoExt"
        # echo "$FileExtension"
        # xdg-open $file

        case "$FileExtension" in
          # *txt*) subl ${file} ;;
          # *conf*) subl ${file} ;;
          # *sh*) subl ${file} ;;
          # *py*) subl ${file} ;;
          *jpg*) gimp ${file} & xdotool key Escape ;;
          *png*) gimp ${file} & xdotool key Escape ;;
          *) atuin history start -- "nvim ${file}" > /dev/null && nvim ${file} ;;
        esac ;;
      *) atuin history start -- "nvim ${file}" > /dev/null && nvim ${file} ;;
    esac
      # echo "$file"
  # echo "key2: $key"
   # [ "$key" = ctrl-o ] && open "$file" || gimp "$file" &
    # [ "$key" = ctrl-p ] && echo "$file"
  fi
  #sleep .5
  #xdotool key F3
  # fo
}
# Expand on this later


foa() {
  cd "$PWD"
  IFS=$'\n' out=("$(fzf -e --query="$1" --exit-0 --expect=alt-e,alt-o,ctrl-o,ctrl-e,ctrl-p)")
  key=$(head -1 <<< "$out")
  file=$(head -2 <<< "$out" | tail -1)
  # echo "key1: $key"

  if [ -n "$file" ]; then
    file=/home/$USER/${file}
    case "$key" in
      *ctrl-p*) echo ${file} | xclip -sel c ;;  # copy variable contents to clip
      *alt-o*) Directory="$(dirname "${file}")" ; dolphin "${Directory}";;
      *alt-e*)
        # FullFilepath=/home/me/mydir/file.c
        Directory="$(dirname "${file}")" # Get directory
        FileNameWExt="$(basename "${file}")" # File Name wExtension
        FileNameNoExt=${file%.*} # File name wOut Extension
        FileExtension="${file##*.}" # File Extension
        # echo "$Directory"
        # echo "$FileNameWExt"
        # echo "$FileNameNoExt"
        # echo "$FileExtension"
        # xdg-open $file

        case "$FileExtension" in
          # *txt*) subl ${file} ;;
          # *conf*) subl ${file} ;;
          # *sh*) subl ${file} ;;
          # *py*) subl ${file} ;;
          *jpg*) gimp ${file} & xdotool key Escape ;;
          *png*) gimp ${file} & xdotool key Escape ;;
          # *) subl ${file} ;; # sublime everything else
          *) zeditor -a ${file} ;; # zeditor everything else
        esac ;;
      *) xdg-open $file ;;
    esac
      # echo "$file"
  # echo "key2: $key"
   # [ "$key" = ctrl-o ] && open "$file" || gimp "$file" &
    # [ "$key" = ctrl-p ] && echo "$file"
  fi
  #sleep .5
  #xdotool key F3
  # fo
}


sdl() {

local playlist="$1"
cd "/home/yuriy/Executables/zspotify/"

python zspotify ${playlist}

echo "we done!"

}

# cf - fuzzy cd from anywhere
# ex: cf word1 word2 ... (even part of a file name)
# zsh autoload function
cf() {
  local file

  file="$(locate -Ai -0 $@ | grep -z -vE '~$' | fzf --read0 -0 -1)"

  if [[ -n $file ]]
  then
     if [[ -d $file ]]
     then
        cd -- $file
     else
        cd -- ${file:h}
     fi
  fi
}

# cdf - cd into the directory of the selected file
cdf() {
   local file
   local dir
   file=$(fzf +m -q "$1") && dir=$(dirname "$file") && cd "$dir"
}

# fh - repeat history
# fh - repeat history
fh() {
  print -z $( ([ -n "$ZSH_NAME" ] && fc -l 1 || history) | fzf +s --tac | sed -E 's/ *[0-9]*\*? *//' | sed -E 's/\\/\\\\/g')
}


rl() {
# reload bashrc in current instance
. ~/.bashrc
echo "Successfully Reloaded .bashrc"
}

dlrl() {
    echo "Downloading latest .bashrc from gitea"
    cd ~/ && wget -q -O .bashrc https://git.zinchuk.xyz/yuriy/Linux-bashrc-Profile/raw/branch/main/.bashrc && chmod 744 .bashrc

    . ~/.bashrc
    echo "Loaded latest .bashrc"
}

parul(){
    pacman -Qqe > pkglist.txt
    subl pkglist.txt
}



update() {
    local status=0


    # 


    # update keyrings
    paru -Sy $(pacman -Qq | grep keyring) --noconfirm --needed
    if [ $? -ne 0 ]; then
        status=1
    fi

    # run PBS backup script in background if hostname does not contain "pease-int"
    if [[ ! "$(hostname)" == *"pease-int"* ]]; then
        $HOME/Syncthing/Scripts/bash/proxmox/PBS-backup-script.cz "manual" &
    fi


    # update packages, no confirmation
    paru -Syu --noconfirm
    if [ $? -ne 0 ]; then
        status=1
    fi

    # # Skip clearing update cache if this is Flexo Server or if update had errors
    # if [[ $(hostname) == "FLEXO" || $status -eq 1 ]]; then
    #   echo "Skipping Clearing Update Cache"
    # else
    #   echo "Clearing out Pacman Cache"
    #   echo clearing out $(sudo ls /var/cache/pacman/pkg/ | wc -l) packages in cache
    #   ( echo "y"; echo "y" ) | paru -Sccd
    #   if [ $? -ne 0 ]; then
    #       status=1
    #   fi
    #   sudo rm -rf /var/cache/pacman/pkg/* # remove any straggler directories
    #   # sudo rm -R /var/cache/pacman/pkg/ # removes any stuck stragglers
    #   # (d) removes all orphaned packages that are no longer needed on your system
    # fi

    # echo ""
    if command -v flatpak &> /dev/null; then
        echo "Updating Flatpak packages:"
        flatpak update -y
        if [ $? -ne 0 ]; then
            status=1
        fi
    fi

    # if [ -d "$HOME/Syncthing/Configurations/Pacman+Paru/" ]; then
    #     echo "Exporting pkglist to /Configurations"
    #     pacman -Qqe > $HOME/Syncthing/Configurations/Pacman+Paru/$(hostname)_pacmanpkglist.txt
    # else
    #     : echo "Skipping pkglist export. Config folder doesn't exist on this device."
    # fi

    return $status
}


updatevm() {
    local status=0

    # update keyrings
    sudo pacman -Sy archlinux-keyring --noconfirm --needed
    if [ $? -ne 0 ]; then
        status=1
    fi

    # update packages, no confirmation
    sudo pacman -Syu --noconfirm
    if [ $? -ne 0 ]; then
        status=1
    fi

      # echo "Clearing out Pacman Cache"
      echo clearing out $(sudo ls /var/cache/pacman/pkg/ | wc -l) packages in cache
      ( echo "y"; echo "y" ) | sudo pacman -Sccd
      if [ $? -ne 0 ]; then
          status=1
      fi
      sudo rm -rf /var/cache/pacman/pkg/* # remove any straggler directories
      # sudo rm -R /var/cache/pacman/pkg/ # removes any stuck stragglers
      # (d) removes all orphaned packages that are no longer needed on your system

    echo ""
    if command -v flatpak &> /dev/null; then
        echo "Updating Flatpak packages:"
        flatpak update -y
        if [ $? -ne 0 ]; then
            status=1
        fi
    fi

    return $status
}


updatewr() {
    # Run the Update function
    update
    local update_status=$?

    # Only reboot if update was successful
    if [ $update_status -eq 0 ]; then
        echo "Update completed successfully. Rebooting system..."
        sudo reboot
    else
        echo "Update encountered errors (exit code: $update_status). Skipping reboot."
        return $update_status
    fi
}



updatews() {
    # Run the Update function
    update
    local update_status=$?

    # run a pbs backup
    $HOME/Syncthing/Scripts/bash/proxmox/PBS-backup-script.cz manual

    # Only reboot if update was successful
    if [ $update_status -eq 0 ]; then
        echo "Update completed successfully. Shutting down system..."
        sudo poweroff
    else
        echo "Update encountered errors (exit code: $update_status). Skipping poweroff."
        return $update_status
    fi
}

rank() {
    echo "re-ranking arch mirrorlists"
    eos-rankmirrors
}

rkeymapper(){
    while true; do
        sudo pkill keymapper
        sudo systemctl restart keymapperd & keymapper
        echo "keymapper restarted successfully"
        sleep 1  # Add a small delay to prevent excessive CPU usage
    done

    # One Liner
    # sudo pkill keymapper ; sudo systemctl restart keymapperd & keymapper
}

rteams(){
    pkill teams-for-linux
    sleep 1
    teams-for-linux
}


rntfy(){
pgrep -f ntfy-Automate.sh | xargs kill
$HOME/Syncthing/Scripts/bash/ntfy-react/ntfy-react.sh &
}

cdp(){
filepath=${1}

Directory="$(dirname "${filepath}")" # Get directory
FolderName="$(basename "${Directory}")" # Get folder name

FileNameWExt="$(basename "${filepath}")" # File Name wExtension
FileNameNoExt=${FileNameWExt%.*} # File name wOut Extension
FileExtension="${FileNameWExt##*.}" # File Extension

# echo "${FolderName}"
# echo ${FolderName}
cd ${Directory}
# echo ${1} 
}


#------------------------------------------------------------
# to refresh terminal with new config:
#     . ~/.bashrc

## Aliases for the functions above.
## Uncomment an alias if you want to use it.
##


################################################################################
export PATH="$HOME/.local/bin:$PATH"
export PATH="$PATH:/opt/sublime_merge"
export PATH="$PATH:~/.ssh/"

# default editor for Terminal
export EDITOR=nvim
alias vim='nvim'
alias vi='nvim'
alias n="nvim"
if command -v nvim &> /dev/null; then
    alias nano="nvim"
fi

#alias dump="zellij action dump-screen --full > /tmp/terminal-output-$(date +%Y%m%d_%H%M%S) && echo /tmp/terminal-output-$(date +%Y%m%d_%H%M%S) | xclip -sel clip && echo 'history dumped to file and filepath copied to clipboard.'"

# pacman/paru aliases
# -------------------

# alias pacdiff=_Pacdiff
alias parus='paru -Sy ; paru -S'
alias parusy='paru -Sy ; paru -S --noconfirm'
alias paruss='paru -Ss'
alias parur='paru -Rs'
alias parurr='paru -Rs'
alias parurl='sudo pacman -Syy'
alias pcs='pacseek'
alias mirror='eos-rankmirrors' # update mirrorlists

# Misc aliases
alias cda='cd $HOME/Syncthing/Git/ansible/' # cd into the ansible directory
alias clc='_copy_last_command'     # copy last run command to copyq clipboard
alias cpc='_copy_last_command'     # copy last run command to copyq clipboard
alias ef='_open_files_for_editing'     # 'ef' opens given file(s) for editing
alias clip='xclip -sel clip' # output piped content to clipboard
alias ntfythis='{ read contents; ntfy publish --title="From Terminal:" terminal-pipes "$contents"; }'
alias snano='sudo nano'
alias pu='pdfunite'
alias tda='todo.sh add'
alias yt='yt-dlp'

#alias everything=fo
alias todos='rg "(FIXME|TODO)" .' # search the contents of folders/subfolders for fixme,todo,
alias ipb='ip -brief a'
alias dol='dolphin'
alias chmodx="chmod u+x" # make file executable for current user
alias sm='smerge'
alias smmt='smerge mergetool'
# mouse jiggler
alias ka="while :; do xdotool mousemove_relative -- $(( $RANDOM % 3 - 1 )) $(( $RANDOM % 3 - 1 )) sleep 60; done" # Keep screen awake
alias z="zellij"
alias za="zellij attach"



alias fuz="fuz --edit --names --max-depth 8"
alias find='nvim $(tv)'

# Opencode nvim
alias opcnv='opencode --port 4096'
alias opcnvim='opencode --port 4096'

# ------------------------------------------------
# SSH ALIASES
# ------------------------------------------------
alias ss='$HOME/Syncthing/Scripts/bash/fzf/fzf_ssh_picker.sh'

# boot/switch to CLI/GUI target
alias switchtocli="sudo systemctl isolate multi-user.target"
alias switchtogui="sudo systemctl isolate graphical.target"
alias boottty="sudo systemctl set-default multi-user.target"
alias bootgui="sudo systemctl set-default graphical.target"


# flatpak
alias flatpaks="sudo flatpak install"
alias flatpakr="sudo flatpak uninstall"


# Git Aliases
alias gac="git add .;git commit -m"
alias gacc='f() { git add . ; git commit -m "$@" ; git push; }; f'
alias gpm="git push origin master"
alias pull="git pull"
alias gpp="git pull --rebase --autostash"
alias gl="git log"
alias glo="git log --oneline"
alias gch="git checkout ${1}"
alias gb="git branch ${1}"
alias gs="git status"
alias gss="git status"
alias gdd="git diff"
alias gdf="git diff"
alias gsi="git submodule init"
alias gsu="git submodule update --recursive --remote"
alias gr="touch README.md ;nano README.md" # choco install nano -y

# Chezmoi Aliases
alias cz="chezmoi"
alias czs="chezmoi status"
alias cza="chezmoi apply"
alias czadd="chezmoi add"
alias czc="chezmoi cd"
alias czcd="chezmoi cd"
alias czgpp="chezmoi cd ; git pull"
alias czdiff="chezmoi diff"
alias czd="dolphin $HOME/.local/share/chezmoi ; cd /home/yuriy/.local/share/chezmoi"
alias czea="chezmoi edit --apply"
alias czstatus="subl $HOME/.config/chezmoi/chezmoi-status"



# Opencode
alias opc="opencode"
alias opcls="$HOME/Syncthing/Scripts/bash/fzf/fzf-opencode-session-picker.sh"


# Syslog Helper
alias syslog="$HOME/Syncthing/Scripts/bash/syslog-helper/get-syslog.sh"

# ------------------------------------------------
# Work Related
# ------------------------------------------------
alias fw="$HOME/.ssh/forwards gui"
# alias ansible-playbook="cd $/Syncthing/Git/ansible/"



################################################################################


if command -v lsd &> /dev/null; then
alias ls="lsd -al"
alias ll="lsd -alh"
alias lst="lsd --tree --level 2"

else

alias ls="ls -la"
alias ll="ls -alh"
alias lst="ls --tree --level 2 --long"
#alias ls='ls --color=auto'
#alias ll='ls -lav --ignore=..'   # show long listing of all except ".."
#alias l='ls -lav --ignore=.?*'   # show long listing but no hidden dotfiles except "."

fi


if command -v bat &> /dev/null; then
    alias cat="bat"
    alias less="bat"
    alias df="duf"
    alias du="dust"


fi




################################################################################

# Initialize Zoxide if it's installed 
if command -v zoxide &> /dev/null; then
    # Initialize zoxide with the 'cd' command
    eval "$(zoxide init --cmd cd bash)"
fi

# initialize atuin if it's installed
if command -v atuin &> /dev/null; then
    # Initialize preexec and atuin if atuin is installed
    [[ -f ~/.bash-preexec.sh ]] && source ~/.bash-preexec.sh
    eval "$(atuin init bash)"
fi


# Initialize starship if it's installed
if command -v starship &> /dev/null; then
    eval "$(starship init bash)"
fi

# Initialize fuz if it's installed
if command -v fuz &> /dev/null; then
    export FUZ_EDITOR=nvim
    # echo $FUZ_EDITOR
    alias fz="fuz --edit"
fi

# Required: Path to OpenCode storage directory
export OPENCODE_STORAGE_DIR="$HOME/.local/share/opencode/storage"


if command -v zellij &> /dev/null; then
    if [[ -z "$ZELLIJ" ]]; then

        # Get current terminal dimensions
        # cols=$(tput cols)
        lines=$(tput lines)
        echo $lines

        # Define your "too small" threshold (adjust these values as needed)
        # For example, if it's smaller than 80 columns or 20 lines, skip Zellij
        if [[ "$lines" -lt 20 ]]; then
            echo "Terminal too small for Zellij. Skipping."
        else
            if [[ "$ZELLIJ_AUTO_ATTACH" == "true" ]]; then
                # cd ~/Syncthing/Git/ansible/
                zellij attach -c
            else
                # cd ~/Syncthing/Git/ansible/
                zellij
            fi

            if [[ "$ZELLIJ_AUTO_EXIT" == "true" ]]; then
                exit
            fi
        fi
    fi
fi
