#!/bin/bash

# 获取当前目录
cur_dir=$(pwd)

# 定义管理员和程序账号的用户名和密码
admin_username="qsAdmin"
admin_password="sA398P50d508"
app_username="appUser"
app_password="aUsA398sd99"

# 定义密钥文件路径
keyfile="${cur_dir}/mongo-keyfile"

# 创建密钥文件并设置权限
echo "Creating keyfile..."
openssl rand -base64 756 > $keyfile
chmod 400 $keyfile

# 停止并删除现有的容器（如果有的话）
docker stop slea-mongo slea-mongo-secondary1 slea-mongo-secondary2 || true
docker rm slea-mongo slea-mongo-secondary1 slea-mongo-secondary2 || true

# 启动第一个节点，作为主节点
docker run --name slea-mongo \
    -v ${cur_dir}/db:/data/db \
    -v ${keyfile}:/etc/mongo/keyfile:ro \
    -p 27019:27017 \
    -e MONGO_INITDB_ROOT_USERNAME=${admin_username} \
    -e MONGO_INITDB_ROOT_PASSWORD=${admin_password} \
    -d mongo:latest --replSet rs0 --keyFile /etc/mongo/keyfile

# 启动第二个节点
docker run --name slea-mongo-secondary1 \
    -v ${cur_dir}/db-secondary1:/data/db \
    -v ${keyfile}:/etc/mongo/keyfile:ro \
    -p 27020:27017 \
    -e MONGO_INITDB_ROOT_USERNAME=${admin_username} \
    -e MONGO_INITDB_ROOT_PASSWORD=${admin_password} \
    -d mongo:latest --replSet rs0 --keyFile /etc/mongo/keyfile

# 启动第三个节点
docker run --name slea-mongo-secondary2 \
    -v ${cur_dir}/db-secondary2:/data/db \
    -v ${keyfile}:/etc/mongo/keyfile:ro \
    -p 27021:27017 \
    -e MONGO_INITDB_ROOT_USERNAME=${admin_username} \
    -e MONGO_INITDB_ROOT_PASSWORD=${admin_password} \
    -d mongo:latest --replSet rs0 --keyFile /etc/mongo/keyfile

# 等待几秒钟以确保所有容器都已启动
echo "等待容器启动..."
sleep 15

# 检查容器状态并输出日志
for container in slea-mongo slea-mongo-secondary1 slea-mongo-secondary2; do
  status=$(docker inspect -f '{{.State.Status}}' $container)
  echo "$container 状态: $status"
  if [ "$status" != "running" ]; then
    echo "$container 运行失败，查看日志："
    docker logs $container
    exit 1
  fi
done

# 获取容器的 IP 地址
mongo_ip=$(docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' slea-mongo)
mongo_secondary1_ip=$(docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' slea-mongo-secondary1)
mongo_secondary2_ip=$(docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' slea-mongo-secondary2)

# 打印容器 IP 地址
echo "主节点 IP 地址: ${mongo_ip}"
echo "第二节点 IP 地址: ${mongo_secondary1_ip}"
echo "第三节点 IP 地址: ${mongo_secondary2_ip}"

# 配置副本集
docker exec -i slea-mongo mongosh --port 27017 -u ${admin_username} -p ${admin_password} --authenticationDatabase admin <<EOF
rs.initiate({
  _id: "rs0",
  version: 1,
  members: [
    { _id: 0, host: "${mongo_ip}:27017", priority: 2 },
    { _id: 1, host: "${mongo_secondary1_ip}:27017", priority: 1 },
    { _id: 2, host: "${mongo_secondary2_ip}:27017", priority: 0 }
  ]
});
EOF

# 等待副本集配置生效
echo "等待副本集配置生效..."
sleep 10

# 确保副本集已初始化并选择主节点
primary_ip=$(docker exec -i slea-mongo mongosh --port 27017 -u ${admin_username} -p ${admin_password} --authenticationDatabase admin --eval "rs.status().members.find(member => member.stateStr === 'PRIMARY').host.split(':')[0]")

# 创建数据库 slea 并在该数据库中创建程序账号（在主节点上执行）
docker exec -i slea-mongo mongosh --port 27017 -u ${admin_username} -p ${admin_password} --authenticationDatabase admin <<EOF
use slea
db.createUser({
  user: "${app_username}",
  pwd: "${app_password}",
  roles: [{ role: "readWrite", db: "slea" }]
});
EOF

echo "副本集配置及程序账号创建已完成。"