#!/usr/bin/env bash

scriptRoot="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"

if [ "$BUILDVARS_DONE" != 1 ]; then
    . $scriptRoot/buildvars-setup.sh $*
fi

export __BuildArch

# Prepare the system for building

prepare_managed_build()
{
    # Run Init-Tools to restore BuildTools and ToolRuntime
    $__ProjectRoot/init-tools.sh

    echo "Using CLI tools version:"
    ls "$__dotnetclipath/sdk"
}

build_managed_corert()
{
    __buildproj=$__ProjectRoot/build.proj
    __buildlog=$__ProjectRoot/msbuild.$__BuildArch.log

    __buildarch="$__BuildArch"
    if [ "$__buildarch" = "armel" ]; then
        __buildarch=arm
        __ExtraMsBuildArgs="$__ExtraMsBuildArgs /p:BinDirPlatform=armel"
    fi

    $__dotnetclipath/dotnet msbuild "$__buildproj" /m /nologo /verbosity:minimal "/fileloggerparameters:Verbosity=normal;LogFile=$__buildlog" /t:Restore /p:RepoPath=$__ProjectRoot /p:RepoLocalBuild="true" /p:NuPkgRid=$__NugetRuntimeId /p:OSGroup=$__BuildOS /p:Configuration=$__BuildType /p:Platform=$__buildarch /p:COMPUTERNAME=$(hostname) /p:USERNAME=$(id -un) $__UnprocessedBuildArgs $__ExtraMsBuildArgs
    export BUILDERRORLEVEL=$?

    echo

    # Pull the build summary from the log file
    tail -n 4 "$__buildlog"
    echo Build Exit Code = $BUILDERRORLEVEL
    if [ $BUILDERRORLEVEL != 0 ]; then
        exit $BUILDERRORLEVEL
    fi

    # Buildtools tooling is not capable of publishing netcoreapp currently. Use helper projects to publish skeleton of
    # the standalone app that the build injects actual binaries into later.
    $__dotnetclipath/dotnet restore $__sourceroot/ILCompiler/netcoreapp/ilc.csproj -r $__NugetRuntimeId
    export BUILDERRORLEVEL=$?
    if [ $BUILDERRORLEVEL != 0 ]; then
        exit $BUILDERRORLEVEL
    fi
    $__dotnetclipath/dotnet publish $__sourceroot/ILCompiler/netcoreapp/ilc.csproj -r $__NugetRuntimeId -o $__ProductBinDir/tools
    export BUILDERRORLEVEL=$?
    if [ $BUILDERRORLEVEL != 0 ]; then
        exit $BUILDERRORLEVEL
    fi
    chmod +x $__ProductBinDir/tools/ilc

    $__ProjectRoot/Tools/msbuild.sh "$__buildproj" /m /nologo /verbosity:minimal "/fileloggerparameters:Verbosity=normal;LogFile=$__buildlog" /t:Build /p:RepoPath=$__ProjectRoot /p:RepoLocalBuild="true" /p:NuPkgRid=$__NugetRuntimeId /p:OSGroup=$__BuildOS /p:Configuration=$__BuildType /p:Platform=$__buildarch /p:COMPUTERNAME=$(hostname) /p:USERNAME=$(id -un) $__UnprocessedBuildArgs $__ExtraMsBuildArgs
    export BUILDERRORLEVEL=$?

    echo

    # Pull the build summary from the log file
    tail -n 4 "$__buildlog"
    echo Build Exit Code = $BUILDERRORLEVEL
    if [ $BUILDERRORLEVEL != 0 ]; then
        exit $BUILDERRORLEVEL
    fi
}

# TODO It's a temporary decision because of there are no armel tizen nuget packages getting published today

get_official_cross_builds()
{
    if [ $__CrossBuild == 1 ]; then
        ID=
        case $__BuildArch in
            arm)
            ;;
            arm64)
            ;;
            armel)
                if [ -e $ROOTFS_DIR/etc/os-release ]; then
                    source $ROOTFS_DIR/etc/os-release
                fi
                ;;
        esac

        # only tizen case now
        if [ "$ID" != "tizen" ]; then
            return 0
        fi
        __tizenToolsRoot=${__ProjectRoot}/Tools/tizen
        __corefxsite="https://ci.dot.net/job/dotnet_corefx/job/master/job/"
        __coreclrsite="https://ci.dot.net/job/dotnet_coreclr/job/master/job/"
        __buildArchiveName="build.tar.gz"
        __systemNativeLibName="System.Native.a"
        __systemGlobNativeLibName="System.Globalization.Native.a"
        if [ $__BuildType = "Debug" ]; then
            __buildtype="debug"
        else
            __buildtype="release"
        fi
        __corefxsource="tizen_armel_cross_${__buildtype}/lastSuccessfulBuild/artifact/bin/${__buildArchiveName}"
        __coreclrsource="armel_cross_${__buildtype}_tizen/lastSuccessfulBuild/artifact/bin/Product/Linux.armel.${__BuildType}/${__systemGlobNativeLibName}"
        mkdir -p $__tizenToolsRoot

        (cd ${__tizenToolsRoot} && wget -t0 -N "${__corefxsite}${__corefxsource}")
        export BUILDERRORLEVEL=$?
        if [ $BUILDERRORLEVEL != 0 ]; then
            exit $BUILDERRORLEVEL
        fi
        tar xvf ${__tizenToolsRoot}/${__buildArchiveName} -C ${__tizenToolsRoot} ./${__systemNativeLibName}
        cp ${__tizenToolsRoot}/${__systemNativeLibName} $__ProjectRoot/bin/Linux.${__BuildArch}.${__BuildType}/framework

        (cd ${__tizenToolsRoot} && wget -t0 -N "${__coreclrsite}${__coreclrsource}")
        export BUILDERRORLEVEL=$?
        if [ $BUILDERRORLEVEL != 0 ]; then
            exit $BUILDERRORLEVEL
        fi
        cp ${__tizenToolsRoot}/${__systemGlobNativeLibName} $__ProjectRoot/bin/Linux.${__BuildArch}.${__BuildType}/framework
     fi
}

if $__buildmanaged; then

    # Prepare the system

    prepare_managed_build

    # Build the corert native components.

    build_managed_corert

    # Get cross builds from official sites

    get_official_cross_builds

    # Build complete
fi