# **************************************************************************** #
#                                                                              #
#                                                         :::      ::::::::    #
#    .zshrc                                             :+:      :+:    :+:    #
#                                                     +:+ +:+         +:+      #
#    By: abosc <abosc@42lehavre.fr>                 +#+  +:+       +#+         #
#                                                 +#+#+#+#+#+   +#+            #
#    Created: 2026/06/15 16:19:14 by abosc             #+#    #+#              #
#    Updated: 2026/06/15 16:19:14 by abosc            ###   ########.fr        #
#                                                                              #
# **************************************************************************** #


# ==============================================================================
# 1. CONFIGURATION D'OH-MY-ZSH
# ==============================================================================
export ZSH="$HOME/.oh-my-zsh"

ZSH_THEME="agnosterzak"

plugins=(
    git
    archlinux
    zsh-autosuggestions
    zsh-syntax-highlighting
    sudo
    copypath
)

source $ZSH/oh-my-zsh.sh

# ==============================================================================
# 2. OPTIONS DE CONFIGURATION DE BASE
# ==============================================================================

# --- Gestion de l'historique ---
HISTFILE=~/.zsh_history
HISTSIZE=10000
SAVEHIST=10000

setopt SHARE_HISTORY          # Partage l'historique entre toutes les sessions ouvertes
setopt HIST_IGNORE_DUPS       # Ne pas enregistrer une commande si c'est la même que la précédente
setopt HIST_IGNORE_ALL_DUPS   # Supprime les lignes répétées de l'historique
setopt HIST_REDUCE_BLANKS     # Retire les espaces inutiles des commandes avant de les stocker
setopt HIST_IGNORE_SPACE      # Ne pas enregistrer les commandes commençant par un espace

# --- Complétion ---
zstyle ':completion:*' menu select # Améliore la complétion (plus visuelle)

# ==============================================================================
# 3. COMPOSANTS EXTERNES & UTILITAIRES (Fastfetch, FZF, Zoxide)
# ==============================================================================

# Affichage des infos système au démarrage
fastfetch --logo-type kitty --logo ~/.config/arch_logo.png --logo-width 30 --logo-height 14

# Raccourcis clavier FZF (CTRL+R pour l'historique flou)
source <(fzf --zsh)

# Navigation intelligente avec Zoxide
eval "$(zoxide init zsh)"

# ==============================================================================
# 4. ALIAS
# ==============================================================================

# Remplacement de 'cd' par 'z' (Zoxide)
alias cd='z'

# Navigation rapide
alias ..='cd ..'
alias ...='cd ../..'
alias ....='cd ../../..'
alias pedago='cd /home/achille/Documents/work/dashboard_pedago'
alias dash="cd /home/achille/Documents/work/dashboard_pedago"

# Amélioration de 'ls' via lsd
alias ls='lsd --hyperlink=always'
alias l='ls -l'
alias la='ls -a'
alias lla='ls -la'
alias lt='ls --tree'
alias lr='ls -R'

# Sécurité (Confirmations avant actions sensibles)
alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'

# Corrections de fautes de frappe courantes
alias celar=clear
alias cela=clear
alias exot=exit
alias clear='printf "\033c"'

# Raccourcis Système & Outils (Arch / Yay)
alias up='yay -Syu'
alias zrc='source ~/.zshrc'
alias vi=vim
alias kq="pkill quickshell"
alias yays='yay -Ss'         # Chercher un paquet sur les dépôts + AUR
alias yayi='yay -S'          # Installer un paquet
alias yayr='yay -Rns'        # Désinstaller proprement (avec dépendances et configs)
alias yayc='yay -Yc'         # Nettoyer les dépendances orphelines

# Python / Environnements virtuels
alias prc='source .venv/bin/activate'
alias p="prc && python3 src/main.py"
alias py="prc && python3"
alias convert="python3 /home/achille/Documents/work/utilities/svg_to_png.py"

# Projets spécifiques & Scripts
alias retry="ruby /home/achille/Documents/work/Initiation/quick-retry/main.rb"

# Connexions (VPN & VM 42)
alias vpn="sudo openvpn --config ~/Documents/VPN/nat-UDP4-1194-achille-config.ovpn"
alias 42vm="kitty +kitten ssh -i ~/Documents/important_key/ssh_key -p 4222 ansible@PointsForProjects.42lehavre.fr"
alias n8n="kitty +kitten ssh -i ~/Documents/important_key/ssh_key -p 4222 ansible@n8n.42lehavre.fr"
alias cluster="kitty +kitten ssh -i ~/Documents/important_key/ssh_key -p 4222 ansible@ansiblecluster.42lehavre.fr"
alias 42vmdb="kitty +kitten ssh -i ~/Documents/important_key/ssh_key -p 4222 -L 8000:localhost:8000 ansible@pointsforprojects.42lehavre.fr"
alias ldap="kitty +kitten ssh -i ~/Documents/important_key/ssh_key -p 4222 ansible@ldap.42lehavre.fr"


# ==============================================================================
# 5. FONCTIONS CUSTOM
# ==============================================================================

# Extraction automatique d'archives
extract() {
    if [ -f $1 ] ; then
        case $1 in
            *.tar.bz2)   tar xjf $1     ;;
            *.tar.gz)    tar xzf $1     ;;
            *.bz2)       bunzip2 $1     ;;
            *.rar)       unrar x $1     ;;
            *.gz)        gunzip $1      ;;
            *.tar)       tar xf $1      ;;
            *.tbz2)      tar xjf $1     ;;
            *.tgz)       tar xzf $1     ;;
            *.zip)       unzip $1       ;;
            *.Z)         uncompress $1  ;;
            *.7z)        7z x $1        ;;
            *)           echo "'$1' ne peut pas être extrait via extract()" ;;
        esac
    else
        echo "'$1' n'est pas un fichier valide"
    fi
}

# Chercher un fichier et l'ouvrir directement dans Vim
fo() {
    local file
    file=$(fzf --preview 'bat --style=numbers --color=always --line-range :500 {}') && vi "$file"
}

# Créer et activer un venv Python instantanément
mkenv() {
    python3 -m venv .venv && source .venv/bin/activate && pip install --upgrade pip
}

# Créer un dossier ET entrer dedans directement
# Plus besoin de faire 'mkdir super-projet' puis 'cd super-projet'
mkcd() {
    mkdir -p "$1" && cd "$1"
}

# Connaître instantanément ton IP publique et locale
alias myip="echo 'Interne: ' && hostname -I | awk '{print $1}' && echo 'Publique: ' && curl -s ifconfig.me && echo ''"

# Générer un mot de passe aléatoire et sécurisé de 20 caractères (sans fioritures)
alias genpass="openssl rand -base64 15"

# Un 'grep' amélioré qui affiche les numéros de ligne et de la couleur par défaut
alias grep="grep --color=auto -n"

# Sauvegarde rapide : Ajoute tout, commit avec le message de ton choix, et push
# Utilisation : gsave "Correction bug typo"
gsave() {
    git add -A && git commit -m "$1" && git push
}

# Revenir en arrière proprement (Annuler le dernier commit mais GARDER les modifications dans ton éditeur)
alias undo="git reset --soft HEAD~1"

# Nettoyer les branches locales qui ont été fusionnées et supprimées sur GitHub/GitLab
alias git-clean="git fetch -p && git branch -vv | awk '/: gone]/ {print \$1}' | xargs -r git branch -d"

# Voir la taille des dossiers du répertoire courant triés par taille (via lsd)
# Idéal pour voir ce qui prend de la place en un coup d'œil
alias du-folders="lsd -lh --total-size"

# Partager rapidement un fichier depuis ton terminal
# Ça génère un lien de téléchargement temporaire (valide 14 jours)
# Utilisation : share mon_rapport.pdf
share() {
    curl --upload-file "$1" https://transfer.sh/$(basename "$1") && echo ""
}

# Redémarrer Kitty proprement sans fermer toutes tes fenêtres en cours (Reload config)
alias kitty-reload="kill -SIGUSR1 $(pgrep kitty)"

# ==============================================================================
# 6. OVERRIDES ET FORCE-PASS (Placé à la fin pour bloquer Oh My Zsh)
# ==============================================================================

# Horloge à droite du terminal (Heure:Minute:Seconde)
RPROMPT='%F{242}%*%f'

# Force Zsh à corriger automatiquement SANS demander la confirmation [nyae]
unsetopt correct
setopt correct_all
