services:
  db:
    image: postgres:18
    environment:
      POSTGRES_USER: ${POSTGRES_USER:-fredgar}
      # Override in production via a .env next to this file or the shell environment.
      POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-fredgar}
      POSTGRES_DB: ${POSTGRES_DB:-fredgar}
    volumes:
      - postgres_data:/var/lib/postgresql
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U fredgar -d fredgar"]
      interval: 5s
      timeout: 5s
      retries: 10

  web:
    build:
      context: .
      dockerfile: Dockerfile
      target: runtime
    ports:
      - "127.0.0.1:${FREDGAR_API_PORT:-8000}:8000"
    environment:
      DATABASE_URL: postgresql://${POSTGRES_USER:-fredgar}:${POSTGRES_PASSWORD:-fredgar}@db:5432/${POSTGRES_DB:-fredgar}
      DJANGO_SECRET_KEY: ${DJANGO_SECRET_KEY:-dev-secret-key}
      DJANGO_DEBUG: ${DJANGO_DEBUG:-true}
      DJANGO_ALLOWED_HOSTS: ${DJANGO_ALLOWED_HOSTS:-*}
      # Include common Vite ports if dev server picks an alternate (e.g. 5174 when 5173 is taken)
      CORS_ALLOWED_ORIGINS: ${CORS_ALLOWED_ORIGINS:-http://localhost:${FREDGAR_FRONTEND_PORT:-5173},http://127.0.0.1:${FREDGAR_FRONTEND_PORT:-5173},http://localhost:5174,http://127.0.0.1:5174,http://localhost:5175,http://127.0.0.1:5175,http://localhost:${FREDGAR_FRONTEND_PROD_PORT:-8080},http://127.0.0.1:${FREDGAR_FRONTEND_PROD_PORT:-8080}}
      USER_AGENT_EMAIL: ${USER_AGENT_EMAIL:-}
      EDGAR_DATA_DIR: /app/data
      CELERY_BROKER_URL: ${CELERY_BROKER_URL:-redis://redis:6379/0}
      ENABLE_TIKA: ${ENABLE_TIKA:-false}
      TIKA_SERVER_ENDPOINT: ${TIKA_SERVER_ENDPOINT:-http://tika:9998}
      FRED_API_KEY: ${FRED_API_KEY:-}
    volumes:
      - ./data:/app/data
    depends_on:
      db:
        condition: service_healthy
      redis:
        condition: service_healthy
    healthcheck:
      test:
        [
          "CMD",
          "python",
          "-c",
          "import urllib.request; urllib.request.urlopen('http://127.0.0.1:8000/api/v1/health/')",
        ]
      interval: 10s
      timeout: 5s
      retries: 5
      start_period: 40s

  redis:
    image: redis:8-alpine
    healthcheck:
      test: ["CMD", "redis-cli", "ping"]
      interval: 5s
      timeout: 3s
      retries: 10

  worker:
    build:
      context: .
      dockerfile: Dockerfile
      target: runtime
    # Override the web entrypoint (which migrates) — the web service owns migrations.
    entrypoint: ["celery", "-A", "config", "worker", "-l", "info"]
    environment:
      DATABASE_URL: postgresql://${POSTGRES_USER:-fredgar}:${POSTGRES_PASSWORD:-fredgar}@db:5432/${POSTGRES_DB:-fredgar}
      DJANGO_SECRET_KEY: ${DJANGO_SECRET_KEY:-dev-secret-key}
      DJANGO_DEBUG: ${DJANGO_DEBUG:-true}
      USER_AGENT_EMAIL: ${USER_AGENT_EMAIL:-}
      EDGAR_DATA_DIR: /app/data
      CELERY_BROKER_URL: ${CELERY_BROKER_URL:-redis://redis:6379/0}
      ENABLE_TIKA: ${ENABLE_TIKA:-false}
      TIKA_SERVER_ENDPOINT: ${TIKA_SERVER_ENDPOINT:-http://tika:9998}
      FRED_API_KEY: ${FRED_API_KEY:-}
    volumes:
      - ./data:/app/data
    depends_on:
      db:
        condition: service_healthy
      redis:
        condition: service_healthy

  # Apache Tika content extraction (PDF/other). Start with: docker compose --profile tika up
  tika:
    profiles:
      - tika
    image: apache/tika:2.9.2.1
    ports:
      - "127.0.0.1:${FREDGAR_TIKA_PORT:-9998}:9998"

  test:
    profiles:
      - ci
    build:
      context: .
      dockerfile: Dockerfile
      target: test
    environment:
      DATABASE_URL: postgresql://${POSTGRES_USER:-fredgar}:${POSTGRES_PASSWORD:-fredgar}@db:5432/${POSTGRES_DB:-fredgar}
      PYTHONPATH: /app/src
      DJANGO_SETTINGS_MODULE: config.settings_test
    volumes:
      - ./data:/app/data
    depends_on:
      db:
        condition: service_healthy
    command:
      [
        "/bin/sh",
        "-c",
        "python src/manage.py migrate --noinput && exec /app/docker-ci.sh",
      ]

  # Vite dev server: browser hits :5173; /api is proxied to Django via API_PROXY_TARGET
  # (default http://web:8000; override from the shell or a root .env; see frontend/.env.docker.example).
  # Run: docker compose --profile dev up   (or from frontend/: npm run docker:dev)
  frontend:
    profiles:
      - dev
    image: node:24-trixie-slim
    working_dir: /app
    volumes:
      - ./frontend:/app
    ports:
      - "127.0.0.1:${FREDGAR_FRONTEND_PORT:-5173}:5173"
    environment:
      API_PROXY_TARGET: ${API_PROXY_TARGET:-http://web:8000}
    command:
      ["sh", "-c", "npm ci && npm run dev -- --host 0.0.0.0 --port 5173"]
    depends_on:
      web:
        condition: service_healthy

  frontend-prod:
    profiles:
      - prod
    build:
      context: .
      dockerfile: Dockerfile.frontend
    ports:
      - "127.0.0.1:${FREDGAR_FRONTEND_PROD_PORT:-8080}:80"
    depends_on:
      - web

volumes:
  postgres_data:
