#!/bin/bash

single_server_name=$1

go mod tidy
go mod vendor
find /tmp/go-build* -mmin +5 -exec rm -rf {} +  
find /tmp/go-link* -mmin +5 -exec rm -rf {} +  

run_proxyserver() {
      # 定义目录和screen名称
    dir_path="./proxyserver"
    screen_name="proxyserver"

    # 进入目录
    cd $dir_path
    # 检查是否存在screen session
    if screen -list | grep -q "$screen_name"; then
      # 结束存在的screen session
      screen -S $screen_name -X quit
    fi
    go build
    # 启动新的screen session并运行go程序
    echo "run $screen_name"
    screen -dmS $screen_name -L ./$screen_name
}

# 定义一个函数来在每个服务器目录下运行 go run <server_name>.go
run_server() {
  server_name=$1
  
  # 导航到相应的目录
  cd server/$server_name
  echo "build $server_name"
  go build 
  
  # 如果之前存在相同名字的 screen 会话,先将其终止
  # 首先尝试关闭已存在的screen会话
  existing_session=$(screen -ls | grep -w "$server_name")
  if [ -n "$existing_session" ]; then
    echo "Terminating existing screen session for $server_name"
    screen -S "$server_name" -X quit
    while [[ $(screen -ls | grep "\.$server_name\s") ]]; do
      sleep 0.1s  # 等待0.1秒后再次检查
      echo "wait for $server_name"
    done
  fi

  # 循环检查screen进程是否存在

  [ -f .gitignore ] || (echo "$server_name" > .gitignore && echo "main" >> .gitignore)
  # 使用 screen 运行 go run <server_name>.go

  echo "Running $server_name"
  screen -dmS $server_name -L  ./$server_name

  # 返回到上一级目录
  cd - > /dev/null
}

if [ "$single_server_name" = "proxyserver" ]; then
  # 重启proxyserver的逻辑
  run_proxyserver
else 

  server_dirs=() # 初始化一个空数组

  if [ -n "$single_server_name" ]; then
      server_dirs=("$single_server_name")
  else
      for dir in server/*/ ; do # 遍历 "server/" 下的所有子目录
          dir=${dir%*/}      # 删除末尾的 "/"
          dir=${dir##*/}     # 删除开头的 "server/"
          server_dirs+=("$dir") # 添加到数组
      done
  fi

  # 在每个服务器目录下运行相应的 go 程序
  for server_dir in "${server_dirs[@]}"; do
    run_server $server_dir 
  done

  if [ -n "$single_server_name" ]; then
      echo "no proxyserver restart"
  else
      run_proxyserver
  fi
fi