#!/bin/bash
# ============================================================
# docker-pull-mirror.sh
# 通过镜像站拉取 Docker 镜像，自动还原原始 tag，删除镜像站 tag
# 用法: bash docker-pull-mirror.sh [选项] <镜像名1> [镜像名2 ...]
# ============================================================

set -euo pipefail

# 默认镜像站（可通过环境变量 DOCKER_MIRROR 覆盖）
MIRROR="${DOCKER_MIRROR:-docker.1ms.run}"

# 颜色输出
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
RED='\033[0;31m'
NC='\033[0m' # No Color

usage() {
    cat <<EOF
通过镜像站拉取 Docker 镜像并还原原始 tag。

Usage: $0 [选项] <镜像名1> [镜像名2 ...]

选项:
  -m, --mirror <地址>  指定镜像站地址（默认: ${MIRROR}）
                       也可通过环境变量 DOCKER_MIRROR 设置
  -h, --help           显示此帮助信息

示例:
  # 拉取单个官方镜像
  $0 nginx:latest

  # 拉取多个镜像
  $0 nginx:latest redis:7.0 alpine:3.18

  # 拉取非官方镜像（带 namespace）
  $0 bitnami/nginx:1.25

  # 指定镜像站
  $0 -m dockerproxy.com nginx:latest

  # 通过环境变量指定镜像站
  DOCKER_MIRROR=mirror.ccs.tencentyun.com $0 nginx:latest

说明:
  1. 官方镜像（如 nginx、redis）自动补全 library/ 前缀
  2. 非官方镜像（如 bitnami/nginx）直接拼接镜像站前缀
  3. 拉取后自动还原成原始镜像名:tag，并删除镜像站 tag
  4. 镜像站默认使用 docker.1ms.run
EOF
    exit 0
}

# 解析参数
IMAGES=()
while [[ $# -gt 0 ]]; do
    case "$1" in
        -m|--mirror)
            MIRROR="$2"
            shift 2
            ;;
        -h|--help)
            usage
            ;;
        -*)
            echo -e "${RED}错误: 未知选项 $1${NC}"
            usage
            ;;
        *)
            IMAGES+=("$1")
            shift
            ;;
    esac
done

# 检查 docker 是否可用
if ! command -v docker &>/dev/null; then
    echo -e "${RED}错误: 未找到 docker 命令，请先安装 Docker${NC}"
    exit 1
fi

# 检查是否指定了镜像
if [[ ${#IMAGES[@]} -eq 0 ]]; then
    echo -e "${RED}错误: 请指定要拉取的镜像名称${NC}"
    usage
fi

echo -e "${YELLOW}>>> 镜像站: ${MIRROR}${NC}"
echo ""

PULL_FAILED=0

for image in "${IMAGES[@]}"; do
    # 解析镜像名和 tag（默认 latest）
    if [[ "$image" == *:* ]]; then
        name="${image%%:*}"
        tag="${image##*:}"
    else
        name="$image"
        tag="latest"
    fi

    # 官方镜像（不包含 /）自动补全 library/
    if [[ "$name" != */* ]]; then
        mirror_image="${MIRROR}/library/${name}:${tag}"
    else
        mirror_image="${MIRROR}/${name}:${tag}"
    fi

    echo -e "${YELLOW}========================================${NC}"
    echo -e "${YELLOW}  镜像: ${image}${NC}"
    echo -e "${YELLOW}  拉取: ${mirror_image}${NC}"
    echo -e "${YELLOW}========================================${NC}"

    # 1. 拉取镜像
    echo -e ">>> ${GREEN}拉取镜像...${NC}"
    if ! docker pull "${mirror_image}"; then
        echo -e "${RED}❌ 拉取失败: ${mirror_image}${NC}"
        PULL_FAILED=1
        echo ""
        continue
    fi

    # 2. 重新打 tag
    echo -e ">>> ${GREEN}还原 tag: ${image}${NC}"
    docker tag "${mirror_image}" "${image}"

    # 3. 删除镜像站 tag（忽略错误，可能有其他引用）
    echo -e ">>> ${GREEN}删除镜像站 tag...${NC}"
    docker rmi "${mirror_image}" 2>/dev/null || true

    echo -e "${GREEN}✅ ${image} 拉取完成${NC}"
    echo ""
done

if [[ $PULL_FAILED -eq 1 ]]; then
    echo -e "${YELLOW}⚠️  部分镜像拉取失败，请检查上述错误信息${NC}"
else
    echo -e "${GREEN}🎉 所有镜像拉取完毕！${NC}"
fi