#!/bin/bash
# apt-freshing.sh - Debian/Ubuntu rendszerfrissítő és karbantartó szkript
# Használat: sudo ./apt-freshing.sh

set -euo pipefail

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

print_header()   { echo -e "\n${BLUE}=== $1 ===${NC}"; }
print_success()  { echo -e "${GREEN}✓ $1${NC}"; }
print_warning()  { echo -e "${YELLOW}⚠ $1${NC}"; }
print_error()    { echo -e "${RED}✗ $1${NC}"; exit 1; }

# ────────────────────────────────────────────────
# Rendszer ellenőrzések
# ────────────────────────────────────────────────

print_header "Rendszer ellenőrzése"

# Debian/Ubuntu ellenőrzés
if ! command -v apt >/dev/null 2>&1; then
    print_error "Ez a szkript csak Debian/Ubuntu rendszereken fut!"
fi

(( EUID == 0 )) || print_error "Kérlek sudo-val futtasd!\nHasználat: sudo $0"

print_success "Rendszer ellenőrzése sikeres"

# ────────────────────────────────────────────────
# Internet ellenőrzés
# ────────────────────────────────────────────────

print_header "Internet kapcsolat ellenőrzése"

SKIP_UPDATE=false
if ping -c 1 -W 2 8.8.8.8 >/dev/null 2>&1; then
    print_success "Internet kapcsolat aktív"
else
    print_warning "Nincs internet kapcsolat → frissítés kihagyva"
    SKIP_UPDATE=true
fi

# ────────────────────────────────────────────────
# APT források ellenőrzése
# ────────────────────────────────────────────────

print_header "APT források ellenőrzése"

if ! $SKIP_UPDATE; then
    SOURCES_FOUND=false
    
    # Ellenőrizzük a fő sources.list fájlt
    if grep -q "^deb " /etc/apt/sources.list 2>/dev/null; then
        SOURCES_FOUND=true
        print_success "Forrás található: /etc/apt/sources.list"
    fi
    
    # Ellenőrizzük a sources.list.d könyvtárat - .list fájlok
    if compgen -G "/etc/apt/sources.list.d/*.list" > /dev/null; then
        if grep -q "^deb " /etc/apt/sources.list.d/*.list 2>/dev/null; then
            SOURCES_FOUND=true
            print_success "Forrás található: /etc/apt/sources.list.d/*.list"
        fi
    fi
    
    # Ellenőrizzük a sources.list.d könyvtárat - .sources fájlok (új Debian forma)
    if compgen -G "/etc/apt/sources.list.d/*.sources" > /dev/null; then
        if grep -q "^Types: deb" /etc/apt/sources.list.d/*.sources 2>/dev/null || \
           grep -q "^deb " /etc/apt/sources.list.d/*.sources 2>/dev/null; then
            SOURCES_FOUND=true
            print_success "Forrás található: /etc/apt/sources.list.d/*.sources"
        fi
    fi
    
    if ! $SOURCES_FOUND; then
        print_warning "Nincsenek APT források konfigurálva!"
    fi
    
    # Forrásfájlok listázása
    echo -e "\n${BLUE}Aktív APT források:${NC}"
    if [[ -f /etc/apt/sources.list ]]; then
        echo "  /etc/apt/sources.list"
    fi
    if compgen -G "/etc/apt/sources.list.d/*.list" > /dev/null; then
        for f in /etc/apt/sources.list.d/*.list; do
            if grep -q "^deb " "$f" 2>/dev/null; then
                echo "  $f"
            fi
        done
    fi
    if compgen -G "/etc/apt/sources.list.d/*.sources" > /dev/null; then
        for f in /etc/apt/sources.list.d/*.sources; do
            if grep -q "^Types: deb" "$f" 2>/dev/null || grep -q "^deb " "$f" 2>/dev/null; then
                echo "  $f"
            fi
        done
    fi
    echo ""
    
else
    print_warning "APT forrás ellenőrzés kihagyva (nincs internet)"
fi

# ────────────────────────────────────────────────
# 1. Rendszerfrissítés
# ────────────────────────────────────────────────

print_header "1. Rendszerfrissítés (apt)"

UPDATE_SUCCESS=false

if ! $SKIP_UPDATE; then
    echo "Frissítési források szinkronizálása..."
    if sudo apt update -y; then
        print_success "APT update sikeres"
        
        echo -e "\n${BLUE}Frissíthető csomagok száma:${NC}"
        # Csak a tényleges csomagokat számoljuk, a fejlécet kihagyjuk
        upgradable_list=$(apt list --upgradable 2>/dev/null | grep -v "^Listing" | grep -v "^Felsorolás" | grep -v "^$" || true)
        if [[ -n "$upgradable_list" ]]; then
            upgradable_count=$(echo "$upgradable_list" | wc -l)
            echo "$upgradable_count"
            echo ""
            echo "Frissíthető csomagok:"
            echo "$upgradable_list" | sed 's/^/  /'
            echo ""
        else
            echo "0"
            echo ""
            print_success "Minden csomag naprakész!"
        fi
        
        echo "Csomagok frissítése..."
        if sudo apt upgrade -y; then
            print_success "APT upgrade sikeres"
            
            echo "Teljes frissítés (full-upgrade)..."
            if sudo apt full-upgrade -y; then
                print_success "APT full-upgrade sikeres"
                UPDATE_SUCCESS=true
            else
                print_warning "Full-upgrade sikertelen (lehet, hogy nincs szükség rá)"
                UPDATE_SUCCESS=true
            fi
        else
            print_error "Rendszerfrissítés sikertelen"
        fi
    else
        print_error "APT update sikertelen"
    fi
else
    print_warning "Frissítés kihagyva (nincs internet)"
fi

# ────────────────────────────────────────────────
# 2. Snap frissítés (opcionális)
# ────────────────────────────────────────────────

print_header "2. Snap csomagok frissítése"

if command -v snap >/dev/null 2>&1; then
    if ! $SKIP_UPDATE; then
        echo "Snap csomagok frissítése..."
        if sudo snap refresh 2>/dev/null; then
            print_success "Snap csomagok frissítve"
        else
            print_warning "Snap frissítés sikertelen (nincs snap vagy hiba történt)"
        fi
    else
        print_warning "Snap frissítés kihagyva (nincs internet)"
    fi
else
    print_success "Snap nem telepítve → kihagyva"
fi

# ────────────────────────────────────────────────
# 3. Elavult csomagok és függőségek
# ────────────────────────────────────────────────

print_header "3. Elavult csomagok és függőségek kezelése"

echo "Nem használt függőségek eltávolítása..."
if sudo apt autoremove --purge -y 2>/dev/null; then
    print_success "Nem használt függőségek eltávolítva"
else
    print_warning "Autoremove sikertelen vagy nincs teendő"
fi

echo "APT gyorsítótár tisztítása..."
if sudo apt autoclean -y 2>/dev/null; then
    print_success "APT autoclean kész"
else
    print_warning "Autoclean sikertelen"
fi

if sudo apt clean -y 2>/dev/null; then
    print_success "APT clean kész"
else
    print_warning "Clean sikertelen"
fi

# ────────────────────────────────────────────────
# 4. APT cache intelligens tisztítása
# ────────────────────────────────────────────────

print_header "4. APT cache intelligens tisztítása"

if command -v apt-get >/dev/null 2>&1; then
    # Ellenőrizzük a cache méretét
    cache_size=$(du -sh /var/cache/apt/archives 2>/dev/null | cut -f1 || echo "ismeretlen")
    echo "Aktuális cache méret: $cache_size"
    
    # Csak az utolsó 3 verziót tartjuk meg
    find /var/cache/apt/archives -name "*.deb" -type f -printf "%T@ %p\n" 2>/dev/null | \
        sort -n | head -n -3 2>/dev/null | cut -d' ' -f2- | xargs rm -f 2>/dev/null || true
    print_success "Cache intelligens tisztítva (3 verzió megtartva)"
else
    print_warning "apt-get nem található → cache tisztítás kihagyva"
fi

# ────────────────────────────────────────────────
# 5. Journald naplók
# ────────────────────────────────────────────────

print_header "5. Journald naplók takarítása"

if command -v journalctl >/dev/null 2>&1; then
    if df /var/log >/dev/null 2>&1; then
        free_mb=$(df -BM /var/log | awk 'NR==2 {print substr($4,1,length($4)-1)}' || echo "0")
        
        if (( free_mb < 1024 )); then
            print_warning "Kevés hely a /var/log-on (${free_mb} MiB)"
            journalctl --vacuum-size=200M
            print_success "Naplók 200 MB-ra csökkentve"
        else
            journalctl --vacuum-time=2weeks
            print_success "2 hétnél régebbi naplók törölve"
        fi
        
        journalctl --rotate 2>/dev/null || true
        journalctl --verify >/dev/null 2>&1 && print_success "Naplók sértetlensége OK" || print_warning "Napló ellenőrzés sikertelen"
    else
        print_warning "/var/log nem elérhető → naplótakarítás kihagyva"
    fi
else
    print_success "Journald nem telepítve → kihagyva"
fi

# ────────────────────────────────────────────────
# 6. Felhasználói cache
# ────────────────────────────────────────────────

print_header "6. Felhasználói cache ürítése"

if [[ -n "${SUDO_USER:-}" && "$SUDO_USER" != "root" && -d "/home/$SUDO_USER/.cache" ]]; then
    user="$SUDO_USER"
    cache_dir="/home/$user/.cache"
    
    old_size=$(du -sh "$cache_dir" 2>/dev/null | cut -f1 || echo "ismeretlen")
    
    echo "Felhasználó: $user    Cache méret: $old_size"
    
    # 30 napnál régebbi fájlok
    find "$cache_dir" -type f -atime +30 -delete 2>/dev/null || true
    
    # Böngésző cache – csak ha nem fut
    for browser in "mozilla/firefox" "google-chrome" "chromium" "brave-browser" "vivaldi"; do
        bdir="$cache_dir/$browser"
        [[ -d "$bdir" ]] || continue
        if ! pgrep -u "$user" -f "$browser" >/dev/null 2>&1; then
            find "$bdir" -type f -atime +7 -delete 2>/dev/null || true
        fi
    done
    
    # Thumbnail cache teljes törlése
    rm -rf "$cache_dir/thumbnails/"* 2>/dev/null || true
    
    # Pip cache törlése
    rm -rf "$cache_dir/pip" 2>/dev/null || true
    
    # npm cache törlése
    rm -rf "$cache_dir/npm" 2>/dev/null || true
    
    new_size=$(du -sh "$cache_dir" 2>/dev/null | cut -f1 || echo "ismeretlen")
    print_success "Cache csökkentve: $old_size → $new_size"
else
    print_warning "Felhasználói cache tisztítás kihagyva (root vagy nincs home/.cache)"
fi

# ────────────────────────────────────────────────
# 7. Újraindítás szükséges?
# ────────────────────────────────────────────────

print_header "7. Újraindítás szükséges?"

reboot_needed=false

# Ellenőrizzük, hogy van-e /var/run/reboot-required fájl
if [[ -f /var/run/reboot-required ]]; then
    print_warning "Rendszer újraindítás szükséges!"
    
    if [[ -f /var/run/reboot-required.pkgs ]]; then
        echo "Újraindítást igénylő csomagok:"
        cat /var/run/reboot-required.pkgs 2>/dev/null | sed 's/^/  - /' || true
    fi
    
    echo
    read -n1 -rp "Újraindítod most? [i/N] " ans
    echo
    if [[ "${ans:-}" =~ ^[Ii]$ ]]; then
        reboot_needed=true
    fi
else
    print_success "Nincs szükség újraindításra"
fi

echo

# ────────────────────────────────────────────────
# 8. Rendszerinformáció
# ────────────────────────────────────────────────

print_header "Rendszerinformáció"

if command -v lsb_release >/dev/null 2>&1; then
    echo "Disztribúció: $(lsb_release -ds 2>/dev/null || echo "ismeretlen")"
fi

echo "Kernel: $(uname -r)"
echo "Architektúra: $(uname -m)"
echo "CPU: $(grep -m1 "model name" /proc/cpuinfo | cut -d':' -f2 | sed 's/^ //' || echo "ismeretlen")"
echo "Memória: $(free -h | awk '/^Mem:/ {print $2}')"
echo "Szabad hely: $(df -h / | awk 'NR==2 {print $4}')"

# ────────────────────────────────────────────────
# Összefoglaló
# ────────────────────────────────────────────────

print_header "KARBANTARTÁS BEFEJEZVE"

echo -e "${GREEN}A rendszer karbantartva!${NC}"
echo "Összefoglaló:"
echo -e "  Rendszerfrissítés     : $( $UPDATE_SUCCESS  && echo "${GREEN}sikeres${NC}" || echo "${YELLOW}kihagyva / sikertelen${NC}" )"
echo -e "  Snap frissítés        : ${GREEN}kezelve${NC}"
echo -e "  Elavult csomagok      : ${GREEN}kezelve${NC}"
echo -e "  Cache tisztítás       : ${GREEN}kész${NC}"
echo -e "  Naplók takarítása     : ${GREEN}kész${NC}"
echo -e "  Felhasználói cache    : ${GREEN}kész${NC}"
echo -e "  Reboot..........      : $( $reboot_needed && echo "${YELLOW}szükséges${NC}" || echo "${GREEN}nem szükséges${NC}" )"
echo
echo -e "${BLUE}Keep it simple, keep it clean!${NC}\n"

read -rp "Kilépéshez nyomj ENTER-t..."

if $reboot_needed; then
    exec reboot
fi
