# infra/docker-compose.yml
version: '3.8'

services:
  # Node 1: Primary Node (Bootstrap)
  cockroach-1:
    image: cockroachdb/cockroach:latest
    container_name: cockroach-1
    command: start --insecure --host=cockroach-1 --listen-addr=cockroach-1:26257 --advertise-addr=cockroach-1:26257 --join=cockroach-1:26257,cockroach-2:26257,cockroach-3:26257
    restart: always
    volumes:
      - cockroach1:/cockroach/data
    ports:
      - "26257:26257" # Default SQL Port
      - "8080:8080"  # Web UI Port (สำหรับดูสถานะ Cluster)

  # Node 2: Joining Node
  cockroach-2:
    image: cockroachdb/cockroach:latest
    container_name: cockroach-2
    command: start --insecure --host=cockroach-2 --listen-addr=cockroach-2:26257 --advertise-addr=cockroach-2:26257 --join=cockroach-1:26257,cockroach-2:26257,cockroach-3:26257
    restart: always
    volumes:
      - cockroach2:/cockroach/data

  # Node 3: Joining Node
  cockroach-3:
    image: cockroachdb/cockroach:latest
    container_name: cockroach-3
    command: start --insecure --host=cockroach-3 --listen-addr=cockroach-3:26257 --advertise-addr=cockroach-3:26257 --join=cockroach-1:26257,cockroach-2:26257,cockroach-3:26257
    restart: always
    volumes:
      - cockroach3:/cockroach/data

  # 4. Init Cluster (ตั้งค่าครั้งแรก)
  init-cluster:
    image: cockroachdb/cockroach:latest
    container_name: init-cluster
    command: init --insecure --host=cockroach-1:26257
    depends_on:
      - cockroach-1
      - cockroach-2
      - cockroach-3
    # ตั้งค่าให้ Container ตายหลังจากรัน init เสร็จ (ไม่รันซ้ำ)
    restart: "no"

  # Redis Service
  redis:
    image: redis:7-alpine
    container_name: redis
    ports:
      - "6379:6379"
    restart: always

  # Celery Flower Monitoring Service
  flower:
    build:
      context: ../backend
      dockerfile: Dockerfile.celery
    container_name: celery_flower
    ports:
      - "5555:5555"
    environment:
      CELERY_BROKER_URL: redis://redis:6379/0
      CELERY_APP: core
    volumes:
      - ../backend:/app
    working_dir: /app
    depends_on:
      - redis
      - celery_worker
    command: celery -A core flower --port=5555
    restart: always

  # Celery Worker Service
  celery_worker:
    build:
      context: ../backend
      dockerfile: Dockerfile.celery
    container_name: celery_worker
    volumes:
      - ../backend:/app
    command: celery -A core worker -l info # รัน worker process
    depends_on:
      - redis # Worker ต้องรอให้ Redis พร้อม
      - cockroach-1 # Worker อาจจะต้องเข้าถึง DB ด้วย
    # Environment Variables สำหรับการส่งอีเมล
    environment:
          MAILJET_SMTP_HOST: ${MAILJET_SMTP_HOST}
          MAILJET_SMTP_PORT: ${MAILJET_SMTP_PORT}
          MAILJET_API_KEY: ${MAILJET_API_KEY}
          MAILJET_SECRET_KEY: ${MAILJET_SECRET_KEY}
          DEFAULT_FROM_EMAIL: ${DEFAULT_FROM_EMAIL}
          # กำหนด HOST/PORT DB/Redis ซ้ำอีกครั้ง (เป็น Best Practice)
          REDIS_HOST: redis
          DB_HOST: cockroach-1

  # Backend/API (DRF)
  backend:
    build:
      context: ../backend
      dockerfile: Dockerfile
    volumes:
      - ../backend:/app
    ports:
      - "8000:8000"
    # เปลี่ยนให้พึ่งพา Node ฐานข้อมูลโดยตรง (เพราะ entrypoint script จะจัดการการรอ)
    depends_on:
      - cockroach-1
      - cockroach-2
      - cockroach-3
      - redis
    environment:
      DB_HOST: cockroach-1
      DB_PORT: 26257
      DB_NAME: my_db
      DB_USER: root
      DB_PASSWORD: ''

  # AI Model Serving Service (MONAI Inference)
  ai_model_server:
    build:
      context: ../ # อ้างอิงจาก Root Monorepo
      dockerfile: infra/docker/Dockerfile.ai
    container_name: ai_model_server
    volumes:
      - ../ai-medical:/app/ai-medical # Map โฟลเดอร์โค้ด AI
      # - /path/to/gpu/device:/dev/nvidia0 # Uncomment ถ้าใช้ GPU
    ports:
      - "8001:8001" # Port สำหรับ API Model Serving
    depends_on:
      - backend # ให้มั่นใจว่า Backend พร้อมใช้งานก่อน
    environment:
      # กำหนดตัวแปรสภาพแวดล้อมที่ AI Service ต้องใช้
      MODEL_STORAGE_URL: http://minio:9000/models/
      MODEL_FILE_NAME: monai_model_v1.pth

  # MinIO Service (S3-Compatible Object Storage)
  minio:
    image: minio/minio
    container_name: minio
    ports:
      - "9000:9000"  # API Port
      - "9001:9001"  # Console/Web UI Port
    volumes:
      - minio_data:/data
    environment:
      MINIO_ROOT_USER: minio_admin
      MINIO_ROOT_PASSWORD: minio_p@ssw0rd!
    command: server /data --console-address ":9001"
    restart: always

volumes:
  cockroach1:
  cockroach2:
  cockroach3:
  minio_data: