#!/bin/bash

# RWA Mining Admin Web 一键部署脚本
# 使用方法: ./deploy.sh [命令]
# 命令:
#   build   - 仅构建镜像
#   start   - 构建并启动服务
#   stop    - 停止服务
#   restart - 重启服务
#   logs    - 查看日志
#   clean   - 清理容器和镜像

set -e

# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color

# 项目信息
PROJECT_NAME="rwa-mining-admin-web"
IMAGE_NAME="rwa-mining-admin-web"
CONTAINER_NAME="rwa-mining-admin-web"
DEFAULT_PORT=3100

# 日志函数
log_info() {
    echo -e "${BLUE}[INFO]${NC} $1"
}

log_success() {
    echo -e "${GREEN}[SUCCESS]${NC} $1"
}

log_warn() {
    echo -e "${YELLOW}[WARN]${NC} $1"
}

log_error() {
    echo -e "${RED}[ERROR]${NC} $1"
}

# 检查 Docker 是否安装
check_docker() {
    if ! command -v docker &> /dev/null; then
        log_error "Docker 未安装，请先安装 Docker"
        exit 1
    fi

    if ! docker info &> /dev/null; then
        log_error "Docker 服务未运行，请启动 Docker"
        exit 1
    fi

    log_success "Docker 检查通过"
}

# 检查 Docker Compose 是否安装
check_docker_compose() {
    if docker compose version &> /dev/null; then
        COMPOSE_CMD="docker compose"
    elif command -v docker-compose &> /dev/null; then
        COMPOSE_CMD="docker-compose"
    else
        log_error "Docker Compose 未安装"
        exit 1
    fi

    log_success "Docker Compose 检查通过 ($COMPOSE_CMD)"
}

# 检查网络是否存在
check_network() {
    if ! docker network inspect rwa-network &> /dev/null; then
        log_warn "rwa-network 网络不存在，正在创建..."
        docker network create rwa-network
        log_success "rwa-network 网络创建成功"
    else
        log_success "rwa-network 网络检查通过"
    fi
}

# 构建镜像
build() {
    log_info "开始构建 Docker 镜像..."
    $COMPOSE_CMD build --no-cache
    log_success "镜像构建完成"
}

# 启动服务
start() {
    log_info "开始部署服务..."

    # 检查网络
    check_network

    # 检查端口是否被占用
    PORT=${PORT:-$DEFAULT_PORT}
    if lsof -Pi :$PORT -sTCP:LISTEN -t >/dev/null 2>&1; then
        log_warn "端口 $PORT 已被占用，尝试停止旧服务..."
        stop
    fi

    # 构建并启动
    $COMPOSE_CMD up -d --build

    # 等待服务启动
    log_info "等待服务启动..."
    sleep 5

    # 检查服务状态
    if docker ps | grep -q $CONTAINER_NAME; then
        log_success "服务部署成功!"
        log_info "访问地址: http://localhost:$PORT"
    else
        log_error "服务启动失败，请查看日志: ./deploy.sh logs"
        exit 1
    fi
}

# 停止服务
stop() {
    log_info "停止服务..."
    $COMPOSE_CMD down
    log_success "服务已停止"
}

# 重启服务
restart() {
    log_info "重启服务..."
    stop
    start
}

# 查看日志
logs() {
    $COMPOSE_CMD logs -f
}

# 清理
clean() {
    log_info "清理容器和镜像..."

    # 停止并删除容器
    $COMPOSE_CMD down --rmi local --volumes --remove-orphans

    # 删除悬空镜像
    docker image prune -f

    log_success "清理完成"
}

# 显示状态
status() {
    log_info "服务状态:"
    docker ps -a --filter "name=$CONTAINER_NAME" --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}"
}

# 显示帮助
show_help() {
    echo ""
    echo "RWA Mining Admin Web 部署脚本"
    echo ""
    echo "使用方法: ./deploy.sh [命令]"
    echo ""
    echo "命令:"
    echo "  build    仅构建 Docker 镜像"
    echo "  start    构建并启动服务 (默认)"
    echo "  stop     停止服务"
    echo "  restart  重启服务"
    echo "  logs     查看服务日志"
    echo "  status   查看服务状态"
    echo "  clean    清理容器和镜像"
    echo "  help     显示此帮助信息"
    echo ""
    echo "环境变量:"
    echo "  PORT                  服务端口 (默认: 3100)"
    echo "  NEXT_PUBLIC_API_URL   后端 API 地址 (默认: http://localhost:3023)"
    echo ""
    echo "示例:"
    echo "  ./deploy.sh start                                    # 默认端口 3100 启动"
    echo "  PORT=8080 ./deploy.sh start                          # 指定端口 8080 启动"
    echo "  NEXT_PUBLIC_API_URL=http://api.example.com ./deploy.sh start  # 指定 API 地址"
    echo ""
}

# 主函数
main() {
    # 切换到脚本所在目录
    cd "$(dirname "$0")"

    # 检查环境
    check_docker
    check_docker_compose

    # 执行命令
    case "${1:-start}" in
        build)
            build
            ;;
        start)
            start
            ;;
        stop)
            stop
            ;;
        restart)
            restart
            ;;
        logs)
            logs
            ;;
        status)
            status
            ;;
        clean)
            clean
            ;;
        help|--help|-h)
            show_help
            ;;
        *)
            log_error "未知命令: $1"
            show_help
            exit 1
            ;;
    esac
}

main "$@"
