#!/usr/bin/env bash
# ================================================
# Oh My Zsh universal setup script
# Obsługuje: Ubuntu, Debian, Raspbian, Rocky,
#            AlmaLinux, RHEL, Fedora, CentOS
# Użycie: curl -fsSL <url> | bash
# ================================================
set -euo pipefail

GREEN='\033[0;32m'
BLUE='\033[0;34m'
YELLOW='\033[1;33m'
RED='\033[0;31m'
NC='\033[0m'

info()    { echo -e "${BLUE}ℹ️  $*${NC}"; }
success() { echo -e "${GREEN}✅ $*${NC}"; }
warn()    { echo -e "${YELLOW}⚠️  $*${NC}"; }
error()   { echo -e "${RED}❌ $*${NC}"; exit 1; }

ARCH=$(uname -m)

# ─── Funkcje pomocnicze ──────────────────────────────────────────────────────

is_debian_family() {
    [[ "$OS" =~ ^(debian|ubuntu|raspbian|linuxmint|pop)$ ]] || \
    [[ "$OS_LIKE" =~ debian ]]
}

is_rhel_family() {
    [[ "$OS" =~ ^(rhel|centos|rocky|almalinux|fedora|ol)$ ]] || \
    [[ "$OS_LIKE" =~ (rhel|fedora) ]]
}

install_eza_binary() {
    if command -v eza >/dev/null 2>&1; then
        success "eza już zainstalowana"
        return
    fi

    info "Instalacja eza z GitHub releases..."

    case "$ARCH" in
        x86_64)        EZA_ARCH="x86_64-unknown-linux-gnu" ;;
        aarch64|arm64) EZA_ARCH="aarch64-unknown-linux-gnu" ;;
        armv7l)        EZA_ARCH="armv7-unknown-linux-gnueabihf" ;;
        *)             warn "Nieznana architektura: $ARCH, pomijam eza"; return ;;
    esac

    EZA_URL="https://github.com/eza-community/eza/releases/latest/download/eza_${EZA_ARCH}.tar.gz"
    TMP=$(mktemp -d)

    if curl -fsSL "$EZA_URL" -o "$TMP/eza.tar.gz"; then
        tar -xzf "$TMP/eza.tar.gz" -C "$TMP"
        sudo mv "$TMP/eza" /usr/local/bin/eza
        sudo chmod +x /usr/local/bin/eza
        success "eza zainstalowana → /usr/local/bin/eza"
    else
        warn "Nie udało się pobrać eza – aliasy ls będą fallback"
    fi
    rm -rf "$TMP"
}

clone_if_missing() {
    local dir="$1" repo="$2"
    if [ ! -d "$dir" ]; then
        git clone --depth=1 "$repo" "$dir"
        success "Zainstalowano: $(basename "$dir")"
    else
        success "Już istnieje: $(basename "$dir")"
    fi
}

# ─── 1. Wykrywanie OS ────────────────────────────────────────────────────────
if [ -f /etc/os-release ]; then
    . /etc/os-release
    OS="${ID:-unknown}"
    OS_LIKE="${ID_LIKE:-}"
    VER="${VERSION_ID:-0}"
else
    error "Nie można rozpoznać systemu – brak /etc/os-release"
fi

info "System: $OS $VER ($ARCH) | user: $USER | home: $HOME"

# ─── 2. Instalacja pakietów ──────────────────────────────────────────────────
info "Instalacja zależności..."

if is_debian_family; then
    sudo apt-get update -qq
    sudo apt-get install -y zsh curl git bat 2>/dev/null || true
    if command -v batcat >/dev/null 2>&1 && ! command -v bat >/dev/null 2>&1; then
        sudo ln -sf "$(command -v batcat)" /usr/local/bin/bat
        success "Symlink batcat → /usr/local/bin/bat"
    fi
    install_eza_binary

elif is_rhel_family; then
    if [[ "$OS" == "fedora" ]]; then
        sudo dnf install -y zsh curl git bat eza 2>/dev/null || true
    else
        sudo dnf install -y epel-release 2>/dev/null || true
        sudo dnf install -y zsh curl git bat 2>/dev/null || true
        if ! sudo dnf install -y eza 2>/dev/null; then
            warn "eza nie w repo, instaluję z GitHub..."
            install_eza_binary
        fi
    fi
else
    error "Nieobsługiwany system: $OS"
fi

# ─── 3. Rejestracja zsh w /etc/shells ───────────────────────────────────────
ZSH_BIN=$(command -v zsh)
if ! grep -qx "$ZSH_BIN" /etc/shells 2>/dev/null; then
    echo "$ZSH_BIN" | sudo tee -a /etc/shells >/dev/null
    success "Dodano $ZSH_BIN do /etc/shells"
fi

# ─── 4. Oh My Zsh ────────────────────────────────────────────────────────────
# Sprawdzamy plik oh-my-zsh.sh, nie sam katalog (katalog custom może być pusty)
if [ ! -f "$HOME/.oh-my-zsh/oh-my-zsh.sh" ]; then
    info "Instalacja Oh My Zsh..."
    rm -rf "$HOME/.oh-my-zsh"
    RUNZSH=no CHSH=no \
        sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"
    success "Oh My Zsh zainstalowany"
else
    success "Oh My Zsh już istnieje, pomijam"
fi

# ─── 5. Pluginy ──────────────────────────────────────────────────────────────
ZSH_CUSTOM="${ZSH_CUSTOM:-$HOME/.oh-my-zsh/custom}"
info "Pobieranie pluginów..."

clone_if_missing "$ZSH_CUSTOM/plugins/zsh-autosuggestions" \
    "https://github.com/zsh-users/zsh-autosuggestions"

clone_if_missing "$ZSH_CUSTOM/plugins/zsh-syntax-highlighting" \
    "https://github.com/zsh-users/zsh-syntax-highlighting"

# ─── 6. Generowanie .zshrc ───────────────────────────────────────────────────
info "Nadpisywanie ~/.zshrc..."

cat > ~/.zshrc << 'EOF'
export ZSH="$HOME/.oh-my-zsh"
ZSH_THEME="ys"
plugins=(git zsh-autosuggestions zsh-syntax-highlighting)
source $ZSH/oh-my-zsh.sh

# ── ls / ll ──────────────────────────────────────────────────────────────────
if command -v eza >/dev/null 2>&1; then
    alias ls='eza --icons --group-directories-first'
    alias ll='eza -lgh --icons --group-directories-first'
    alias la='eza -lagh --icons --group-directories-first'
    alias l='eza -1 --icons'
else
    alias ls='ls --color=auto'
    alias ll='ls -alF'
    alias la='ls -A'
fi

# ── cat → bat ────────────────────────────────────────────────────────────────
if command -v bat >/dev/null 2>&1; then
    alias cat='bat --style=plain'
elif command -v batcat >/dev/null 2>&1; then
    alias cat='batcat --style=plain'
fi

alias grep='grep --color=auto'

# ── Historia ─────────────────────────────────────────────────────────────────
export HISTFILE=$HOME/.zsh_history
export HISTSIZE=50000
export SAVEHIST=50000
setopt APPEND_HISTORY
setopt EXTENDED_HISTORY
setopt INC_APPEND_HISTORY
setopt HIST_FIND_NO_DUPS
setopt HIST_IGNORE_DUPS
EOF

success "~/.zshrc zapisany"

# ─── 7. Zmiana domyślnej powłoki ─────────────────────────────────────────────
if [ "$SHELL" != "$ZSH_BIN" ]; then
    info "Zmiana domyślnej powłoki na zsh dla $USER..."
    if sudo chsh -s "$ZSH_BIN" "$USER" 2>/dev/null; then
        success "Powłoka zmieniona na $ZSH_BIN"
    elif sudo usermod -s "$ZSH_BIN" "$USER" 2>/dev/null; then
        success "Powłoka zmieniona przez usermod"
    else
        warn "Zmień ręcznie: chsh -s $ZSH_BIN $USER"
    fi
else
    success "Domyślna powłoka to już zsh"
fi

echo ""
echo -e "${BLUE}✨ Gotowe! Wpisz 'zsh' lub zaloguj się ponownie.${NC}"
