#!/bin/bash
set -e

source dependencies/config_directories.sh
pushd build &>/dev/null

while getopts p: flag; do
    case "${flag}" in
    p)
        shift 2
        platform=${OPTARG}
        ;;
    \?) help ;;
    esac
done

help() {
    echo build.sh - build debug library
    echo build.sh clean - clean the build
    echo build.sh release - build release library
    echo build.sh -p ios release - build release ios library
    echo build.sh -p ios_sim release - build release ios simulator library
    echo build.sh -p android release - build release android library
    exit 1
}

# make sure argument is lowercase
OPTION="$(echo "$1" | tr '[A-Z]' '[a-z]')"

if [ "$OPTION" = 'help' ]; then
    help
else
    build() {
        echo "Building Rive for platform=$platform option=$OPTION"
        echo premake5 gmake2 --with_rive_text --with_rive_audio=system --with_rive_layout "$1"
        PREMAKE="premake5 gmake2 --with_rive_text --with_rive_audio=system --with_rive_layout $1"
        eval "$PREMAKE"
        if [ "$OPTION" = "clean" ]; then
            make clean
            make clean config=release
        elif [ "$OPTION" = "release" ]; then
            make config=release -j7
        else
            make config=debug -j7
        fi
    }

    case $platform in
    ios)
        echo "Building for iOS"
        export IOS_SYSROOT=$(xcrun --sdk iphoneos --show-sdk-path)
        build "--os=ios"
        if [ "$OPTION" = "clean" ]; then
            exit
        fi
        ;;
    ios_sim)
        echo "Building for iOS Simulator"
        export IOS_SYSROOT=$(xcrun --sdk iphonesimulator --show-sdk-path)
        build "--os=ios --variant=emulator"
        if [ "$OPTION" = "clean" ]; then
            exit
        fi
        ;;
    xros)
        echo "Building for visionOS"
        export XROS_SYSROOT=$(xcrun --sdk xros --show-sdk-path)
        build "--os=ios --variant=xros"
        if [ "$OPTION" = "clean" ]; then
            exit
        fi
        ;;
    xrsimulator)
        echo "Building for visionOS Simulator"
        export XROS_SYSROOT=$(xcrun --sdk xrsimulator --show-sdk-path)
        build "--os=ios --variant=xrsimulator"
        if [ "$OPTION" = "clean" ]; then
            exit
        fi
        ;;
    appletvos)
        echo "Building for tvOS"
        export APPLETVOS_SYSROOT=$(xcrun --sdk appletvos --show-sdk-path)
        build "--os=ios --variant=appletvos"
        if [ "$OPTION" = "clean" ]; then
            exit
        fi
        ;;
    appletvsimulator)
        echo "Building for tvOS Simulator"
        export APPLETVOS_SYSROOT=$(xcrun --sdk appletvsimulator --show-sdk-path)
        build "--os=ios --variant=appletvsimulator"
        if [ "$OPTION" = "clean" ]; then
            exit
        fi
        ;;
    # Android supports ABIs via a custom platform format:
    #   e.g. 'android.x86', 'android.x64', etc.
    android*)
        echo "Building for ${platform}"
        # Extract ABI from this opt by splitting on '.' character
        #   e.g. android.x86
        IFS="." read -ra strarr <<<"$platform"
        ARCH=${strarr[1]}
        build "--os=android --arch=${ARCH}"
        ;;
    macosx)
        echo "Building for macos"
        export MACOS_SYSROOT=$(xcrun --sdk macosx --show-sdk-path)
        build "--os=macosx --variant=runtime"
        if [ "$OPTION" = "clean" ]; then
            exit
        fi
        ;;
    *)
        build
        ;;
    esac
fi

popd &>/dev/null
