---
services:

  update-lockfile:
    platform: linux/amd64
    build:
      context: .
      dockerfile: Dockerfile
      target: update-lockfile
    secrets:
      - github_auth
    volumes:
      - ./composer.lock:/var/app/composer.lock

  format:
    platform: linux/amd64
    build:
      context: .
      dockerfile: Dockerfile
      target: format
      secrets:
        - github_auth
    volumes:
      - ./src:/var/app/src
      - ./tests:/var/app/tests
      - ./encode_tracks.php:/var/app/encode_tracks.php
      - ./deliver_tracks.php:/var/app/deliver_tracks.php
      - ./scripts/obtain_encoding_orders.php:/var/app/scripts/obtain_encoding_orders.php

  cli:
    platform: linux/amd64
    build:
      context: ./localdev/cli
    environment:
      - LOCAL_STACK
      - TEST_DD_DB_HOST=test-dd-db
      - TEST_DD_DB_USERNAME=${TEST_DD_USER}
      - TEST_DD_DB_PASSWORD=${TEST_DD_PASS}
      - TEST_AR_DB_HOST=test-ar-db
      - TEST_AR_DB_USERNAME=${TEST_DB_USER}
      - TEST_AR_DB_PASSWORD=${TEST_DB_PASS}
    env_file:
      - .env
    volumes:
      - ./localdev/data_seeds:/var/app/data_seeds
    depends_on:
      encode:
        condition: service_healthy
      deliver:
        condition: service_healthy

  base:
    platform: linux/amd64
    build:
      context: .
      dockerfile: Dockerfile
      target: base
    volumes:
      - ./tmp:/tmp

  cache:
    image: redis:7
    healthcheck:
      test: ["CMD-SHELL", "redis-cli -h localhost ping | grep 'PONG' || exit 1"]
      interval: 5s
      timeout: 10s
      retries: 3
      start_period: 3s

  encode:
    platform: linux/amd64
    build:
      context: .
      dockerfile: Dockerfile
      target: encode
      secrets:
        - github_auth
    environment:
      - ECHO_STEPS=1
      - LOG_LEVEL=7
      - PHP_ENTRYPOINT=encode_tracks.php
      - SERVICE_NAME=vector-encoder
      - PRINT_CONFIG=true
      - AWS_ACCESS_KEY_ID
      - AWS_SECRET_ACCESS_KEY
      - AWS_SESSION_TOKEN
      - AWS_REGION
      - LOCAL_STACK=${LOCAL_STACK:-false}
      - TEST_DD_DB_HOST=test-dd-db
      - TEST_DD_DB_USERNAME=${TEST_DD_USER}
      - TEST_DD_DB_PASSWORD=${TEST_DD_PASS}
      - TEST_AR_DB_HOST=test-ar-db
      - TEST_AR_DB_USERNAME=${TEST_DB_USER}
      - TEST_AR_DB_PASSWORD=${TEST_DB_PASS}
      - DD_DB_HOST
      - DD_DB_RW_USERNAME
      - DD_DB_RW_PASSWORD
      - DD_DB_RO_USERNAME
      - DD_DB_RO_PASSWORD
      - DD_DB_EO_USERNAME
      - DD_DB_EO_PASSWORD
      - AR_DB_HOST
      - AR_DB_USERNAME
      - AR_DB_PASSWORD
    env_file:
      - .env
    volumes:
      - ./src:/var/app/src
      - ./encode_tracks.php:/var/app/encode_tracks.php
    depends_on:
      moto:
        condition: service_healthy
      cache:
        condition: service_healthy
      test-dd-db:
        condition: service_healthy
      test-ar-db:
        condition: service_healthy
    healthcheck:
      test: ["CMD", "pgrep", "php"]
      interval: 1s
      timeout: 60s

  deliver:
    platform: linux/amd64
    build:
      context: .
      dockerfile: Dockerfile
      target: deliver
      secrets:
        - github_auth
    environment:
      - ECHO_STEPS=1
      - LOG_LEVEL=7
      - PHP_ENTRYPOINT=deliver_tracks.php
      - SERVICE_NAME=vector-delivery
      - EFS_PATH=/mnt/efs
      - PRINT_CONFIG=true
      - AWS_ACCESS_KEY_ID
      - AWS_SECRET_ACCESS_KEY
      - AWS_SESSION_TOKEN
      - AWS_REGION
      - LOCAL_STACK=${LOCAL_STACK:-false}
      - TEST_DD_DB_HOST=test-dd-db
      - TEST_DD_DB_USERNAME=${TEST_DD_USER}
      - TEST_DD_DB_PASSWORD=${TEST_DD_PASS}
      - TEST_AR_DB_HOST=test-ar-db
      - TEST_AR_DB_USERNAME=${TEST_DB_USER}
      - TEST_AR_DB_PASSWORD=${TEST_DB_PASS}
    env_file:
      - .env
    volumes:
      - ./src:/var/app/src
      - ./deliver_tracks.php:/var/app/deliver_tracks.php
      - delivery-efs:/mnt/efs
    depends_on:
      moto:
        condition: service_healthy
      cache:
        condition: service_healthy
      test-dd-db:
        condition: service_healthy
      test-ar-db:
        condition: service_healthy
    healthcheck:
      test: ["CMD", "pgrep", "php"]
      interval: 1s
      timeout: 60s

  obtain-eo:
    platform: linux/amd64
    build:
      context: .
      dockerfile: Dockerfile
      target: obtain-eo
      secrets:
        - github_auth
    environment:
      - ECHO_STEPS=1
      - LOG_LEVEL=100
      - PHP_ENTRYPOINT=scripts/obtain_encoding_orders.php

  unit-lint:
    extends:
      file: docker-compose.unit-lint.yaml
      service: unit-lint
    environment:
      - CREATE_SNAPSHOTS=false
      - SERVICE_NAME=vector-worker-unit-tests

  integration:
    platform: linux/amd64
    build:
      context: .
      target: integration
      secrets:
        - github_auth
    environment:
      - Environment=qa
      - AWS_ACCESS_KEY_ID
      - AWS_SECRET_ACCESS_KEY
      - AWS_SESSION_TOKEN
      - AWS_REGION
      - SERVICE_NAME=vector-worker
      - POLL_INTERVAL_SECONDS=30
      - MAX_POLL_ATTEMPTS=20
      - RUN_E2E_TESTS

  test-gcs:
    image: fsouza/fake-gcs-server
    expose:
      - "4443"
      - "8000"
    command: -scheme both -external-url http://test-gcs:8000
    healthcheck:
      test: [
        "CMD",
        "wget",
        "--no-verbose",
        "--spider",
        "-q",
        "http://localhost:8000/_internal/healthcheck"
      ]
      interval: 1s
      timeout: 60s

  moto:
    image: motoserver/moto:5.1.2
    healthcheck:
      test: ["CMD", "curl", "-sf", "http://localhost:5000/moto-api/"]
      interval: 1s
      timeout: 60s

  test-sftp:
    platform: linux/amd64
    image: atmoz/sftp
    volumes:
      - ./localdev/ssh/client_id_rsa.pub:/home/username/.ssh/keys/id_rsa.pub:ro
      - ./localdev/ssh/server_rsa_key:/etc/ssh/ssh_host_rsa_key
    command: username:password:::direct_delivery_unit_tests
    healthcheck:
      test: ["CMD", "pgrep", "sshd"]
      interval: 1s
      timeout: 60s

  # do not specify platform, let host choose
  # platform emulation breaks this container
  # (e.g. Rosetta x86 emulation on Apple Silicon)
  test-ftp:
    image: garethflowers/ftp-server:0.9.2
    environment:
      FTP_USER: username
      FTP_PASS: ${TEST_FTP_PASS}
    command: >-
      sh -c "PUBLIC_IP=$$(hostname -i | awk '{print $$1}')
      /docker-entrypoint.sh /usr/sbin/vsftpd"
    expose:
      - "21"
      - "40000-40009"
    healthcheck:
      test: [
        "CMD-SHELL",
        "grep -q ':0015 ' /proc/net/tcp /proc/net/tcp6 2>/dev/null"
      ]
      interval: 1s
      timeout: 5s
      retries: 60
      start_period: 30s

  test-dd-db:
    platform: linux/amd64
    image:
      086679231553.dkr.ecr.us-east-1.amazonaws.com/docker-database-images:direct-delivery-cluster
    pull_policy: always
    environment:
      DB_USER: ${TEST_DD_USER}
      DB_PASSWORD: ${TEST_DD_PASS}
    command: >
      --disable-log-bin
    tmpfs:
      - /var/lib/mysql
    healthcheck:
      interval: 1s
      timeout: 5s
      retries: 120

  test-ar-db:
    platform: linux/amd64
    image:
      086679231553.dkr.ecr.us-east-1.amazonaws.com/docker-database-images:art-relations
    pull_policy: always
    environment:
      DB_USER: ${TEST_DB_USER}
      DB_PASSWORD: ${TEST_DB_PASS}
    command: >
      --disable-log-bin
    tmpfs:
      - /var/lib/mysql
    healthcheck:
      interval: 1s
      timeout: 5s
      retries: 180
  update-snapshots:
    extends:
      file: docker-compose.unit-lint.yaml
      service: unit-lint
    environment:
      - SKIP_LINT=true
      - SKIP_COVERAGE=true
      - UPDATE_SNAPSHOTS=true
    volumes:
      - ./tests:/var/app/tests

volumes:
  delivery-efs:

secrets:
  github_auth:
    environment: GITHUB_AUTH
