#!/bin/bash

set -e

# augment path to help it find cmake via homebrew
PATH="/opt/homebrew/bin:/usr/local/bin:$PATH"

SCRIPT_DIR=$(dirname "$0")
source "${SCRIPT_DIR}/xcode_functions.sh"

function setup_build_environment ()
{
    pushd "$SCRIPT_DIR/.." > /dev/null
    ROOT_PATH="$PWD"
    popd > /dev/null

    CLANG="/usr/bin/xcrun clang"
    CC="${CLANG}"
    CPP="${CLANG} -E"

    MACOSX_DEPLOYMENT_TARGET="10.13"

    XCODE_MAJOR_VERSION=$(xcode_major_version)
    XCODE_MINOR_VERSION=$(xcode_minor_version)

    if [ "${XCODE_MAJOR_VERSION}" -lt "14" ]
    then
        echo "Requires Xcode 14 or newer."
        exit 1
    fi

    ARCHS="x86_64 arm64"
}

function setup ()
{
    if [ "${ROOT_PATH}/External/libgit2-mac/libgit2-mac.a" -nt "${ROOT_PATH}/External/libgit2" ]
    then
        echo "No update needed."
        exit 0
    fi

    LIBRARY_NAME="libgit2"
    LIB_PATH="${ROOT_PATH}/External/libgit2-mac"
    rm -rf "${LIB_PATH}"

    pushd "${ROOT_PATH}/External/libgit2" > /dev/null
}

function build_libgit2 ()
{
    rm -rf "build"
    mkdir "build"

    pushd "build" > /dev/null

    # install the each built arch somewhere sane
    INSTALL_PREFIX="${LIB_PATH}/${SDKNAME}-${ARCH}.sdk"

    mkdir -p "${INSTALL_PREFIX}"

    LOG="${INSTALL_PREFIX}/build-libgit2.log"
    echo "$LOG"

    cmake \
        -DBUILD_SHARED_LIBS:BOOL=OFF \
        -DCMAKE_PREFIX_PATH:PATH="${ROOT_PATH}/External/libssh2-mac/bin/${SDKNAME}-${ARCH}.sdk" \
        -DCMAKE_INSTALL_PREFIX:PATH="${INSTALL_PREFIX}/" \
        -DBUILD_CLAR:BOOL=OFF \
        -DTHREADSAFE:BOOL=ON \
        -DCMAKE_OSX_ARCHITECTURES:STRING="${ARCH}" \
        -DCMAKE_OSX_DEPLOYMENT_TARGET:STRING="${MACOSX_DEPLOYMENT_TARGET}" \
        .. >> "${LOG}" 2>&1
    cmake --build . --target install >> "${LOG}" 2>&1

    # push the built library into the list
    BUILT_LIB_PATHS+=("${INSTALL_PREFIX}/lib/libgit2.a")
    popd > /dev/null
}

function fat_binary ()
{
    echo "Building fat binary..."

    lipo -create "${BUILT_LIB_PATHS[@]}" -output "${ROOT_PATH}/External/libgit2-mac/libgit2-mac.a"

    echo "Building done."

    popd > /dev/null
}

setup_build_environment
setup

echo "Building for ${ARCHS}"

for ARCH in ${ARCHS}
do
    PLATFORM="macosx"
    SDKVERSION=$(macos_sdk_version)

    SDKNAME="${PLATFORM}${SDKVERSION}"
    SDKROOT="$(sdk_path ${SDKNAME})"

    echo "Building ${LIBRARY_NAME} for ${SDKNAME} ${ARCH}"
    echo "Please stand by..."

    # run the per arch build command
    build_libgit2
done

fat_binary

echo "libgit2 has been updated."
