#!/bin/sh

# 定义颜色输出函数
red() { echo -e "\033[31m\033[01m[WARNING] $1\033[0m"; }
green() { echo -e "\033[32m\033[01m[INFO] $1\033[0m"; }
yellow() { echo -e "\033[33m\033[01m[NOTICE] $1\033[0m"; }
blue() { echo -e "\033[34m\033[01m[MESSAGE] $1\033[0m"; }
light_magenta() { echo -e "\033[95m\033[01m[NOTICE] $1\033[0m"; }
light_yellow() { echo -e "\033[93m\033[01m[NOTICE] $1\033[0m"; }

# 获取路由器型号信息
get_router_name() {
    cat /tmp/sysinfo/model
}

# 安装依赖应用
install_depends_apps() {
    blue "正在安装部署环境的所需要的工具 lsblk 和 fdisk ..."
    router_name=$(get_router_name)
    case "$router_name" in
    *2500*|*3000*)
        opkg update >/dev/null 2>&1
        if opkg install lsblk fdisk >/dev/null 2>&1; then
            green "$router_name 的 lsblk fdisk 工具 安装成功。"
        else
            red "安装失败。"
            exit 1
        fi
        ;;
    *6000*)
        red "由于 mt6000 的软件源中没有找到 lsblk 和 fdisk ..."
        yellow "因此先借用 mt3000 的软件源来安装 lsblk 和 fdisk 工具"
        # 备份 /etc/opkg/distfeeds.conf
        cp /etc/opkg/distfeeds.conf /etc/opkg/distfeeds.conf.backup
        # 先替换为 mt3000 的软件源来安装 lsblk 和 fdisk 工具
        mt3000_opkg="https://raw.githubusercontent.com/wukongdaily/gl-inet-onescript/master/mt-3000/distfeeds.conf"
        wget -q -O /etc/opkg/distfeeds.conf ${mt3000_opkg}
        green "正在更新为 mt3000 的软件源"
        opkg update >/dev/null 2>&1
        green "再次尝试安装 lsblk 和 fdisk 工具"
        if opkg install lsblk fdisk >/dev/null 2>&1; then
            green "$router_name 的 lsblk fdisk 工具 安装成功。"
            # 还原软件源
            cp /etc/opkg/distfeeds.conf.backup /etc/opkg/distfeeds.conf
        else
            red "安装失败。"
            # 还原软件源
            cp /etc/opkg/distfeeds.conf.backup /etc/opkg/distfeeds.conf
            exit 1
        fi
        ;;
    *)
        echo "Router name does not contain '3000', '6000', or '2500'."
        ;;
    esac
}

# 准备USB设备
prepare_usb_device() {
    green "现在开始查找USB设备分区,请稍后......"
    local usb_disk=$(lsblk -dn -o NAME,RM,TYPE | awk '$2=="1" && $3=="disk" {print "/dev/"$1; exit}')
    if [ -z "$usb_disk" ]; then
        red "未找到USB磁盘。"
        exit 1
    fi
    yellow "找到USB磁盘:$usb_disk"

    # 清零磁盘开始部分以清除分区表和文件系统签名
    dd if=/dev/zero of=$usb_disk bs=1M count=10
    sync

    # 卸载所有与该磁盘相关的挂载点
    unmount_usb_device "$usb_disk"

    red "正在重新分区并格式化$usb_disk..."
    create_and_format_partition "$usb_disk"
}

# 卸载USB设备
unmount_usb_device() {
    for mount in $(mount | grep "$1" | awk '{print $3}'); do
        yellow "正在尝试卸载U盘挂载点:$mount"
        umount $mount || {
            red "警告:无法卸载挂载点 $mount。可能有文件正在被访问或权限不足。"
            exit 1
        }
        green "U盘挂载点 $mount 卸载成功。"
    done
}

# 创建并格式化分区
create_and_format_partition() {
    {
        echo o # 创建一个新的空DOS分区表
        echo n # 添加一个新分区
        echo p # 主分区
        echo 1 # 分区号1
        echo   # 第一个可用扇区(默认)
        echo   # 最后一个扇区(默认,使用剩余空间)
        echo w # 写入并退出
    } | fdisk $1 >/dev/null 2>&1

    sleep 5

    local new_partition="${1}1"
    red "正在将U盘 $new_partition 格式化为EXT4文件系统..."
    mkfs.ext4 -F $new_partition >/dev/null 2>&1
    green "$new_partition 已成功格式化为EXT4文件系统。"
    configure_and_start_docker $new_partition
}

# 配置并启动Docker
configure_and_start_docker() {
    local new_partition="$1"
    local usb_mount_point="/mnt/upan_data"
    local docker_root="$usb_mount_point/docker"

    mkdir -p $docker_root
    green "将U盘 挂载到 $usb_mount_point..."
    mount -t ext4 $new_partition $usb_mount_point
    if [ $? -ne 0 ]; then
        red "挂载失败,脚本退出。"
        exit 1
    fi
    green "U盘挂载成功啦\n"

    green "正在创建 Docker 配置文件 /etc/docker/daemon.json"
    mkdir -p /etc/docker
    echo '{
      "bridge": "docker0",
      "storage-driver": "overlay2",
      "data-root": "'$docker_root'"
    }' >/etc/docker/daemon.json

    install_docker
    configure_docker_to_start_on_boot "$new_partition" "$usb_mount_point"
    start_docker_and_check
}

# 安装 Docker 和 dockerd
install_docker() {
    green "正在更新 OPKG 软件包..."
    opkg update >/dev/null 2>&1
    green "正在安装 Docker 及相关服务...请耐心等待一会...大约需要1分钟\n"
    opkg install luci-app-dockerman >/dev/null 2>&1
    opkg install luci-i18n-dockerman-zh-cn >/dev/null 2>&1
    opkg install dockerd --force-depends >/dev/null 2>&1
}

# 配置 Docker 开机启动
configure_docker_to_start_on_boot() {
    local new_partition="$1"
    local usb_mount_point="$2"
    # 创建并配置启动脚本
    green "正在设置 Docker 跟随系统启动的文件:/etc/init.d/docker"
    cat <<EOF >/etc/init.d/docker
#!/bin/sh /etc/rc.common

START=99
USE_PROCD=1
PROG="/usr/bin/dockerd"

start_service() {
    procd_open_instance
    procd_set_param command \$PROG --config-file /etc/docker/daemon.json
    procd_set_param stdout 1
    procd_set_param stderr 1
    procd_close_instance
}

stop_service() {
    killall dockerd
}

restart() {
    stop
    start
}
EOF

    chmod +x /etc/init.d/docker
    /etc/init.d/docker enable
}

# 启动 Docker 并检查
start_docker_and_check() {
    /etc/init.d/docker start
    sleep 5
    if ! docker info >/dev/null 2>&1; then
        red "Docker 启动失败,您可以手动启动docker 执行 /etc/init.d/docker start"
    else
        green "Docker 启动成功并设置正确,您可以直接使用啦~\n"
        DOCKER_ROOT_DIR=$(docker info 2>&1 | grep -v "WARNING" | grep "Docker Root Dir" | awk '{print $4}')
        light_magenta "当前Docker根目录为: $DOCKER_ROOT_DIR"
        light_yellow "Docker根目录剩余空间:$(df -h $DOCKER_ROOT_DIR | awk 'NR==2{print $4}')"
        yellow "不过为了验证下次启动docker的有效性 建议手动重启路由器一次 祝您使用愉快\n"
        red "是否立即重启?(y/n)"
        read -r answer
        if [ "$answer" = "y" ] || [ -z "$answer" ]; then
            red "正在重启..."
            reboot
        else
            yellow "您选择了不重启"
        fi
    fi
}

# START
install_depends_apps
prepare_usb_device