version: "3.8"

services:
  # PostgreSQL Database
  db:
    image: postgres:15-alpine
    container_name: bookhoard_db
    environment:
      POSTGRES_DB: bookhoard
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: ${DBPASS}
      COOKIE_SECURE: false # make true in production with HTTPS
    volumes:
      - postgres_data:/var/lib/postgresql/data
      - ./database/schema:/docker-entrypoint-initdb.d
      # Make other volumes as needed
      - ./uploads:/app/uploads
    ports:
      - "5432:5432"
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U postgres"]
      interval: 5s
      timeout: 5s
      retries: 3
    env_file:
      - .env

  # Bookhoard Application
  app:
    build:
      context: .
      dockerfile: ./Dockerfile
    container_name: bookhoard
    environment:
      # Database Configuration
      DATABASE_HOST: db
      DATABASE_PORT: 5432
      DATABASE_USER: postgres
      DATABASE_PASSWORD: ${DBPASS}
      DATABASE_NAME: bookhoard

      # Application Configuration
      JWT_SECRET: ${JWT_SECRET}
      SERVER_PORT: 8765
      # IMPORTANT: Device sync requires full URL with protocol
      # Local: http://localhost:8765
      # Local network: http://192.168.1.X:8765
      # Domain: https://bookhoard.example.com
      BASE_URL: http://localhost:${SERVER_PORT}

      # Rate Limiting Configuration
      TEST_MODE: ${TEST_MODE:-false}
      RATE_LIMIT_ENABLED: ${RATE_LIMIT_ENABLED:-true}
      REQUESTS_PER_MINUTE: ${REQUESTS_PER_MINUTE:-10}

      # Conversion Service Configuration
      BOOKHOARD_CONVERSION_CACHE_DIR: ${BOOKHOARD_CONVERSION_CACHE_DIR:-/app/cache/kepub}
      BOOKHOARD_CONVERSION_TOOL: ${BOOKHOARD_CONVERSION_TOOL:-/usr/bin/kepubify}
      BOOKHOARD_CONVERSION_CACHE_TTL: ${BOOKHOARD_CONVERSION_CACHE_TTL:-24h}
    ports:
      - "8765:8765"
    depends_on:
      db:
        condition: service_healthy
    volumes:
      - ./uploads:/app/uploads
      - bookhoard_conversion_cache:/app/cache/kepub
    healthcheck:
      test: ["CMD-SHELL", "curl -f http://localhost:8765/health || exit 1"]
      interval: 10s
      timeout: 5s
      retries: 3
      start_period: 10s

  # Integration Tests - runs against containerized app and db
  tests:
    build:
      context: .
      dockerfile: ./Dockerfile
      target: test-runner
    container_name: bookhoard_tests
    environment:
      # Database Configuration
      DATABASE_HOST: db
      DATABASE_PORT: 5432
      DATABASE_USER: postgres
      DATABASE_PASSWORD: ${DBPASS}
      DATABASE_NAME: bookhoard
      COOKIE_SECURE: false

      # Application Configuration
      JWT_SECRET: ${JWT_SECRET}
      SERVER_PORT: 8765

      # Test Configuration
      TEST_MODE: "true"
      RATE_LIMIT_ENABLED: "false"
      REQUESTS_PER_MINUTE: 1000

      # Conversion Service Configuration
      BOOKHOARD_CONVERSION_CACHE_DIR: /app/cache/kepub
      BOOKHOARD_CONVERSION_TOOL: /usr/bin/kepubify
      BOOKHOARD_CONVERSION_CACHE_TTL: 24h

      # Test upload path (inside container)
      TEST_UPLOAD_PATH: /app/uploads
    depends_on:
      db:
        condition: service_healthy
      app:
        condition: service_healthy
    volumes:
      - ./uploads:/app/uploads
      - bookhoard_conversion_cache:/app/cache/kepub
    profiles:
      - tests

# Named Volumes
volumes:
  postgres_data:
  bookhoard_conversion_cache:
