#!/bin/bash

export SCRIPT_DIR=$(dirname "$0")

##
## Configuration Variables
##

SCHEMES="$@"

config ()
{
    # The workspace to build.
    #
    # If not set and no workspace is found, the -workspace flag will not be passed
    # to `xctool`.
    #
    # Only one of `XCWORKSPACE` and `XCODEPROJ` needs to be set. The former will
    # take precedence.
    : ${XCWORKSPACE=}

    # The project to build.
    #
    # If not set and no project is found, the -project flag will not be passed
    # to `xctool`.
    #
    # Only one of `XCWORKSPACE` and `XCODEPROJ` needs to be set. The former will
    # take precedence.
    : ${XCODEPROJ="ReactiveCocoaFramework/ReactiveCocoa.xcodeproj"}

    # A bootstrap script to run before building.
    #
    # If this file does not exist, it is not considered an error.
    : ${BOOTSTRAP="$SCRIPT_DIR/bootstrap"}

    # Extra options to pass to xctool.
    : ${XCTOOL_OPTIONS="RUN_CLANG_STATIC_ANALYZER=NO"}

    # A whitespace-separated list of default schemes to build.
    #
    # Individual names can be quoted to avoid word splitting.
    : ${SCHEMES:=$(xcodebuild -list -project "$XCODEPROJ" 2>/dev/null | awk -f "$SCRIPT_DIR/schemes.awk")}
    
    export XCWORKSPACE
    export XCODEPROJ
    export BOOTSTRAP
    export XCTOOL_OPTIONS
    export SCHEMES
}

##
## Build Process
##

main ()
{
    config

    if [ -f "$BOOTSTRAP" ]
    then
        echo "*** Bootstrapping..."
        "$BOOTSTRAP" || exit $?
    fi

    echo "*** The following schemes will be built:"
    echo "$SCHEMES" | xargs -n 1 echo "  "
    echo

    echo "$SCHEMES" | xargs -n 1 | (
        local status=0

        while read scheme
        do
            build_scheme "$scheme" || status=1
        done

        exit $status
    )
}

find_pattern ()
{
    ls -d $1 2>/dev/null | head -n 1
}

run_xctool ()
{
    if [ -n "$XCWORKSPACE" ]
    then
        xctool -workspace "$XCWORKSPACE" $XCTOOL_OPTIONS "$@" 2>&1
    elif [ -n "$XCODEPROJ" ]
    then
        xctool -project "$XCODEPROJ" $XCTOOL_OPTIONS "$@" 2>&1
    else
        echo "*** No workspace or project file found."
        exit 1
    fi
}

parse_build ()
{
    awk -f "$SCRIPT_DIR/xctool.awk" 2>&1 >/dev/null
}

build_scheme ()
{
    local scheme=$1

    echo "*** Cleaning $scheme..."
    run_xctool -scheme "$scheme" clean >/dev/null || exit $?

    echo "*** Building and testing $scheme..."
    echo

    local sdkflag=
    local action=test

    # Determine whether we can run unit tests for this target.
    run_xctool -scheme "$scheme" run-tests | parse_build

    local awkstatus=$?

    if [ "$awkstatus" -ne "0" ]
    then
        # Unit tests aren't supported.
        action=build
    fi

    if [ "$awkstatus" -eq "1" ]
    then
        # Build for iOS.
        sdkflag="-sdk iphonesimulator"
    fi

    run_xctool $sdkflag -scheme "$scheme" $action | awk '{ print; } /Failed to query the list of test cases in the test bundle/ { exit 1; }'

    local awkstatus=$?
    local result=${PIPESTATUS[0]}

    if [ "$awkstatus" -eq "1" ]
    then
        echo
        echo "*** Mac application tests are currently buggy, so they have been skipped."
        echo "*** See https://github.com/facebook/xctool/issues/243 for more information."
        echo
        return 0
    fi

    return $result
}

export -f build_scheme
export -f run_xctool
export -f parse_build

main
