#!/bin/bash
#***************************************************************#
# ScriptName: docker_js_lists_images.sh
# Author: xhy
# Create Date: 2025-09-29 20:07
# Modify Author: xhy
# Modify Date: 2025-09-29 20:08
# Version: v1
#***************************************************************#
# 定义镜像列表文件路径
IMAGE_LIST_FILE="$(dirname "$0")/images.list"

# 镜像加速器地址（Harbor Proxy）
ACCEL_URL="ck.linuxsb.com"

# 检查镜像列表文件是否存在
if [[ ! -f "${IMAGE_LIST_FILE}" ]]; then
    echo -e "\033[31m[ERROR] 镜像列表文件 ${IMAGE_LIST_FILE} 不存在!!！\033[0m" >&2
    exit 1
fi

# 必须通过 Harbor 加速器的仓库前缀列表
USE_ACCEL_PREFIXES=(
    "registry.k8s.io"
    "ghcr.io"
    "quay.io"
)

# 判断是否需要使用 Harbor 加速器
needs_accel() {
    local image="$1"
    for prefix in "${USE_ACCEL_PREFIXES[@]}"; do
        if [[ "$image" == ${prefix}/* ]]; then
            return 0  # 需要加速
        fi
    done
    return 1  # 走 DockerHub / registry-mirrors
}

# 拉取并重命名镜像
pull_and_rename() {
    # 读取镜像列表文件（跳过空行和注释）
    mapfile -t images < <(grep -vE '^#|^$' "${IMAGE_LIST_FILE}")
    
    for image in "${images[@]}"; do
        original_tag="${image}"

        if needs_accel "${image}"; then
            # 用 Harbor 加速器
            pull_image="${ACCEL_URL}/${image}"
            accel_used="Yes"
        else
            # 原始镜像地址（Docker Hub走registry-mirrors）
            pull_image="${image}"
            accel_used="No"
        fi

        echo -e "\n\033[33m[INFO] 拉取镜像: ${original_tag} (Harbor加速器: ${accel_used})\033[0m"

        if ! docker pull "${pull_image}"; then
            echo -e "\033[31m[ERROR] 拉取 ${pull_image} 失败...\033[0m"
            continue
        fi

        # 打回原始 tag
        docker tag "${pull_image}" "${original_tag}" 2>/dev/null

        # 如果走加速器，清理加速器镜像
        if [[ "${accel_used}" == "Yes" ]]; then
            docker rmi "${pull_image}" >/dev/null 2>&1
        fi

        echo -e "\033[32m[SUCC] 镜像 ${original_tag} 已下载并打标签完成\033[0m"
    done
}

# 检查镜像存在性
check_existence() {
    declare -A local_images
    while IFS=: read -r repo tag; do
        local_images["${repo}:${tag}"]=1
    done < <(docker images --format "{{.Repository}}:{{.Tag}}")

    echo -e "\n\033[33m[CHECK] 镜像存在性检查...\033[0m"
    mapfile -t target_images < <(grep -vE '^#|^$' "${IMAGE_LIST_FILE}")

    for image in "${target_images[@]}"; do
        if [[ -n "${local_images[$image]}" ]]; then
            echo -e "\033[32m[EXIST] ${image} 存在\033[0m"
        else
            echo -e "\033[31m[MISSING] ${image} 不存在\033[0m"
        fi
    done
}

main() {
    pull_and_rename
    check_existence
}

main "$@"
