#!/bin/bash

# 加载 .env 文件里的变量
export $(grep -v '^#' .env | xargs)

# 函数:检查容器是否存在并返回状态
check_container() {
  if [ "$(docker ps -q -f name=$CONTAINER_NAME)" ]; then
    return 0 # 容器正在运行
  elif [ "$(docker ps -aq -f name=$CONTAINER_NAME)" ]; then
    return 1 # 容器存在但未运行
  else
    return 2 # 容器不存在
  fi
}

# 函数:检查镜像是否存在并返回状态
check_image() {
  if [ "$(docker images -q $IMAGE_NAME:$IMAGE_TAG)" ]; then
    return 0 # 镜像存在
  else
    return 1 # 镜像不存在
  fi
}

# 函数:启动容器
start_container() {
  check_container
  case $? in
  0)
    echo "容器 $CONTAINER_NAME 已存在并正在运行。"
    ;;
  1)
    echo "容器 $CONTAINER_NAME 已存在,但未运行,尝试启动..."
    docker start $CONTAINER_NAME
    if [ $? -eq 0 ]; then
      echo "容器 $CONTAINER_NAME 已启动。"
    else
      echo "启动容器 $CONTAINER_NAME 失败。"
      exit 1
    fi
    ;;
  2)
    echo "容器 $CONTAINER_NAME 不存在,检查镜像..."
    check_image
    if [ $? -ne 0 ]; then
      echo "镜像不存在: $IMAGE_NAME:$IMAGE_TAG,开始构建镜像..."
      ./build.sh
      if [ $? -ne 0 ]; then
        echo "镜像构建失败,终止操作。"
        exit 1
      fi
    else
      echo "镜像已存在: $IMAGE_NAME:$IMAGE_TAG,直接启动容器。"
    fi
    echo "启动新的容器..."
    docker run -d --name $CONTAINER_NAME -p $HOST_PORT:$CONTAINER_PORT $IMAGE_NAME:$IMAGE_TAG
    if [ $? -eq 0 ]; then
      echo "容器 $CONTAINER_NAME 已启动,已映射 $HOST_PORT 端口。"
    else
      echo "启动容器 $CONTAINER_NAME 失败,请检查错误信息。"
      exit 1
    fi
    ;;
  esac
}

# 函数:停止并删除容器
stop_container() {
  if check_container; then
    echo "停止并删除容器 $CONTAINER_NAME..."
    docker stop $CONTAINER_NAME
    docker rm $CONTAINER_NAME
    echo "容器 $CONTAINER_NAME 已停止并删除。"
  else
    echo "容器 $CONTAINER_NAME 不存在。"
  fi
}

# 函数:清理容器和所有同名镜像
clear_container() {
  read -p "你确定要清理容器 $CONTAINER_NAME 和所有同名镜像吗?(y/n): " choice
  if [[ "$choice" != "y" ]]; then
    echo "清理操作已取消。"
    return
  fi

  stop_container
  echo "删除所有同名镜像..."
  OLD_IMAGES=$(docker images --filter=reference="$IMAGE_NAME:*" --format '{{.Repository}}:{{.Tag}}')

  if [ -n "$OLD_IMAGES" ]; then
    echo "删除以下镜像:"
    echo "$OLD_IMAGES"
    echo "$OLD_IMAGES" | xargs docker rmi -f
  else
    echo "没有找到同名镜像。"
  fi
}

# 函数:重启容器
restart_container() {
  echo "开始构建新的镜像..."
  ./build.sh
  if [ $? -ne 0 ]; then
    echo "镜像构建失败,无法重启容器。"
    exit 1
  fi

  stop_container
  start_container
}

# 确保参数存在
if [ "$#" -ne 1 ]; then
  echo "使用方法: $0 start|stop|restart|clear"
  exit 1
fi

# 根据参数执行相应的操作
case "$1" in
start)
  start_container
  ;;
stop)
  stop_container
  ;;
restart)
  restart_container
  ;;
clear)
  clear_container
  ;;
*)
  echo "无效参数: $1"
  echo "使用方法: $0 start|stop|restart|clear"
  exit 1
  ;;
esac