# Copyright 2016 The Fuchsia Authors. All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
#
# 1.  Redistributions of source code must retain the above copyright
#     notice, this list of conditions and the following disclaimer.
# 2.  Redistributions in binary form must reproduce the above copyright
#     notice, this list of conditions and the following disclaimer in the
#     documentation and/or other materials provided with the distribution.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY
# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

update_prebuilts=false
run_after_building=false
build_dir=Debug
build_tag=debug
build_flag=--debug
dry_run=""

while getopts ":hcrumpl" arg; do
  case $arg in
    c) # Do a clean build
      clean_build=true
      ;;
    m) # Clean CMake files
      clean_cmake=true
      ;;
    r) # Run after building
      run_after_building=true
      ;;
    p) # Release build
      build_dir=Release
      build_flag=--release
      build_tag=debug
      ;;
    l) # Update prebuilds.
      update_prebuilts=true
      ;;
    h | *) # Display help.
      usage
      exit 0
      ;;
  esac
done

source $(dirname $BASH_SOURCE)/common.sh

set -e

cd $WEBKIT_ROOT

declare -x PKG_CONFIG_PATH=$FUCHSIA_CROSS_ROOT/lib/pkgconfig

WEBKIT_BUILD=$WEBKIT_ROOT/WebKitBuild/$build_dir
FUCHSIA_SRC_ROOT=`cd $WEBKIT_ROOT/../../;pwd`
FUCHSIA_BUILD=`cd $FUCHSIA_SRC_ROOT/out/debug-x86-64/;pwd`

maybe_clean_webkit

MINIBROWSER=$WEBKIT_BUILD/bin/MiniBrowser
MINIBROWSER_STRIPPED=$WEBKIT_BUILD/bin/MiniBrowserStripped
LIBJSC=$WEBKIT_BUILD/lib/libJavaScriptCore.so
LIBJSC_STRIPPED=$WEBKIT_BUILD/lib/libJavaScriptCoreStripped.so
LIBWEBKIT_LEGACY=$WEBKIT_BUILD/lib/libWebKitLegacy.so
LIBWEBKIT_LEGACY_STRIPPED=$WEBKIT_BUILD/lib/libWebKitLegacyStripped.so
MINIBROWSERFS=$WEBKIT_BUILD/extrajsc.bootfs
JSC=$WEBKIT_BUILD/bin/jsc
JSC_STRIPPED=$WEBKIT_BUILD/bin/jsc_stripped

$WEBKIT_ROOT/Tools/Scripts/build-webkit $build_flag --fuchsia \
    --no-jit \
    --no-web-sockets \
    --no-3d-rendering \
    --no-css-compositing \
    --video \
    --video-track \
    --cmakeargs="-DCMAKE_TOOLCHAIN_FILE=$script_dir/FuchsiaClangToolchain.txt -DENABLE_XSLT=OFF -DENABLE_DRAG_SUPPORT=OFF -DENABLE_STATIC_JSC=ON"

MANIFEST_FILE=$WEBKIT_BUILD/minibrowser_manifest.txt

cd $script_dir

if [ $run_after_building == true ] ; then
    echo user.bootfs: > $MANIFEST_FILE
    echo bin/mb=$MINIBROWSER_STRIPPED >> $MANIFEST_FILE
    echo bin/jsc=$JSC_STRIPPED >> $MANIFEST_FILE
    echo bin/netstack=$FUCHSIA_BUILD/netstack >> $MANIFEST_FILE
    echo lib/libc++abi.so.1=$FUCHSIA_SYSROOT/lib/libc++abi.so.1 >> $MANIFEST_FILE
    echo lib/libc++.so.2=$FUCHSIA_SYSROOT/lib/libc++.so.2 >> $MANIFEST_FILE
    echo lib/libunwind.so.1=$FUCHSIA_SYSROOT/lib/libunwind.so.1 >> $MANIFEST_FILE
    echo lib/libcrypto.so=$FUCHSIA_OUT_DIR/debug-x86-64/libcrypto.so >> $MANIFEST_FILE
    echo lib/libssl.so=$FUCHSIA_OUT_DIR/debug-x86-64/libssl.so >> $MANIFEST_FILE
    echo docs/input.html=$script_dir/input.html >> $MANIFEST_FILE
    echo docs/hello.html=$script_dir/hello.html >> $MANIFEST_FILE
    echo docs/IMG_6285.jpg=$script_dir/IMG_6285.jpg >> $MANIFEST_FILE
    echo docs/cursor32.png=$script_dir/cursor32.png >> $MANIFEST_FILE
    echo data/webkit/Roboto-Regular.ttf=$script_dir/Roboto-Regular.ttf >> $MANIFEST_FILE
    find $WEBKIT_ROOT/Source/WebCore/Resources -print | while read line; do
    if [ -f "$line" ]
    then
      partial_line=${line#$WEBKIT_ROOT/Source/WebCore/Resources/}
      echo docs/WebCoreResources/$partial_line="$line" >> $MANIFEST_FILE
    fi
    done

    $ZIRCON_STRIP $MINIBROWSER -o $MINIBROWSER_STRIPPED
    $ZIRCON_STRIP $JSC -o $JSC_STRIPPED

    $ZIRCON_MKBOOTFS -c -o $MINIBROWSERFS $FUCHSIA_OUT_DIR/build-zircon/build-x86/bootdata.bin $MANIFEST_FILE
fi

if [ $update_prebuilts == true ] ; then
    echo updating prebuilts
    mkdir -p $FUCHSIA_SRC_ROOT/topaz/runtime/web_view/prebuilt/include
    cp $WEBKIT_ROOT/Source/WebKit/fuchsia/WebView.h $FUCHSIA_SRC_ROOT/topaz/runtime/web_view/prebuilt/include/

    mkdir -p $FUCHSIA_SRC_ROOT/topaz/runtime/web_view/prebuilt/x86-64/lib
    webkit_libs="libWTF.a libWebKitLegacy.a libJavaScriptCore.a libWebCore.a libWebCoreDerivedSources.a"
    for one_lib in $webkit_libs
    do
     echo "Updating $one_lib"
     cp $WEBKIT_BUILD/lib/$one_lib $FUCHSIA_SRC_ROOT/topaz/runtime/web_view/prebuilt/x86-64/lib/$one_lib
    done
    webkit_dep_libs="libcairo.a libcurl.a libpng.a libpixman-1.a libz.a libfreetype.a libxml2.a libicuuc.a libicudata.a libicui18n.a libexpat.a libsqlite3.a libturbojpeg.a libharfbuzz.a libharfbuzz-icu.a"
    for one_lib in $webkit_dep_libs
    do
     echo "Updating $one_lib"
     cp $FUCHSIA_CROSS_ROOT/lib/$one_lib $FUCHSIA_SRC_ROOT/topaz/runtime/web_view/prebuilt/x86-64/lib/$one_lib
    done
fi

if [ $run_after_building == true ] ; then
  if [ $os_name  == "Darwin" ] ; then
    defaults write com.google.fuchsia.FBTV addr2line "$ZIRCON_ROOT/prebuilt/downloads/x86_64-elf-6.2.0-Darwin-x86_64/bin/x86_64-elf-addr2line"
    defaults write com.google.fuchsia.FBTV app_name MiniBrowser
    defaults write com.google.fuchsia.FBTV build_dirs -array $WEBKIT_BUILD/bin $WEBKIT_BUILD/lib $FUCHSIA_SYSROOT/lib $ZIRCON_ROOT/build-x86/ulib/musl $ZIRCON_ROOT/build-x86/ulib/driver
  fi
  PATH=$FUCHSIA_SRC_ROOT/buildtools/qemu/bin:$PATH $FUCHSIA_SRC_ROOT/scripts/run-zircon-x86-64 -x $MINIBROWSERFS -g $debug_options -q $FUCHSIA_SRC_ROOT/buildtools/qemu/bin
fi
