x-app-env: &app-env
  ENVIRONMENT: dev
  APP_DEBUG: "true"
  LOGGING_DEBUG: "true"
  DB_HOST: postgres
  DB_PORT: "5432"
  DB_USER: resonance
  DB_PASSWORD: resonance
  DB_NAME: resonance
  DB_ECHO: "false"
  ENCRYPTION_BACKEND: plain
  SENTRY_DSN: ""

services:
  api:
    build:
      context: .
      dockerfile: Dockerfile.api
      args:
        version: ${VERSION:-local}
    ports:
      - "${PORT:-8080}:8080"
    environment:
      <<: *app-env
      UVICORN_WORKERS: 1
    depends_on:
      migrate:
        condition: service_completed_successfully

  migrate:
    build:
      context: .
      dockerfile: Dockerfile.api
      args:
        version: ${VERSION:-local}
    environment:
      <<: *app-env
    entrypoint: [ "uv", "run", "alembic", "upgrade", "head" ]
    depends_on:
      postgres:
        condition: service_healthy

  postgres:
    image: postgres:17-alpine
    environment:
      POSTGRES_USER: resonance
      POSTGRES_PASSWORD: resonance
      POSTGRES_DB: resonance
    ports:
      - "5432:5432"
    volumes:
      - postgres_data:/var/lib/postgresql/data
    healthcheck:
      test: [ "CMD-SHELL", "pg_isready -U resonance" ]
      interval: 5s
      timeout: 5s
      retries: 5

  postgres-test:
    image: postgres:17-alpine
    environment:
      POSTGRES_PASSWORD: postgres
      POSTGRES_DB: resonance_test
    healthcheck:
      test: [ "CMD-SHELL", "pg_isready -U postgres" ]
      interval: 5s
      timeout: 5s
      retries: 5

  lint-and-test:
    build:
      context: .
      dockerfile: Dockerfile.tests
    volumes:
      - ./reports:/app/reports
    environment:
      DB_HOST: postgres-test
      DB_PORT: "5432"
    depends_on:
      postgres-test:
        condition: service_healthy

volumes:
  postgres_data:
