#!/bin/bash
# =============================================
#  Script: enable_mongo_replica.sh (Phiên bản 2 - Đã sửa lỗi)
#  Tác dụng: Bật replica set cho MongoDB local trên CentOS 7
#  Cấp quyền thực thi: chmod +x enable_mongo_replica.sh
#  chạy với quyền root: sudo ./enable_mongo_replica.sh
#  Replica set name: rs0

#Nếu không khởi động được với replica thì chạy khối lệnh sau trong mongo shell
#rs.initiate({
#  _id: "rs0",
#  members: [
#    { _id: 0, host: "127.0.0.1:27017" }
#  ]
#})

# =============================================

set -e

REPL_NAME="rs0"
CONF_FILE="/etc/mongod.conf"
MONGO_PORT=27017

# Tự động phát hiện 'mongosh' (mới) hoặc 'mongo' (cũ)
MONGO_SHELL=$(command -v mongosh || command -v mongo)

echo "🚀 Bắt đầu bật replica set cho MongoDB..."

# 1. Kiểm tra mongod và mongo shell đã cài chưa
if ! command -v mongod &> /dev/null; then
    echo "❌ MongoDB (mongod) chưa được cài. Hãy cài đặt."
    exit 1
fi

if [ -z "$MONGO_SHELL" ]; then
    echo "❌ Không tìm thấy 'mongosh' hay 'mongo'. Hãy cài đặt MongoDB shell."
    exit 1
fi
echo "   (Sử dụng shell: $MONGO_SHELL)"

# 2. Dừng dịch vụ mongod nếu đang chạy
echo "🛑 Dừng dịch vụ mongod..."
sudo systemctl stop mongod || true

# 3. Sao lưu file cấu hình
echo "⚙️  Sao lưu file cấu hình gốc sang ${CONF_FILE}.bak"
sudo cp $CONF_FILE ${CONF_FILE}.bak.$(date +%Y%m%d%H%M%S)

# 4. Cập nhật bindIp
echo "⚙️  Cập nhật 'net.bindIp' thành '0.0.0.0' (Cho phép kết nối replica)"
if sudo grep -q "bindIp: 127.0.0.1" $CONF_FILE; then
    sudo sed -i 's/bindIp: 127.0.0.1/bindIp: 0.0.0.0/g' $CONF_FILE
    echo "   -> Đã thay đổi bindIp từ 127.0.0.1 thành 0.0.0.0"
else
    echo "   -> Không tìm thấy 'bindIp: 127.0.0.1', giả sử đã cấu hình đúng."
fi

# 5. Cập nhật khối replication một cách an toàn
echo "⚙️  Cập nhật khối 'replication'..."
# Xóa bất kỳ khối 'replication:' cũ nào (từ dòng "replication:" đến dòng tiếp theo không thụt vào)
# để tránh xung đột hoặc trùng lặp.
sudo sed -i '/^replication:/,/^[^ ]/d' $CONF_FILE
echo "   -> Đã xóa khối 'replication' cũ (nếu có)."

# Thêm khối 'replication:' mới, sạch vào cuối file
echo -e "\nreplication:\n  replSetName: ${REPL_NAME}" | sudo tee -a $CONF_FILE > /dev/null
echo "   -> Đã thêm khối 'replication: { replSetName: ${REPL_NAME} }' vào cuối file."

# 6. Khởi động lại MongoDB
echo "🔁 Khởi động lại dịch vụ mongod..."
# Tải lại cấu hình systemd phòng trường hợp nó bị ghi đè
sudo systemctl daemon-reload
sudo systemctl start mongod
sudo systemctl enable mongod

# 7. Chờ vài giây để MongoDB khởi động
echo "⏳ Chờ 30 giây để MongoDB khởi động..."
sleep 30

# 8. Khởi tạo replica set (nếu chưa có)
echo "🧠 Khởi tạo replica set (${REPL_NAME})..."

INIT_JS="if (rs.status().ok === 0) { rs.initiate({ _id: '${REPL_NAME}', members: [ { _id: 0, host: '127.0.0.1:${MONGO_PORT}' } ] }); }"

$MONGO_SHELL --quiet --port $MONGO_PORT --eval "${INIT_JS}" || {
    echo "⚠️  Có thể replica đã được khởi tạo trước đó. Kiểm tra trạng thái..."
}

# Đợi 3s để replica ổn định
sleep 3

# 9. Kiểm tra lại trạng thái
echo "🔍 Kiểm tra trạng thái replica set..."
$MONGO_SHELL --port $MONGO_PORT --eval "rs.status()" | grep -E "name|stateStr|optime"

echo ""
echo "✅ Replica set '${REPL_NAME}' đã được bật thành công!"
echo "👉 Bây giờ bạn có thể kết nối từ Mongoose bằng URI:"
echo "    mongodb://127.0.0.1:${MONGO_PORT}/mydb?replicaSet=${REPL_NAME}"