# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements.  See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership.  The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License.  You may obtain a copy of the License at
#
#   http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied.  See the License for the
# specific language governing permissions and limitations
# under the License.

version: '3.9'

services:
  # These reuse Arrow's images for simplicity. You won't be able to
  # build the image from here.

  ############################ Documentation ###################################

  docs:
    image: condaforge/mambaforge:latest
    volumes:
      - .:/adbc:delegated
    command: |
      /bin/bash -c 'git config --global --add safe.directory /adbc && source /opt/conda/etc/profile.d/conda.sh && mamba create -y -n adbc -c conda-forge go --file /adbc/ci/conda_env_cpp.txt --file /adbc/ci/conda_env_docs.txt --file /adbc/ci/conda_env_python.txt && conda activate adbc && env ADBC_USE_ASAN=0 ADBC_USE_UBSAN=0 /adbc/ci/scripts/cpp_build.sh /adbc /adbc/build && env CGO_ENABLED=1 /adbc/ci/scripts/go_build.sh /adbc /adbc/build && /adbc/ci/scripts/python_build.sh /adbc /adbc/build && /adbc/ci/scripts/docs_build.sh /adbc'

  golang-sqlite-flightsql:
    image: ${REPO}:golang-${GO}-sqlite-flightsql
    build:
      context: .
      cache_from:
        - ${REPO}:golang-${GO}-sqlite-flightsql
      dockerfile: ci/docker/golang-flightsql-sqlite.dockerfile
      args:
        GO: ${GO}
        ARROW_MAJOR_VERSION: ${ARROW_MAJOR_VERSION}
    ports:
      - 8080:8080

  ############################ Java JARs ######################################

  java-dist:
    image: ${ARCH}/maven:${MAVEN}-jdk-${JDK}
    volumes:
      - .:/adbc:delegated
    command: "/bin/bash -c '/adbc/ci/scripts/java_build.sh /adbc /adbc/dist && /adbc/ci/scripts/java_test.sh /adbc'"

  ############################ Python conda ##################################

  # Must be run as docker-compose run -e HOST_USER_ID=$(id -u) python-conda
  python-conda:
    image: condaforge/linux-anvil-cos7-x86_64
    volumes:
      - .:/adbc:delegated
    command: "/bin/bash -c 'conda config --remove channels defaults && /adbc/ci/scripts/python_conda_build.sh /adbc ${ARCH_CONDA_FORGE}.yaml /adbc/build'"

  python-conda-test:
    image: condaforge/mambaforge
    volumes:
      - .:/adbc:delegated
    command: "/bin/bash -c '/adbc/ci/scripts/python_conda_test.sh /adbc /adbc/build'"

  ############################ Python sdist ##################################

  python-sdist:
    image: ${ARCH}/python:${PYTHON}
    volumes:
      - .:/adbc:delegated
    command: "/bin/bash -c 'git config --global --add safe.directory /adbc && source /adbc/ci/scripts/python_sdist_build.sh /adbc'"

  python-sdist-test:
    image: ${REPO}:${ARCH}-python-${PYTHON}-wheel-manylinux-${MANYLINUX}-vcpkg-${VCPKG}-adbc
    build:
      context: .
      cache_from:
        - ${REPO}:${ARCH}-python-${PYTHON}-wheel-manylinux-${MANYLINUX}-vcpkg-${VCPKG}-adbc
      dockerfile: ci/docker/python-wheel-manylinux.dockerfile
      args:
        ARCH: ${ARCH}
        MANYLINUX: ${MANYLINUX}
        PYTHON: ${PYTHON}
        REPO: ${REPO}
        VCPKG: ${VCPKG}
    volumes:
      - .:/adbc:delegated
    command: "'git config --global --add safe.directory /adbc && source /adbc/ci/scripts/python_sdist_test.sh ${ARCH} /adbc'"

  ############################ Python wheels ##################################

  python-wheel-manylinux:
    image: ${REPO}:${ARCH}-python-${PYTHON}-wheel-manylinux-${MANYLINUX}-vcpkg-${VCPKG}-adbc
    build:
      context: .
      cache_from:
        - ${REPO}:${ARCH}-python-${PYTHON}-wheel-manylinux-${MANYLINUX}-vcpkg-${VCPKG}-adbc
      dockerfile: ci/docker/python-wheel-manylinux.dockerfile
      args:
        ARCH: ${ARCH}
        MANYLINUX: ${MANYLINUX}
        PYTHON: ${PYTHON}
        REPO: ${REPO}
        VCPKG: ${VCPKG}
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - .:/adbc
    # Must set safe.directory so miniver won't error when calling git
    command: "'git config --global --add safe.directory /adbc && git config --global --get safe.directory && /adbc/ci/scripts/python_wheel_unix_build.sh ${ARCH} /adbc /adbc/build'"

  python-wheel-manylinux-test:
    image: ${ARCH}/python:${PYTHON}-slim
    volumes:
      - .:/adbc:delegated
    command: /adbc/ci/scripts/python_wheel_unix_test.sh /adbc

  ###################### Test database environments ############################

  postgres_test:
      container_name: adbc_postgres_test
      image: postgres:latest
      environment:
        POSTGRES_USER: postgres
        POSTGRES_PASSWORD: password
      ports:
        - "5432:5432"

  dremio:
    container_name: adbc-dremio
    image: dremio/dremio-oss:latest
    environment:
      DREMIO_JAVA_EXTRA_OPTS: "-Ddebug.addDefaultUser=true -Ddremio.eula.disabled=true"
    healthcheck:
      test: [ "CMD", "curl", "--fail", "http://localhost:9047" ]
      interval: 10s
      timeout: 10s
      retries: 5
      start_period: 40s
    ports:
      - "9047:9047"
      - "32010:32010"
      - "31010:31010"
      - "45678:45678"

  dremio-init:
    container_name: adbc-dremio-init
    image: ${REPO}:adbc-dremio-init
    build:
      context: .
      cache_from:
        - ${REPO}:adbc-dremio-init
      dockerfile: ci/docker/dremio-init.dockerfile
    environment:
      dremio_url: http://dremio:9047
    depends_on:
      dremio:
        condition: service_healthy
    entrypoint: "/init/bootstrap.sh"
    volumes:
      - "./ci/scripts/integration/dremio:/init"
