#!/bin/bash

# =================================================================
#  Project:   Dockerys - Docker Volume Manager
#  Website:   https://www.404.rw
#  Function:  Professional Online Docker Volume Tool
# =================================================================

# --- 终端配色 ---
export CL_CYAN='\033[0;36m'
export CL_GREEN='\033[0;32m'
export CL_RED='\033[0;31m'
export CL_YELLOW='\033[0;33m'
export CL_MAGENTA='\033[0;35m'
export CL_BOLD='\033[1m'
export NC='\033[0m'

# --- 状态图标 ---
export ICON_INFO="${CL_CYAN}[信息]${NC}"
export ICON_SUCCESS="${CL_GREEN}[成功]${NC}"
export ICON_WARN="${CL_YELLOW}[警告]${NC}"
export ICON_ERROR="${CL_RED}[错误]${NC}"

# --- 启动 Header (ASCII Art) ---
print_header() {
    clear
    echo -e "${CL_CYAN}"
    echo "  ____             _                          "
    echo " |  _ \  ___   ___| | _____ _ __ _   _ ___    "
    echo " | | | |/ _ \ / __| |/ / _ \ '__| | | / __|   "
    echo " | |_| | (_) | (__|   <  __/ |  | |_| \__ \   "
    echo " |____/ \___/ \___|_|\_\___|_|   \__, |___/   "
    echo "                                 |___/        "
    echo -e "${NC}"
    echo -e " ${CL_BOLD}Dockerys${NC} - Docker 目录映射在线管理工具"
    echo -e " 官方发布: ${CL_CYAN}https://www.404.rw${NC}"
    echo -e "${CL_CYAN}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
}

# --- 分割线 ---
print_line() {
    echo -e "${CL_CYAN}------------------------------------------------------------${NC}"
}

# --- 自动处理依赖 (runlike) ---
check_deps() {
    if ! command -v runlike &> /dev/null; then
        echo -e "${ICON_INFO} 检测到环境缺少 ${CL_BOLD}runlike${NC}，正在为您自动部署..."
        if command -v pip3 &> /dev/null; then
            pip3 install runlike &> /dev/null
        elif command -v pip &> /dev/null; then
            pip install runlike &> /dev/null
        else
            apt-get update && apt-get install -y python3-pip &> /dev/null
            pip3 install runlike &> /dev/null
        fi
        echo -e "${ICON_SUCCESS} 运行环境已就绪。"
    fi
}

# --- 核心重建容器函数 ---
execute_rebuild() {
    local name=$1
    local cmd=$2

    echo -e "\n${CL_RED}${CL_BOLD}‼ 警告：${NC}容器 [ $name ] 将被删除并使用新配置重建。"
    read -p "确认执行此操作吗? (y/n): " confirm
    if [ "$confirm" == "y" ]; then
        echo -ne "${ICON_INFO} 正在迁移配置并重启容器..."
        docker stop "$name" > /dev/null && docker rm "$name" > /dev/null
        if eval "$cmd" > /dev/null; then
            echo -e "\r${ICON_SUCCESS} 容器 ${CL_BOLD}$name${NC} 已成功更新并启动！"
        else
            echo -e "\r${ICON_ERROR} 重建失败，请检查 Docker 配置。"
        fi
    else
        echo -e "${ICON_INFO} 已取消本次操作。"
    fi
    echo -e "\n按任意键返回主菜单..."
    read -n 1
}

# --- 功能 1: 添加映射 ---
func_add() {
    print_header
    echo -e "${CL_BOLD}步骤 1: 请选择需要添加映射的容器${NC}"
    local containers=$(docker ps -a --format "{{.Names}}")
    select name in $containers "返回主菜单"; do
        [ "$name" == "返回主菜单" ] && return
        [ -n "$name" ] && break
    done

    print_line
    echo -e "${CL_BOLD}步骤 2: 输入映射详情${NC}"
    read -p " 宿主机路径 (Host): " h_path
    read -p " 容器内路径 (Container): " c_path

    [ ! -d "$h_path" ] && mkdir -p "$h_path" && echo -e "${ICON_INFO} 已自动创建目录: $h_path"

    local old_cmd=$(runlike "$name")
    local new_cmd="${old_cmd} -v ${h_path}:${c_path}"
    execute_rebuild "$name" "$new_cmd"
}

# --- 功能 2: 删除映射 ---
func_del() {
    print_header
    echo -e "${CL_BOLD}步骤 1: 请选择需要修改的容器${NC}"
    local containers=$(docker ps -a --format "{{.Names}}")
    select name in $containers "返回主菜单"; do
        [ "$name" == "返回主菜单" ] && return
        [ -n "$name" ] && break
    done

    print_line
    echo -e "${CL_BOLD}步骤 2: 选择要【删除】的映射条目${NC}"
    local mounts=$(docker inspect --format '{{ range .Mounts }}{{ if eq .Type "bind" }}{{ .Source }}:{{ .Destination }}{{ "\n" }}{{ end }}{{ end }}' "$name")
    
    if [ -z "$mounts" ]; then
        echo -e "${ICON_WARN} 该容器没有任何目录绑定映射。"
        read -n 1 -p "按任意键返回..."
        return
    fi

    select to_del in $mounts "取消"; do
        [ "$to_del" == "取消" ] && return
        if [ -n "$to_del" ]; then
            local old_cmd=$(runlike "$name")
            # 兼容多种参数格式的删除
            local new_cmd=$(echo "$old_cmd" | sed "s|-v $to_del||g" | sed "s|--volume=$to_del||g" | sed "s|-v \"$to_del\"||g")
            execute_rebuild "$name" "$new_cmd"
            break
        fi
    done
}

# --- 主逻辑循环 ---
check_deps
while true; do
    print_header
    echo -e "  ${CL_MAGENTA}1.${NC} 查看当前容器映射详情"
    echo -e "  ${CL_MAGENTA}2.${NC} 添加新映射目录 (Add)"
    echo -e "  ${CL_MAGENTA}3.${NC} 删除已有映射目录 (Delete)"
    echo -e "  ${CL_MAGENTA}4.${NC} 退出脚本"
    print_line
    read -p " 请输入序号选择功能 [1-4]: " choice

    case $choice in
        1) 
            print_header
            docker ps -a --format "table {{.Names}}\t{{.Status}}\t{{.Image}}"
            echo -e "\n${ICON_INFO} 输入功能 2 或 3 可以查看具体挂载路径。"
            read -n 1 -p "按任意键返回..." 
            ;;
        2) func_add ;;
        3) func_del ;;
        4) echo -e "${CL_GREEN}感谢使用 Dockerys，再见！${NC}"; exit 0 ;;
        *) echo -e "${ICON_ERROR} 无效选项，请重新输入。" ; sleep 1 ;;
    esac
done