#!/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.
#
# Build and install flatc (the FlatBuffers compiler) at the version Vortex requires, and make sure
# libclang is present.
#
# Vortex compiles its FlatBuffers schemas (.fbs) into Rust at build time, and
# cmake_modules/ThirdpartyToolchain.cmake requires a flatc whose version matches Vortex's
# flatbuffers crate (find_program(... flatc REQUIRED)). Distribution packages are too old, so the
# pinned version is built from source. Separately, Vortex's native dependencies run bindgen in
# their build scripts, which needs libclang at build time; some CI images do not ship it.
# flatc and libclang are build-time tools only; neither is needed at runtime.
#
# The dev container (see .devcontainer/) already has these preinstalled; this script is for the
# GitHub Actions runners and is called before ci/scripts/build_paimon.sh.
#
# Idempotent: a no-op when a matching flatc is already on PATH and libclang is already present.

set -eux

# Must match the flatbuffers crate version pinned by Vortex (see its Cargo.lock).
FLATBUFFERS_VERSION=${FLATBUFFERS_VERSION:-25.12.19}
FLATC_INSTALL_DIR=${FLATC_INSTALL_DIR:-"${HOME}/.local/bin"}

# Vortex's native dependencies invoke bindgen in their build scripts, which loads libclang at
# build time. Images that only carry GCC (e.g. the gcc8 test container) may lack it.
if ! ldconfig -p 2>/dev/null | grep -q 'libclang'; then
    if [[ "$(id -u)" -ne 0 ]] && command -v sudo >/dev/null 2>&1; then
        apt_prefix="sudo"
    else
        apt_prefix=""
    fi
    ${apt_prefix} apt-get update -y
    ${apt_prefix} apt-get install -y libclang-dev
fi

# Skip when a matching flatc is already available.
if command -v flatc >/dev/null 2>&1 &&
    [[ "$(flatc --version 2>/dev/null | awk '{print $NF}')" == "${FLATBUFFERS_VERSION}" ]]; then
    flatc --version
    exit 0
fi

workdir="$(mktemp -d)"
trap 'rm -rf "${workdir}"' EXIT

git clone --depth 1 --branch "v${FLATBUFFERS_VERSION}" \
    https://github.com/google/flatbuffers.git "${workdir}/flatbuffers"
cmake -S "${workdir}/flatbuffers" -B "${workdir}/build" \
    -DCMAKE_BUILD_TYPE=Release \
    -DFLATBUFFERS_BUILD_TESTS=OFF
cmake --build "${workdir}/build" --target flatc -j "$(nproc)"

mkdir -p "${FLATC_INSTALL_DIR}"
install -m 0755 "${workdir}/build/flatc" "${FLATC_INSTALL_DIR}/flatc"

# Make flatc discoverable by later steps: on PATH for find_program, and via FLATC for build_vortex.
export PATH="${FLATC_INSTALL_DIR}:${PATH}"
echo "${FLATC_INSTALL_DIR}" >>"${GITHUB_PATH:-/dev/null}" || true
echo "FLATC=${FLATC_INSTALL_DIR}/flatc" >>"${GITHUB_ENV:-/dev/null}" || true

"${FLATC_INSTALL_DIR}/flatc" --version
