#!/bin/bash
# 确保脚本具有执行权限
[[ ! -x "$0" ]] && chmod +x "$0" && exec "$0" "$@"
# 获取真实用户目录
USER_HOME=$(getent passwd ${SUDO_USER:-$USER} 2>/dev/null | cut -d: -f6)
if [[ -z "$USER_HOME" ]]; then
  echo "错误：无法确定用户主目录。"
  exit 1
fi
# 颜色定义 
RED='\033[0;31m' 
GREEN='\033[0;32m' 
YELLOW='\033[33m'
BLUE='\033[0;34m' 
NC='\033[0m' # No Color 
# 桌面通知函数 
notify() { 
    local title="$1" 
    local message="$2" 
    local level="$3" 
    local icon="${4:-}"  # 可选参数：图标路径
     
    case "$level" in 
        "success") 
            color="$GREEN" 
            urgency="normal" 
            ;; 
        "warning") 
            color="$BLUE" 
            urgency="normal" 
            ;; 
         "wrong") 
            color="$YELLOW" 
            urgency="normal" 
            ;;              
        "error") 
            color="$RED" 
            urgency="critical" 
            ;; 
        *) 
            color="$NC" 
            urgency="normal" 
            ;; 
    esac 
 
    echo -e "${color}${message}${NC}" 
    # 带图标和不带图标的两种调用方式
    if [[ -n "$icon" ]]; then
        notify-send -u "$urgency" -i "$icon" "$title" "$message" 2>/dev/null || true
    else
        notify-send -u "$urgency" "$title" "$message" 2>/dev/null || true
    fi
} 

# 检测软件是否有新版本
PACKAGE_NAME="system-cleaning"
GITEE_REPO="https://gitee.com/seeker_ok/${PACKAGE_NAME}"
LOCAL_VERSION=$(dpkg-query -W --showformat='${Version}' ${PACKAGE_NAME} 2>/dev/null)
# 获取远程版本号
REMOTE_CONTROL=$(curl -sL "${GITEE_REPO}/raw/master/DEBIAN/control")
REMOTE_VERSION=$(echo "$REMOTE_CONTROL" | grep 'Version:' | awk '{print $2}')
# 版本比较函数
version_compare() {
  if [ "$1" = "$2" ]; then
    return 0
  fi
  local IFS=.
  local i ver1=($1) ver2=($2)
  for ((i=${#ver1[@]}; i<${#ver2[@]}; i++)); do
    ver1[i]=0
  done
  for ((i=0; i<${#ver1[@]}; i++)); do
    if [[ -z ${ver2[i]} ]]; then
      ver2[i]=0
    fi
    if ((10#${ver1[i]} > 10#${ver2[i]})); then
      return 1
    fi
    if ((10#${ver1[i]} < 10#${ver2[i]})); then
      return 2
    fi
  done
  return 0
}

if version_compare "$LOCAL_VERSION" "$REMOTE_VERSION"; then
  : # 本地版本与远程版本相同，不执行任何操作
elif [ $? -eq 1 ]; then
  echo -e "${wrong}本地版本 ${LOCAL_VERSION} 比远程版本 ${REMOTE_VERSION} 新${NC}"
else
  echo -e "${GREEN}发现${PACKAGE_NAME}有新版本 ${REMOTE_VERSION}，是否更新？[Yy/N]${NC}"
  read -p " " choice
  if [[ "$choice" = "y" || "$choice" = "Y" ]]; then
    DEB_URL="${GITEE_REPO}/raw/master/${PACKAGE_NAME}_${REMOTE_VERSION}_all.deb"
    x-terminal-emulator -e "bash -c \"
      echo -e '${GREEN}正在下载并安装新版本,请稍等...${NC}';
      wget -q ${DEB_URL} -O /tmp/${PACKAGE_NAME}.deb && 
      sudo apt install -y /tmp/${PACKAGE_NAME}.deb && 
      rm -rf /tmp/${PACKAGE_NAME}.deb;
      echo -e '${GREEN}软件已更新至 ${REMOTE_VERSION}，请关闭窗口重新运行${NC}';
      read -p $'${BLUE} 按任意键关闭此窗口...${NC}' \""
    exit 1
  fi
fi

# 捕获中断信号
trap 'echo -e "\n\033[31m操作被中断！\033[0m"; exit 1' INT TERM
echo -ne "\e]2;系统深度清理\a"
# 模式选择
  echo -e "${GREEN}选择操作模式 [A]uto(自动处理) 或 [M]anual（手工处理）? [A/M]${NC}"
read -p " " mode
case "$mode" in
  [aA]*)
    AUTO_MODE=true
    ;;
  [mM]*)
    AUTO_MODE=false
    ;;
  *)
    echo "无效的选择，退出脚本。"
    exit 1
    ;;
esac

confirm_deletion() {
  local file="$1"
  if [[ "$AUTO_MODE" = true ]]; then
    echo "自动模式: 删除 $file"
    return 0
  fi
  if [[ -e "$file" || -L "$file" ]]; then
    read -p "文件 '$file' 存在，是否删除？ [Yy/n] " confirm
    if [[ "$confirm" != "y" && "$confirm" != "Y" ]]; then
      echo "跳过删除 $file"
      return 1
    fi
  else
    echo "文件 '$file' 不存在，跳过"
    return 1
  fi
  return 0
}

delete_file() {
  local file="$1"
  echo "准备删除: $file"
  if confirm_deletion "$file"; then
    sudo rm -rfv "$file"
  fi
}

delete_files_in_pattern() {
  local pattern="$1"
  files=($pattern)
  for file in "${files[@]}"; do
    delete_file "$file"
  done
}
# 用户确认
if [[ "$AUTO_MODE" = false ]]; then
  echo -e "\033[31m警告：此操作将删除系统缓存和日志文件！\033[0m"
  read -p "即将执行系统清理操作，如同意删除所有内容，则继续？[Yy/N] " confirm
  if [[ "$confirm" != "y" && "$confirm" != "Y" ]]; then
    echo -e "\033[32m操作已取消\033[0m"
    exit 0
  fi
fi

sudo echo -e "\n\033[31m开始清理，请稍等。。。\033[0m"

confirm_deletion_and_delete() {
  local command="$1"
  echo "自动模式:准备执行: $command"
  if [[ "$AUTO_MODE" = false ]]; then
    read -p "是否确认执行上述命令？ [Y/n] " confirm
    if [[ "$confirm" != "y" && "$confirm" != "Y" ]]; then
      echo "跳过执行命令"
      return
    fi
  fi
  eval "$command"
}
# ======================
# 1. APT缓存清理
# ======================
echo -e "\n\033[34m[1/8] 清理APT缓存...\033[0m"
log_paths=(
  "/var/cache/apt/archives/*"
  "/var/cache/kylin-system-updater/*"
 "/var/lib/apt/lists/lock*" #删除系统底层安装器锁
  "/var/lib/dpkg/lock-frontend"
  "/var/lib/dpkg/lock"
)
shopt -s nullglob
for pattern in "${log_paths[@]}"; do
  delete_files_in_pattern "$pattern"
done
shopt -u nullglob
# ======================
# 2. 系统日志清理
# ======================
echo -e "\n\033[34m[2/8] 清理系统日志...\033[0m"
log_paths=(
    "/var/log/syslog*"
    "/var/log/backup.log"     #删除备份日志
    "/var/log/apt/*.log"
    "/var/log/dpkg.log"   #删除dpkg安装日志
   "/var/log/kylin-*.log"
    "/var/log/wpslog/*.log"  #删除wpslog安装日志
    "/var/log/audit/*"
    "/var/log/*.log*"
    "/var/log/lightdm/*.log*"
    "/var/log/samba/*.log*"
    "/var/log/dmesg"
    "/var/log/dmesg"           # 内核日志 
    "/var/log/kern.log*"       # 内核环形日志
    "/var/log/auth.log*"       # 认证日志
    "/var/log/cron.log*"       # 定时任务日志    
    "/var/log/kylin-software-properties/*"
    "/tmp/*.png"
    "/tmp/*.log"
    "/var/log/deepin/*.log"       # Deepin系统日志
    "/var/log/uos/*.log"          # UOS系统日志
    "/var/log/plasma-workspace/*.log"  # KDE桌面日志 
    "/var/log/kylin/*.log"        # 麒麟系统日志
    "/var/log/kylin-installer.log"  # 安装日志 
    "/var/log/upstart/*.log"   # Upstart日志（兼容旧系统）    
)
shopt -s nullglob
for pattern in "${log_paths[@]}"; do
  delete_files_in_pattern "$pattern"
done
shopt -u nullglob
# ======================
# 3. 第三方应用清理
# ======================
echo -e "\n\033[34m[3/8] 清理第三方应用...\033[0m"
app_paths=(
    "/opt/.unisandbox_*.img"
    "/opt/qaxsafe/Log/*"
    "/opt/apps-*/debs/*"
    "/opt/apps/spark-store/files/*.{deb,xz}"
    "/opt/exagear/images/*"
    "/opt/gcc-arm-10.3-2021.07-*"
    "/opt/deepin/Cache/*"         # Deepin软件缓存
    "/opt/uos/Cache/*"            # UOS软件缓存
    "/opt/software-center/cache/*"    # 软件中心缓存    
    "/opt/kylin/kylin-installer/logs/*"  # 麒麟安装程序日志
    "/opt/Deepin/SoftwareCenter/cache/*",  # Deepin软件中心缓存
    "/opt/uos/Deepin/AppStore/cache/*",    # UOS应用商店缓存
    "/opt/kylin/kylin-installer/logs/*",   # 麒麟安装日志
    "/opt/deepin/Packages/*/data/*",       # Deepin软件包缓存
    "/var/lib/ureadahead/debug.log"        # 系统启动预加载日志    
)
shopt -s nullglob
for pattern in "${app_paths[@]}"; do
  delete_files_in_pattern "$pattern"
done
shopt -u nullglob
confirm_deletion_and_delete "find /opt/ -type d -name 'log' -exec sh -c 'sudo rm -rfv \"$1\"/*.log' _ {} \; 2>/dev/null"
confirm_deletion_and_delete "find /opt/ -type d -name 'Log' -exec sh -c 'sudo rm -rfv \"$1\"/*.log' _ {} \; 2>/dev/null"
# ======================
# 4. 用户目录清理
# ======================
echo -e "\n\033[34m[4/8] 清理用户目录...\033[0m"
user_paths=(
    "${HOME}/.xsession-errors*"   #删除缓存文件
    "${HOME}/.config/qaxbrowser/DownloadCache/*"
    "${HOME}/.qaxsafe/*"
    "${HOME}/*/*.log"
    "${HOME}/.tmp/suwellreader/*"     #删除数科OFD缓存文件
    "${HOME}/.cache/uksc/wget_down/deb/*"  #删除下载的安装文件
 #   "${HOME}/下载/*" #删除下载所有文件
 #    "${HOME}/download/*" #删除下载所有文件 
 #   "${HOME}/Downloads/*" #删除下载所有文件 
    "${HOME}/.local/share/Deepin/software-center/cache/*"  # Deepin缓存
    "${HOME}/.local/share/Deepin/udis86/cache/*"          # Deepin反汇编缓存
    "${HOME}/.cache/deepin/SoftwareCenter"                 # Deepin软件中心缓存
    "${HOME}/.cache/deepin/dock"
    "${HOME}/.cache/deepin/panel"
    "${HOME}/.cache/ksmserver"
    "${HOME}/.cache/plasma-org.kde.plasma.desktop-appletsrc"  # KDE桌面缓存    
)
shopt -s nullglob
for pattern in "${user_paths[@]}"; do
  delete_files_in_pattern "$pattern"
done
shopt -u nullglob

confirm_deletion_and_delete "sudo find ${HOME}/.config/QQ/versions/ -type f ! -name '*.json' -exec rm -rfv {} +"
confirm_deletion_and_delete "sudo find ${HOME}/.config/QQ/versions/ -mindepth 1 -type d -empty -delete"
confirm_deletion_and_delete "sudo rm -rf ${HOME}/.xwechat/radium/*"
confirm_deletion_and_delete "find ${HOME} -type d -name '.cache' -exec sh -c 'sudo rm -rfv \"$1\"/*.log' _ {} \; 2>/dev/null"
confirm_deletion_and_delete "find ${HOME} -type d -name '.cache' -exec sh -c 'sudo rm -rfv \"$1\"/*.png' _ {} \; 2>/dev/null"
confirm_deletion_and_delete "find ${HOME} -type d -name 'browser360' -exec sh -c 'sudo rm -rfv \"$1\"/*.log' _ {} \; 2>/dev/null"
 # 删除Kingsoft Office备份目录中超过7天的文件
confirm_deletion_and_delete "find ${HOME}/.local/share/Kingsoft/office6/data/backup/ -type f -mtime +7 -exec rm -rfv {} \;"
# 清理粤政易历史文件
echo "开始清理粤政易历史文件..."
# 获取当前年月（格式：YYYY-MM）
WXWorkLocal_month=$(date +"%Y-%m")
      echo "当前月份: ${WXWorkLocal_month}"
# 定义需要清理的目录列表
WXWorkLocal_dirs=("Avator" "Emotion")
# 遍历所有目标目录
for WXWorkLocal_name in "${WXWorkLocal_dirs[@]}"; do
  echo "正在处理目录: ${WXWorkLocal_name}"
    # 使用while循环逐行处理find结果，避免路径合并问题
  while IFS= read -r -d '' WXWorkLocal_dir; do
    echo "扫描目录: ${WXWorkLocal_dir}"
        # 使用临时数组存储待删除目录
    mapfile -t old_dirs < <(find "${WXWorkLocal_dir}" -maxdepth 1 -type d -regextype posix-extended -regex ".*/[0-9]{4}-[0-9]{2}$" | grep -vE "/${WXWorkLocal_month}$" || true)
    for old_dir in "${old_dirs[@]}"; do
      if [[ -d "${old_dir}" ]]; then
        echo "正在删除旧文件夹: ${old_dir}"
        rm -rf "${old_dir}"
      else
        echo "警告: 目录不存在 ${old_dir}"
      fi
    done
  done < <(find "${HOME}/.WXWorkLocal/data/" -type d -path "*/${WXWorkLocal_name}" -print0 2>/dev/null)
done
# 结束删除粤政易每月保留的文件
# 开始删除QQ每月保留的文件
# 获取当前年月（格式：YYYY-MM）
QQ_month=$(date +"%Y-%m")
# 检查并获取QQ目录
qq_dir=$(find "${HOME}/.config/QQ/" -maxdepth 1 -type d -name "nt_qq_*" | head -n 1)
if [ -z "$qq_dir" ]; then
  echo "警告：QQ目录不存在！路径：$qq_dir"
else
  clean_dir() {
    local dir_type=$1
    local target_dir="$2"
    if [ ! -d "$target_dir" ]; then
      echo "警告：${dir_type}目录不存在！路径：$target_dir"
      return 1
    fi
    if [ ! -w "$target_dir" ]; then
      echo "警告：没有${target_dir}目录的写入权限"
      return 1
    fi
    echo "正在清理${dir_type}目录：$target_dir"
    local files_to_delete=$(find "$target_dir" -type f ! -name "${QQ_month}*" -print 2>/dev/null | wc -l)
    if [ $files_to_delete -gt 0 ]; then
      find "$target_dir" -type f ! -name "${QQ_month}*" -delete
      echo "已清理${files_to_delete}个非本月($QQ_month)文件"
    fi
    local dirs_to_delete=$(find "$target_dir" -mindepth 1 -type d ! -name "${QQ_month}*" -print 2>/dev/null | wc -l)
    if [ $dirs_to_delete -gt 0 ]; then
      find "$target_dir" -mindepth 1 -type d ! -name "${QQ_month}*" -exec rm -rfv {} +
      echo "已清理${dirs_to_delete}个非本月($QQ_month)目录"
    fi
    [ $files_to_delete -eq 0 ] && [ $dirs_to_delete -eq 0 ] && echo "没有需要清理的内容"
  }
  clean_dir "QQ头像" "${qq_dir}/nt_data/avatar/user/"
  clean_dir "QQ表情" "${qq_dir}/nt_data/Emoji/emoji-recv/"
  clean_dir "QQ_Pic" "${qq_dir}/nt_data/Pic/"
  clean_dir "QQ_Video" "${qq_dir}/nt_data/Video/"
# 结束删除QQ每月保留的文件
#开始清理QQ目录的ZIP文件
  QQ_ThumbTemp_dir="$qq_dir/nt_data/Emoji/BaseEmojiSyastems/ThumbTemp"
  QQ_emoji_zip_count=$(find "$QQ_ThumbTemp_dir" -maxdepth 1 -type f -name "*.zip" 2>/dev/null | wc -l)
  if [ $QQ_emoji_zip_count -gt 0 ]; then
    sudo rm -rfv "$QQ_ThumbTemp_dir"/*.zip
    echo "已清理ThumbTemp目录中的${QQ_emoji_zip_count}个zip文件"
  else
    echo "没有需要清理的内容：ThumbTemp目录中没有zip文件"
  fi

  QQ_emoji_dir="$HOME/.config/QQ/global/nt_data/Emoji/emoji-resource"
  QQ_zip_count=$(find "$QQ_emoji_dir" -maxdepth 1 -type f -name "*.zip" 2>/dev/null | wc -l)
  if [ $QQ_zip_count -gt 0 ]; then
    sudo rm -rfv "$QQ_emoji_dir"/*.zip
    echo "已清理emoji-resource目录中的${QQ_zip_count}个zip文件"
  else
    echo "没有需要清理的内容：emoji-resource目录中没有zip文件"
  fi
fi
#清理QQ目录的ZIP文件结束
# ======================
# 5. 临时文件清理
# ======================
echo -e "\n\033[34m[5/8] 清理临时文件...\033[0m"
confirm_deletion_and_delete "sudo rm -rfv /tmp/{spark-store,*.{png,log}}"
confirm_deletion_and_delete "sudo rm -rfv ${HOME}/.local/share/Trash/files/* "    # 手动删除回收站文件
confirm_deletion_and_delete "sudo find ${HOME}/.local/share -name '*.log' -print -delete"
# ======================
# 6. 日志管理优化
# ======================
echo -e "\n\033[34m[6/8] 优化日志系统...\033[0m"
# 删除过期文件+空目录（带操作日志）
confirm_deletion_and_delete "sudo find /var/log -type f -mtime +1 -exec rm -fv {} \; -o -type d -empty -exec echo 'Deleting empty dir: {}' \; -delete"
confirm_deletion_and_delete "sudo find /.log -type f -mtime +1 -exec rm -fv {} \; -o -type d -empty -exec echo 'Deleting empty dir: {}' \; -delete"
confirm_deletion_and_delete "sudo find /opt/ -name '*.log' -print -exec truncate -s 0 {} \;"
if [[ -f "/etc/kylin-release" ]]; then
  sudo journalctl --vacuum-time=3d
else
  sudo journalctl --vacuum-time=7d
fi
sudo journalctl --vacuum-size=100M
# ======================
# 7. 历史记录清理
# ======================
echo -e "\n\033[34m[7/8] 清理历史记录...\033[0m"
confirm_deletion_and_delete "sudo rm -rfv ~/.bash_history"
confirm_deletion_and_delete "history -c"
confirm_deletion_and_delete "sudo rm -rfv ~/.local/share/recently-used.xbel"  # 删除全局最近使用文件列表
confirm_deletion_and_delete "sudo rm -rfv ~/.config/gtk-3.0/bookmarks"      # 清除文件管理器书签记录
confirm_deletion_and_delete "find ~/.cache -type f -name '*recent*' -delete"  # 删除所有含recent关键词的缓存
confirm_deletion_and_delete "find ~/.config -name 'recently-used*' | xargs -I {} rm -f {}" # 清理配置文件记录
# ======================
# 8. 系统维护
# ======================
echo -e "\n\033[34m[8/8] 系统维护...\033[0m"
if [[ -f "/etc/kylin-release" ]]; then
  confirm_deletion_and_delete "sudo kylin-update --clean"
else
  confirm_deletion_and_delete "sudo journalctl --vacuum-time=7d"
fi
sudo apt autoclean -y
sudo apt clean -y
sudo apt autoremove -y
sudo apt update -y
# ======================
# 完成报告
# ======================
echo -e "\n\033[32m=== 清理完成 ===\033[0m"
echo -e "已安全清理以下内容："
echo -e " ✓ APT缓存和锁文件"
echo -e " ✓ 系统日志文件"
echo -e " ✓ 第三方应用缓存"
echo -e " ✓ 用户临时文件"
echo -e " ✓ 系统临时文件"
echo -e " ✓ 优化日志系统"
echo -e " ✓ 清理历史记录"
# 系统提示功能
notify "系统已焕然一新！" "系统已焕然一新！已完成清理工作，感谢您的使用！" "error"
read -p $'\e[34m 按任意键关闭此窗口...\e[0m' -n 1 -r
