#!/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.


# Print commands and their arguments as they are executed.
if [ "${DEPLOY_QUIET:-0}" != "1" ]; then
    set -x
fi

# Cause the script to exit if a single command fails.
set -e

# Prefer Python from $PYTHON_PATH if it exists, otherwise use default python
if [ -n "$PYTHON_PATH" ] && [ -x "$PYTHON_PATH" ]; then
  PYTHON_CMD="$PYTHON_PATH"
  PIP_CMD="$PYTHON_PATH -m pip"
else
  PYTHON_CMD="python"
  PIP_CMD="pip"
fi

ROOT="$(git rev-parse --show-toplevel)"
cd "$ROOT"

bump_version() {
  python "$ROOT/ci/release.py" bump_version -l all -version "$1"
}

bump_java_version() {
  python "$ROOT/ci/release.py" bump_version -l java -version "$1"
}

# Replicates the behavior of _update_python_version in ci/release.py
parse_py_version() {
  local version="$1"
  if [ -z "$version" ]; then
    # Get the latest tag from the current Git repository
    version=$(git describe --tags --abbrev=0)
  fi
  # Check if the tag starts with 'v' and strip it
  if [[ $version == v* ]]; then
    version="${version:1}"
  fi
  version="${version//-alpha/a}"
  version="${version//-beta/b}"
  version="${version//-rc/rc}"
  version="${version//-/}"
  echo "$version"
}

bump_py_version() {
  local version
  version=$(parse_py_version "$1")
  python "$ROOT/ci/release.py" bump_version -l python -version "$version"
}

bump_javascript_version() {
  python "$ROOT/ci/release.py" bump_version -l javascript -version "$1"
}

deploy_jars() {
  cd "$ROOT/java"
  mvn -T10 clean deploy --no-transfer-progress -DskipTests -Prelease
}

build_pyfory() {
  echo "$($PYTHON_CMD -V), path $(which "$PYTHON_CMD")"
  install_pyarrow
  $PIP_CMD install cython wheel pytest
  pushd "$ROOT/python"
  $PIP_CMD list
  echo "Install pyfory"
  # Fix strange installed deps not found
  $PIP_CMD install setuptools -U

  if [[ "$OSTYPE" == "darwin"* ]]; then
    MACOS_VERSION=$(sw_vers -productVersion | cut -d. -f1-2)
    echo "MACOS_VERSION: $MACOS_VERSION"
    if [[ "$MACOS_VERSION" == "13"* ]]; then
      export MACOSX_DEPLOYMENT_TARGET=10.13
      $PYTHON_CMD setup.py bdist_wheel --plat-name macosx_10_13_x86_64 --dist-dir="$ROOT/dist"
    else
      $PYTHON_CMD setup.py bdist_wheel --dist-dir="$ROOT/dist"
    fi
  elif [[ "$OSTYPE" == "msys" || "$OSTYPE" == "win32" ]]; then

    # Windows tends to drop alpha/beta markers - force it through setup.cfg
    if [ -n "$GITHUB_REF_NAME" ]; then
      version=$(parse_py_version "$GITHUB_REF_NAME")
      echo "Using version from GITHUB_REF_NAME: $version"
      echo "[metadata]" > setup.cfg
      echo "version = $version" >> setup.cfg
    fi

    $PYTHON_CMD setup.py bdist_wheel --dist-dir="$ROOT/dist"
    # Clean up
    rm setup.cfg
  else
    $PYTHON_CMD setup.py bdist_wheel --dist-dir="$ROOT/dist"
  fi

  if [ -n "$PLAT" ]; then
    # In manylinux container, repair the wheel to embed shared libraries
    # and rename the wheel with the manylinux tag.
    PYARROW_LIB_DIR=$($PYTHON_CMD -c 'import pyarrow; print(":".join(pyarrow.get_library_dirs()))')
    export LD_LIBRARY_PATH="$PYARROW_LIB_DIR:$LD_LIBRARY_PATH"
    auditwheel repair "$ROOT/dist"/pyfory-*-linux_*.whl --plat "$PLAT" --exclude '*arrow*' --exclude '*parquet*' --exclude '*numpy*' -w "$ROOT/dist"
    rm "$ROOT/dist"/pyfory-*-linux_*.whl
  elif [[ "$OSTYPE" == "darwin"* ]]; then
    echo "Skip macos wheel repair"
  elif [[ "$OSTYPE" == "msys" || "$OSTYPE" == "win32" ]]; then
    echo "Skip windows wheel repair"
  fi

  echo "Wheels for $PYTHON_CMD:"
  ls -l "$ROOT/dist"
  popd
}

install_pyarrow() {
  pyversion=$($PYTHON_CMD -V | cut -d' ' -f2)
  if [[ $pyversion  ==  3.13* ]]; then
    $PIP_CMD install pyarrow==18.0.0
    $PIP_CMD install numpy
  else
    $PIP_CMD install pyarrow==15.0.0
    # Automatically install numpy
  fi
}

deploy_scala() {
  echo "Start to build jars"
  sbt +publishSigned
  echo "Start to prepare upload"
  sbt sonatypePrepare
  echo "Start to upload jars"
  sbt sonatypeBundleUpload
  echo "Deploy scala jars succeed!"
}

case "$1" in
java) # Deploy jars to maven repository.
  deploy_jars
  ;;
*)
  echo "Execute command $*"
  "$@"
  ;;
esac
