# Environment Variable Loading Order (first → last, later overrides earlier):
# 1. backend/.env.default - Default values for all settings
# 2. backend/.env - User's custom configuration (if exists)
# 3. environment key - Docker-specific overrides defined below
# 4. Shell environment - Variables exported before running docker compose
# 5. CLI arguments - docker compose run -e VAR=value

# Common backend environment - Docker service names
x-backend-env: &backend-env # Docker internal service hostnames (override localhost defaults)
  PYRO_HOST: "0.0.0.0"
  AGENTSERVER_HOST: rest_server
  SCHEDULER_HOST: scheduler_server
  DATABASEMANAGER_HOST: database_manager
  EXECUTIONMANAGER_HOST: executor
  NOTIFICATIONMANAGER_HOST: notification_server
  CLAMAV_SERVICE_HOST: clamav
  DB_HOST: db
  REDIS_HOST: redis
  RABBITMQ_HOST: rabbitmq
  # Override Supabase URL for Docker network
  SUPABASE_URL: http://kong:8000
  # Database connection string for Docker network
  # This cannot be constructed like in .env because we cannot interpolate values set here (DB_HOST)
  DATABASE_URL: postgresql://postgres:your-super-secret-and-long-postgres-password@db:5432/postgres?connect_timeout=60&schema=platform
  DIRECT_URL: postgresql://postgres:your-super-secret-and-long-postgres-password@db:5432/postgres?connect_timeout=60&schema=platform

# Common env_file configuration for backend services
x-backend-env-files: &backend-env-files
  env_file:
    - backend/.env.default # Base defaults (always exists)
    - path: backend/.env # User overrides (optional)
      required: false

services:
  migrate:
    build:
      context: ../
      dockerfile: autogpt_platform/backend/Dockerfile
      target: migrate
    command: ["sh", "-c", "poetry run prisma generate && poetry run gen-prisma-stub && poetry run prisma migrate deploy"]
    develop:
      watch:
        - path: ./
          target: autogpt_platform/backend/migrations
          action: rebuild
    depends_on:
      db:
        condition: service_healthy
    <<: *backend-env-files
    environment:
      <<: *backend-env
    networks:
      - app-network
    restart: on-failure
    healthcheck:
      test:
        [
          "CMD-SHELL",
          "poetry run prisma migrate status | grep -q 'No pending migrations' || exit 1",
        ]
      interval: 30s
      timeout: 10s
      retries: 3
      start_period: 5s

  redis:
    image: redis:latest
    ports:
      - "6379:6379"
    networks:
      - app-network
    healthcheck:
      test: ["CMD", "redis-cli", "ping"]
      interval: 10s
      timeout: 5s
      retries: 5
  rabbitmq:
    image: rabbitmq:management
    container_name: rabbitmq
    healthcheck:
      test: rabbitmq-diagnostics -q ping
      interval: 30s
      timeout: 10s
      retries: 5
      start_period: 10s
    <<: *backend-env-files
    environment:
      <<: *backend-env
    ports:
      - "5672:5672"
      - "15672:15672"

  rest_server:
    build:
      context: ../
      dockerfile: autogpt_platform/backend/Dockerfile
      target: server
    command: ["python", "-m", "backend.rest"]
    develop:
      watch:
        - path: ./
          target: autogpt_platform/backend/
          action: rebuild
    depends_on:
      redis:
        condition: service_healthy
      db:
        condition: service_healthy
      migrate:
        condition: service_completed_successfully
      rabbitmq:
        condition: service_healthy
    <<: *backend-env-files
    environment:
      <<: *backend-env
    ports:
      - "8006:8006"
    networks:
      - app-network
    logging:
      driver: json-file
      options:
        max-size: "10m"
        max-file: "3"

  executor:
    build:
      context: ../
      dockerfile: autogpt_platform/backend/Dockerfile
      target: server
    command: ["python", "-m", "backend.exec"]
    develop:
      watch:
        - path: ./
          target: autogpt_platform/backend/
          action: rebuild
    depends_on:
      redis:
        condition: service_healthy
      rabbitmq:
        condition: service_healthy
      db:
        condition: service_healthy
      migrate:
        condition: service_completed_successfully
      database_manager:
        condition: service_started
    <<: *backend-env-files
    environment:
      <<: *backend-env
    ports:
      - "8002:8002"
    networks:
      - app-network
    logging:
      driver: json-file
      options:
        max-size: "10m"
        max-file: "3"

  websocket_server:
    build:
      context: ../
      dockerfile: autogpt_platform/backend/Dockerfile
      target: server
    command: ["python", "-m", "backend.ws"]
    develop:
      watch:
        - path: ./
          target: autogpt_platform/backend/
          action: rebuild
    depends_on:
      db:
        condition: service_healthy
      redis:
        condition: service_healthy
      migrate:
        condition: service_completed_successfully
      database_manager:
        condition: service_started
    <<: *backend-env-files
    environment:
      <<: *backend-env
    ports:
      - "8001:8001"
    networks:
      - app-network
    logging:
      driver: json-file
      options:
        max-size: "10m"
        max-file: "3"

  database_manager:
    build:
      context: ../
      dockerfile: autogpt_platform/backend/Dockerfile
      target: server
    command: ["python", "-m", "backend.db"]
    develop:
      watch:
        - path: ./
          target: autogpt_platform/backend/
          action: rebuild
    depends_on:
      db:
        condition: service_healthy
      migrate:
        condition: service_completed_successfully
    <<: *backend-env-files
    environment:
      <<: *backend-env
    ports:
      - "8005:8005"
    networks:
      - app-network
    logging:
      driver: json-file
      options:
        max-size: "10m"
        max-file: "3"

  scheduler_server:
    build:
      context: ../
      dockerfile: autogpt_platform/backend/Dockerfile
      target: server
    command: ["python", "-m", "backend.scheduler"]
    develop:
      watch:
        - path: ./
          target: autogpt_platform/backend/
          action: rebuild
    depends_on:
      db:
        condition: service_healthy
      redis:
        condition: service_healthy
      rabbitmq:
        condition: service_healthy
      migrate:
        condition: service_completed_successfully
      database_manager:
        condition: service_started
    # healthcheck:
    #   test:
    #     [
    #       "CMD",
    #       "curl",
    #       "-f",
    #       "-X",
    #       "POST",
    #       "http://localhost:8003/health_check",
    #     ]
    #   interval: 10s
    #   timeout: 10s
    #   retries: 5
    <<: *backend-env-files
    environment:
      <<: *backend-env
    ports:
      - "8003:8003"
    networks:
      - app-network
    logging:
      driver: json-file
      options:
        max-size: "10m"
        max-file: "3"

  notification_server:
    build:
      context: ../
      dockerfile: autogpt_platform/backend/Dockerfile
      target: server
    command: ["python", "-m", "backend.notification"]
    develop:
      watch:
        - path: ./
          target: autogpt_platform/backend/
          action: rebuild
    depends_on:
      db:
        condition: service_healthy
      rabbitmq:
        condition: service_healthy
      migrate:
        condition: service_completed_successfully
      database_manager:
        condition: service_started
    <<: *backend-env-files
    environment:
      <<: *backend-env
    ports:
      - "8007:8007"
    networks:
      - app-network
    logging:
      driver: json-file
      options:
        max-size: "10m"
        max-file: "3"
  frontend:
    build:
      context: ../
      dockerfile: autogpt_platform/frontend/Dockerfile
      target: prod
      args:
        NEXT_PUBLIC_PW_TEST: ${NEXT_PUBLIC_PW_TEST:-false}
    depends_on:
      db:
        condition: service_healthy
      migrate:
        condition: service_completed_successfully
    ports:
      - "3000:3000"
    networks:
      - app-network
    logging:
      driver: json-file
      options:
        max-size: "10m"
        max-file: "3"
    # Load environment variables in order (later overrides earlier)
    env_file:
      - path: ./frontend/.env.default # Base defaults (always exists)
      - path: ./frontend/.env # User overrides (optional)
        required: false
    environment:
      # Server-side environment variables (Docker service names)
      # These override the localhost URLs from env files when running in Docker
      AUTH_CALLBACK_URL: http://rest_server:8006/auth/callback
      SUPABASE_URL: http://kong:8000
      AGPT_SERVER_URL: http://rest_server:8006/api
      AGPT_WS_SERVER_URL: ws://websocket_server:8001/ws
networks:
  app-network:
    driver: bridge
