#!/bin/bash
set -euo pipefail

# Deepin 23 升级到 Deepin 25 社区方法一键脚本
# ==============================================
# 警告：此方法未经官方支持，存在严重风险！
# 可能导致系统不稳定、数据丢失或无法启动！
# 强烈建议使用官方推荐的全新安装方法！
# ==============================================

# 定义颜色
RED='\033[0;31m'
YELLOW='\033[1;33m'
GREEN='\033[0;32m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color

# 日志文件
LOG_FILE="/var/log/deepin_upgrade_$(date +%Y%m%d_%H%M%S).log"

# 风险提示函数
show_warning() {
    echo -e "${RED}"
    echo "=================================================="
    echo "                  严重警告！！！                  "
    echo "=================================================="
    echo "此脚本使用社区非官方方法升级Deepin系统"
    echo "官方明确不支持从Deepin 23直接升级到Deepin 25"
    echo ""
    echo "可能出现的问题："
    echo "- 系统不稳定，出现各种错误"
    echo "- 备份功能失效"
    echo "- 缺少磐石安全保护"
    echo "- 数据丢失风险"
    echo "- 系统无法启动"
    echo ""
    echo "强烈建议："
    echo "- 备份所有重要数据"
    echo "- 使用官方镜像进行全新安装"
    echo "=================================================="
    echo -e "${NC}"
}

# 确认函数
confirm_action() {
    local prompt="$1"
    local default="${2:-N}"
    
    read -p "$prompt ($default) " choice
    choice=${choice:-$default}
    
    case "$choice" in 
        y|Y ) return 0;;
        * ) return 1;;
    esac
}

# 日志函数
log_message() {
    local level="$1"
    local message="$2"
    local timestamp=$(date +"%Y-%m-%d %H:%M:%S")
    
    echo "[$timestamp] [$level] $message" | tee -a "$LOG_FILE"
    
    case "$level" in
        "ERROR") echo -e "${RED}[$timestamp] [ERROR] $message${NC}" | tee -a "$LOG_FILE";;
        "WARNING") echo -e "${YELLOW}[$timestamp] [WARNING] $message${NC}" | tee -a "$LOG_FILE";;
        "INFO") echo -e "${BLUE}[$timestamp] [INFO] $message${NC}" | tee -a "$LOG_FILE";;
        "SUCCESS") echo -e "${GREEN}[$timestamp] [SUCCESS] $message${NC}" | tee -a "$LOG_FILE";;
        *) echo "[$timestamp] [$level] $message" | tee -a "$LOG_FILE";;
    esac
}

# 检查命令是否存在
check_command() {
    local cmd="$1"
    if ! command -v "$cmd" &> /dev/null; then
        log_message "ERROR" "命令 $cmd 不存在，请安装后重试"
        exit 1
    fi
}

# 检查系统版本
check_system_version() {
    log_message "INFO" "检查系统版本..."
    
    if [ -f "/etc/os-version" ]; then
        local version=$(grep "VERSION_ID" /etc/os-version | cut -d'=' -f2 | tr -d '"')
        if [[ "$version" != "23" ]]; then
            log_message "ERROR" "此脚本仅支持Deepin 23系统，当前版本：$version"
            exit 1
        fi
        log_message "INFO" "系统版本检查通过：Deepin $version"
    else
        log_message "WARNING" "无法确定系统版本，请手动确认是否为Deepin 23"
        if ! confirm_action "是否继续执行？"; then
            exit 1
        fi
    fi
}

# 备份函数
backup_files() {
    log_message "INFO" "开始备份重要文件..."
    
    local backup_dir="/backup/deepin_upgrade_$(date +%Y%m%d_%H%M%S)"
    sudo mkdir -p "$backup_dir"
    
    # 备份软件源配置
    log_message "INFO" "备份软件源配置..."
    if [ -f "/etc/apt/sources.list" ]; then
        sudo cp /etc/apt/sources.list "$backup_dir/"
        log_message "SUCCESS" "sources.list 备份完成"
    else
        log_message "WARNING" "sources.list 文件不存在"
    fi
    
    if [ -d "/etc/apt/sources.list.d" ]; then
        sudo cp -r /etc/apt/sources.list.d "$backup_dir/"
        log_message "SUCCESS" "sources.list.d 备份完成"
    else
        log_message "WARNING" "sources.list.d 目录不存在"
    fi
    
    # 备份系统配置
    log_message "INFO" "备份系统配置文件..."
    sudo cp -r /etc "$backup_dir/" 2>/dev/null || log_message "WARNING" "部分系统配置文件备份失败"
    
    log_message "SUCCESS" "备份完成，文件保存在：$backup_dir"
    echo -e "${YELLOW}备份文件位置：$backup_dir${NC}"
}

# 修改软件源函数
modify_sources() {
    log_message "INFO" "开始修改软件源..."
    
    # 创建源文件备份
    local source_backup_dir="/etc/apt/backup_$(date +%Y%m%d_%H%M%S)"
    sudo mkdir -p "$source_backup_dir"
    
    # 修改主源文件
    log_message "INFO" "修改主软件源..."
    if [ -f "/etc/apt/sources.list" ]; then
        sudo cp /etc/apt/sources.list "$source_backup_dir/"
        sudo tee /etc/apt/sources.list <<EOF
## Generated by deepin-installer
deb https://community-packages.deepin.com/beige/ crimson main commercial community
#deb-src https://community-packages.deepin.com/beige/ crimson main commercial community
EOF
        log_message "SUCCESS" "主软件源修改完成"
    else
        log_message "ERROR" "sources.list 文件不存在，无法修改"
        return 1
    fi
    
    # 修改应用商店源
    log_message "INFO" "修改应用商店源..."
    if [ -f "/etc/apt/sources.list.d/appstore.list" ]; then
        sudo cp /etc/apt/sources.list.d/appstore.list "$source_backup_dir/"
        sudo tee /etc/apt/sources.list.d/appstore.list <<EOF
# Written by deepin-home-appstore-client
deb https://com-store-packages.uniontech.com/appstore-V25 crimson appstore
EOF
        log_message "SUCCESS" "应用商店源修改完成"
    else
        log_message "WARNING" "appstore.list 文件不存在，跳过修改"
    fi
    
    # 修改驱动源
    log_message "INFO" "修改驱动源..."
    if [ -f "/etc/apt/sources.list.d/driver.list" ]; then
        sudo cp /etc/apt/sources.list.d/driver.list "$source_backup_dir/"
        sudo tee /etc/apt/sources.list.d/driver.list <<EOF
# Written by dde-printer
deb https://community-packages.deepin.com/driver-25/ snipe non-free
EOF
        log_message "SUCCESS" "驱动源修改完成"
    else
        log_message "WARNING" "driver.list 文件不存在，跳过修改"
    fi
    
    log_message "INFO" "软件源备份保存在：$source_backup_dir"
    log_message "SUCCESS" "软件源修改完成"
}

# 系统升级函数
upgrade_system() {
    log_message "INFO" "开始系统升级..."
    
    # 更新软件包列表
    log_message "INFO" "更新软件包列表..."
    if ! sudo apt update; then
        log_message "ERROR" "软件包列表更新失败"
        if confirm_action "是否继续执行升级？"; then
            log_message "WARNING" "用户选择继续，忽略更新失败"
        else
            exit 1
        fi
    fi
    
    # 升级系统
    log_message "INFO" "执行系统升级..."
    local upgrade_success=false
    if  sudo apt install spark-store -y && sudo aptss update && sudo aptss reinstall dde-kwin -y && sudo aptss full-upgrade -y; then
        upgrade_success=true
    else
        log_message "ERROR" "升级过程中出现错误，尝试修复依赖..."
        if sudo apt update && sudo apt --fix-broken install -y; then
            log_message "INFO" "依赖修复完成，再次尝试升级..."
            if sudo aptss update && sudo aptss full-upgrade -y; then
                upgrade_success=true
            else
                log_message "ERROR" "再次升级失败"
            fi
        else
            log_message "ERROR" "依赖修复失败"
        fi
    fi
    
    if [ "$upgrade_success" = true ]; then
        log_message "INFO" "修复桌面核心组件..."       
        sudo aptss install dde-clipboard deepin-desktop-environment-core deepin-desktop-environment-extras deepin-immutable*  -y

         # 清理
        log_message "INFO" "清理系统..."
        sudo aptss autoremove -y
        sudo aptss autoclean
        log_message "SUCCESS" "系统升级完成"
    else
        log_message "ERROR" "系统升级失败，请检查日志文件"
        return 1
    fi
}

# 升级后配置函数
post_upgrade_config() {
    log_message "INFO" "执行升级后配置..."
    
    # 更新GRUB
    log_message "INFO" "更新GRUB引导..."
    if sudo update-grub; then
        log_message "SUCCESS" "GRUB更新完成"
    else
        log_message "WARNING" "GRUB更新失败，可能需要手动修复"
    fi
    
    # 检查启动配置
    log_message "INFO" "检查启动配置..."
    if [ -f "/boot/grub/grub.cfg" ]; then
        log_message "INFO" "GRUB配置文件存在"
    else
        log_message "ERROR" "GRUB配置文件不存在"
    fi
    
    log_message "SUCCESS" "升级后配置完成"
}

# 系统检查函数
system_checks() {
    log_message "INFO" "执行系统检查..."
    
    # 检查磁盘空间
    log_message "INFO" "检查磁盘空间..."
    local root_usage=$(df / | tail -1 | awk '{print $5}' | sed 's/%//')
    if [ "$root_usage" -gt 80 ]; then
        log_message "WARNING" "根分区使用率过高：$root_usage%，建议清理空间"
        if ! confirm_action "磁盘空间不足，是否继续？"; then
            exit 1
        fi
    fi
    
    # 检查网络连接
    log_message "INFO" "检查网络连接..."
    if ping -c 1 8.8.8.8 &> /dev/null; then
        log_message "SUCCESS" "网络连接正常"
    else
        log_message "ERROR" "网络连接失败，请检查网络设置"
        exit 1
    fi
    
    log_message "SUCCESS" "系统检查完成"
}

# 完成提示函数
show_completion() {
    echo -e "\n${YELLOW}"
    echo "=================================================="
    echo "                  升级过程完成                  "
    echo "=================================================="
    echo "升级日志：$LOG_FILE"
    echo ""
    echo "请注意："
    echo "- 系统需要重启才能完成升级"
    echo "- 重启前请确保所有工作已保存"
    echo "- 升级后可能需要重新配置一些应用"
    echo "- 如果出现问题，建议重新安装系统"
    echo ""
    echo "官方建议：使用Deepin 25镜像进行全新安装"
    echo "=================================================="
    echo -e "${NC}"
    
    if confirm_action "是否立即重启系统？" "N"; then
        log_message "INFO" "用户选择立即重启"
        sudo reboot
    else
        log_message "INFO" "用户选择稍后重启"
        echo -e "${YELLOW}请在适当时候手动重启系统${NC}"
    fi
}

# 主执行流程
main() {
    echo -e "${BLUE}Deepin 23 升级到 Deepin 25 社区方法一键脚本${NC}"
    echo -e "${BLUE}==============================================${NC}\n"
    
    # 检查是否以root权限运行
    if [ "$(id -u)" -ne 0 ]; then
        echo -e "${RED}错误：脚本需要以root权限运行，请使用sudo${NC}"
        exit 1
    fi
    
    # 检查必要命令
    check_command "apt"
    check_command "tee"
    check_command "cp"
    
    # 显示风险提示
    show_warning
    
    # 确认继续
    if ! confirm_action "我已了解风险，是否继续执行升级？" "N"; then
        log_message "INFO" "用户取消执行，脚本退出"
        exit 0
    fi
    
    # 执行系统检查
    system_checks
    
    # 备份文件
    backup_files
    
    # 修改软件源
    if ! modify_sources; then
        log_message "ERROR" "软件源修改失败，脚本退出"
        exit 1
    fi
    
    # 系统升级
    if ! upgrade_system; then
        log_message "ERROR" "系统升级失败"
        if confirm_action "升级失败，是否继续执行后续步骤？"; then
            log_message "WARNING" "用户选择继续执行后续步骤"
        else
            exit 1
        fi
    fi
    
    # 升级后配置
    post_upgrade_config
    
    # 完成提示
    show_completion
    
    log_message "INFO" "脚本执行完成"
}

# 执行主函数
main "$@"