#!/usr/bin/env bash
#
# 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.

set -ex

arrow_dir=${1}
build_dir=${2}

source_dir=${arrow_dir}/python
python_build_dir=${build_dir}/python

: "${BUILD_DOCS_PYTHON:=OFF}"

if [ -x "$(command -v git)" ]; then
  git config --global --add safe.directory "${arrow_dir}"
fi

if [ -n "${ARROW_PYTHON_VENV:-}" ]; then
  # We don't need to follow this external file.
  # See also: https://www.shellcheck.net/wiki/SC1091
  #
  # shellcheck source=/dev/null
  . "${ARROW_PYTHON_VENV}/bin/activate"
fi

case "$(uname)" in
  Linux)
    n_jobs=$(nproc)
    ;;
  Darwin)
    n_jobs=$(sysctl -n hw.ncpu)
    ;;
  MINGW*)
    n_jobs=${NUMBER_OF_PROCESSORS:-1}
    ;;
  *)
    n_jobs=${NPROC:-1}
    ;;
esac

if [ -n "${CONDA_PREFIX}" ]; then
  echo -e "===\n=== Conda environment for build\n==="
  conda list
fi

export CMAKE_BUILD_PARALLEL_LEVEL=${n_jobs}
export CMAKE_GENERATOR=${CMAKE_GENERATOR:-Ninja}
export PYARROW_WITH_ACERO=${ARROW_ACERO:-OFF}
export PYARROW_WITH_AZURE=${ARROW_AZURE:-OFF}
export PYARROW_WITH_CUDA=${ARROW_CUDA:-OFF}
export PYARROW_WITH_DATASET=${ARROW_DATASET:-ON}
export PYARROW_WITH_FLIGHT=${ARROW_FLIGHT:-OFF}
export PYARROW_WITH_GANDIVA=${ARROW_GANDIVA:-OFF}
export PYARROW_WITH_GCS=${ARROW_GCS:-OFF}
export PYARROW_WITH_HDFS=${ARROW_HDFS:-ON}
export PYARROW_WITH_ORC=${ARROW_ORC:-OFF}
export PYARROW_WITH_PARQUET=${ARROW_PARQUET:-OFF}
export PYARROW_WITH_PARQUET_ENCRYPTION=${PARQUET_REQUIRE_ENCRYPTION:-ON}
export PYARROW_WITH_S3=${ARROW_S3:-OFF}
export PYARROW_WITH_SUBSTRAIT=${ARROW_SUBSTRAIT:-OFF}

: "${CMAKE_PREFIX_PATH:=${ARROW_HOME}}"
export CMAKE_PREFIX_PATH
export LD_LIBRARY_PATH=${ARROW_HOME}/lib:${LD_LIBRARY_PATH}
export DYLD_LIBRARY_PATH=${ARROW_HOME}/lib${DYLD_LIBRARY_PATH:+:${DYLD_LIBRARY_PATH}}

# https://github.com/apache/arrow/issues/41429
# TODO: We want to out-of-source build. This is a workaround. We copy
# all needed files to the build directory from the source directory
# and build in the build directory.
rm -rf "${python_build_dir}"
cp -aL "${source_dir}" "${python_build_dir}"
pushd "${python_build_dir}"
# - Cannot use build isolation as we want to use specific dependency versions
#   (e.g. Numpy, Pandas) on some CI jobs.
${PYTHON:-python} -m pip install --no-deps --no-build-isolation -vv -C cmake.build-type="${CMAKE_BUILD_TYPE:-Debug}" .
popd

if [ "${BUILD_DOCS_PYTHON}" == "ON" ]; then
  # https://github.com/apache/arrow/issues/41429
  # TODO: We want to out-of-source build. This is a workaround.
  #
  # Copy docs/source because the "autosummary_generate = True"
  # configuration generates files to docs/source/python/generated/.
  rm -rf "${python_build_dir}/docs/source"
  mkdir -p "${python_build_dir}/docs"
  cp -a "${arrow_dir}/docs/source" "${python_build_dir}/docs/"
  rm -rf "${python_build_dir}/format"
  cp -a "${arrow_dir}/format" "${python_build_dir}/"
  rm -rf "${python_build_dir}/cpp/examples"
  mkdir -p "${python_build_dir}/cpp"
  cp -a "${arrow_dir}/cpp/examples" "${python_build_dir}/cpp/"
  rm -rf "${python_build_dir}/ci"
  cp -a "${arrow_dir}/ci/" "${python_build_dir}/"
  export ARROW_CPP_DOXYGEN_XML=${build_dir}/cpp/apidoc/xml
  pushd "${build_dir}"
  sphinx-build \
    -j auto \
    -b html \
    "${python_build_dir}/docs/source" \
    "${build_dir}/docs"
  popd
fi
