#!/usr/bin/env bash
#
# Скрипт для очистки системных логов
# Требует права root
#

set -eo pipefail

if [[ "$1" == "-h" || "$1" == "--help" ]]; then
    cat <<EOF
Usage: $(basename "$0") [-h] [1|2|3]

Clean system logs and data to free some space on system disk.

Options:
    -h, --help    Show this help message
    1|2|3         Safe, normal or aggressive clean level

EOF
    exit 0
fi

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

log_info()  { echo -e "${GREEN}[INFO]${NC} $*"; }
log_warn()  { echo -e "${YELLOW}[WARN]${NC} $*"; }
log_error() { echo -e "${RED}[ERROR]${NC} $*"; }

show_size() {
    local path="$1"
    sudo du -sh "$path" 2>/dev/null | awk '{print $1}'
}

# Показываем текущее использование
log_info "Текущее использование:"
df -hx tmpfs
echo

log_info "По директориям:"
sudo du -h --max-depth=0 \
    /var/log/ \
    /var/cache/apt/ \
    /var/lib/docker/ \
    "$HOME"/.local/share/Trash/files/ \
    "$HOME"/.cache/thumbnails/ \
    2>/dev/null \
    | sort -rh
echo

choice="$1"
if [ -z "$choice" ]; then
    echo "Выберите режим очистки:"
    echo "    1) Безопасный"
    echo "    2) Средний"
    echo "    3) Агрессивный"
    echo
    read -rp "Выбор [1-3]: " choice
    echo
fi

case "$choice" in
    1)
        log_info "Выбран безопасный (1) режим..."
        set -x
        sudo journalctl --vacuum-size=100M
        sudo find /var/log -name "*.gz" -mtime +7 -delete 2>/dev/null || true
        sudo find /var/log -name "*.log.*" -mtime +7 -delete 2>/dev/null || true
        [ -d "$HOME"/.local/share/Trash/files/ ] && sudo rm -rfv "$HOME"/.local/share/Trash/files/*
        [ -d "$HOME"/.cache/thumbnails/ ] && sudo rm -rfv "$HOME"/.cache/thumbnails/*
        set +x
        ;;
    2)
        log_info "Выбран средний (2) режим..."
        set -x
        sudo journalctl --vacuum-size=50M
        sudo find /var/log -name "*.gz" -mtime +3 -delete 2>/dev/null || true
        sudo find /var/log -name "*.log.*" -mtime +3 -delete 2>/dev/null || true
        sudo find /var/log -name "dpkg.log.*" -mtime +3 -delete 2>/dev/null || true
        [ -d "$HOME"/.local/share/Trash/files/ ] && sudo rm -rfv "$HOME"/.local/share/Trash/files/* 2>/dev/null || true
        [ -d "$HOME"/.cache/thumbnails/ ] && sudo rm -rfv "$HOME"/.cache/thumbnails/* 2>/dev/null || true
        sudo rm -rfv /var/cache/apt/archives/*.deb 2>/dev/null || true
        sudo apt clean 2>/dev/null || true
        set +x
        ;;
    3)
        log_info "Выбран агрессивный (3) режим!"
        read -rp "Продолжить? (y|yes|n|no): " confirm
        if [[ "$confirm" != "yes" ]] && [[ "$confirm" != "y" ]]; then
            log_info "Отменено"
            exit 0
        fi

        set -x
        sudo journalctl --vacuum-time=1d
        sudo find /var/log -name "*.gz" -delete 2>/dev/null || true
        sudo find /var/log -name "*.log.*" -delete 2>/dev/null || true
        sudo rm -rfv /var/log/journal/user-*@* 2>/dev/null || true
        sudo rm -rfv /var/log/journal/system*@* 2>/dev/null || true
        sudo rm -fv /var/log/{syslog,dmesg,btmp}.* 2>/dev/null || true
        sudo apt autoremove --purge
        sudo apt autoclean
        sudo apt clean
        sudo rm -rfv /var/cache/apt/archives/* 2>/dev/null || true
        hash docker && docker system prune -f
        snap list 2>/dev/null && snap refresh --list 2>/dev/null || true
        sudo snap list --all \
            | awk '/disabled/{print $1, $3}' \
            | while read snapname revision; do
                    sudo snap remove "$snapname" --revision="$revision"
                done
        set +x
        ;;
    *)
        log_error "Неверный выбор"
        exit 1
        ;;
esac

echo
log_info "Очистка завершена!"
log_info "Текущее использование:"
df -hx tmpfs
echo

log_info "По директориям:"
sudo du -h --max-depth=0 \
    /var/log/ \
    /var/cache/apt/ \
    /var/lib/docker/ \
    "$HOME"/.local/share/Trash/files/ \
    "$HOME"/.cache/thumbnails/ \
    2>/dev/null \
    | sort -rh
