#!/bin/bash
set -e
set +x

if [[ ("$1" == "-h") || ("$1" == "--help") ]]; then
  echo "usage: $(basename "$0") [output-absolute-path] [--universal]"
  echo
  echo "Generate distributable .zip archive from ./checkout folder that was previously built."
  echo
  exit 0
fi

ZIP_PATH=$1
if [[ $ZIP_PATH != /* ]]; then
  echo "ERROR: path $ZIP_PATH is not absolute"
  exit 1
fi
if [[ $ZIP_PATH != *.zip ]]; then
  echo "ERROR: path $ZIP_PATH must have .zip extension"
  exit 1
fi
if [[ -f $ZIP_PATH ]]; then
  echo "ERROR: path $ZIP_PATH exists; can't do anything."
  exit 1
fi
if ! [[ -d $(dirname "$ZIP_PATH") ]]; then
  echo "ERROR: folder for path $($ZIP_PATH) does not exist."
  exit 1
fi

IS_UNIVERSAL_BUILD=""
if [[ $2 == "--universal" ]]; then
  IS_UNIVERSAL_BUILD=1
fi

main() {
  if [[ ! -z "${WK_CHECKOUT_PATH}" ]]; then
    cd "${WK_CHECKOUT_PATH}"
    echo "WARNING: checkout path from WK_CHECKOUT_PATH env: ${WK_CHECKOUT_PATH}"
  else
    cd "$HOME/webkit"
  fi

  set -x
  if is_mac; then
    createZipForMac
  elif is_linux; then
    createZipForLinux
  elif is_win; then
    createZipForWindows
  else
    echo "ERROR: cannot upload on this platform!" 1>&2
    exit 1;
  fi
}


createZipForLinux() {
  # create a TMP directory to copy all necessary files
  local tmpdir=$(mktemp -d -p "$(pwd)/WebKitBuild" -t webkit-deploy-XXXXXXXXXX)
  mkdir -p "$tmpdir"

  # copy runner
  cp -t "$tmpdir" "$SCRIPTS_DIR"/pw_run.sh
  # copy protocol
  node "$SCRIPTS_DIR"/concat_protocol.js > "$tmpdir"/protocol.json

  # Generate and unpack MiniBrowser bundles for each port
  for port in gtk wpe; do
    if [[ -n "${IS_UNIVERSAL_BUILD}" ]]; then
      Tools/Scripts/generate-bundle \
          --syslibs=bundle-all \
          --bundle=MiniBrowser --release \
          --platform=${port} --destination="${tmpdir}"
    else
      WEBKIT_OUTPUTDIR=$(pwd)/WebKitBuild/${port^^} \
      Tools/Scripts/generate-bundle \
          --bundle=MiniBrowser --release \
          --platform=${port} --destination="${tmpdir}"
    fi

    unzip "${tmpdir}"/MiniBrowser_${port}_release.zip -d "${tmpdir}"/minibrowser-${port}
    rm -f "${tmpdir}"/MiniBrowser_${port}_release.zip
  done

  cd "$tmpdir"

  if [[ -n "${IS_UNIVERSAL_BUILD}" ]]; then
    # De-duplicate common files: convert to relative symlinks identical files (same hash).
    # We apply this algorithm only to unified build since in JHBuild WPE/Minibrowser
    # and GTK/Minibrowser executables are identical and should not be symlinked.
    rdfind -deterministic true -makesymlinks true -makehardlinks false -makeresultsfile false .
    symlinks -rc .
  fi

  # zip resulting directory and cleanup TMP.
  zip --symlinks -r "$ZIP_PATH" ./
  cd -
  rm -rf "$tmpdir"
}

createZipForWindows() {
  # create a TMP directory to copy all necessary files
  local tmpdir="/tmp/webkit-deploy-$(date +%s)"
  mkdir -p "$tmpdir"

  cp -t "$tmpdir" ./WebKitLibraries/win/bin64/*.dll
  cd WebKitBuild/Release/bin64
  cp -r -t "$tmpdir" WebKit.resources
  cp -t "$tmpdir" JavaScriptCore.dll PlaywrightLib.dll WTF.dll WebKit2.dll libEGL.dll libGLESv2.dll
  cp -t "$tmpdir" Playwright.exe WebKitNetworkProcess.exe WebKitWebProcess.exe
  cd -
  cd "$(printMSVCRedistDir)"
  cp -t "$tmpdir" msvcp140.dll vcruntime140.dll vcruntime140_1.dll msvcp140_2.dll
  cd -

  # copy protocol
  node "$SCRIPTS_DIR"/concat_protocol.js > "$tmpdir"/protocol.json
  # tar resulting directory and cleanup TMP.
  cd "$tmpdir"
  zip -r "$ZIP_PATH" ./
  cd -
  rm -rf "$tmpdir"
}

createZipForMac() {
  # create a TMP directory to copy all necessary files
  local tmpdir=$(mktemp -d)

  # copy all relevant files
  ditto {./WebKitBuild/Release,"$tmpdir"}/com.apple.WebKit.GPU.xpc
  ditto {./WebKitBuild/Release,"$tmpdir"}/com.apple.WebKit.Networking.xpc
  ditto {./WebKitBuild/Release,"$tmpdir"}/com.apple.WebKit.WebContent.xpc
  ditto {./WebKitBuild/Release,"$tmpdir"}/JavaScriptCore.framework
  ditto {./WebKitBuild/Release,"$tmpdir"}/libANGLE-shared.dylib
  ditto {./WebKitBuild/Release,"$tmpdir"}/libwebrtc.dylib
  ditto {./WebKitBuild/Release,"$tmpdir"}/Playwright.app
  ditto {./WebKitBuild/Release,"$tmpdir"}/WebCore.framework
  ditto {./WebKitBuild/Release,"$tmpdir"}/WebInspectorUI.framework
  ditto {./WebKitBuild/Release,"$tmpdir"}/WebKit.framework
  ditto {./WebKitBuild/Release,"$tmpdir"}/WebKitLegacy.framework
  ditto {"$SCRIPTS_DIR","$tmpdir"}/pw_run.sh
  # copy protocol
  node "$SCRIPTS_DIR"/concat_protocol.js > "$tmpdir"/protocol.json

  # Remove all broken symlinks. @see https://github.com/microsoft/playwright/issues/5472
  find "${tmpdir}" -type l ! -exec test -e {} \; -print | xargs rm

  # zip resulting directory and cleanup TMP.
  ditto -c -k "$tmpdir" "$ZIP_PATH"
  rm -rf "$tmpdir"
}

trap "cd $(pwd -P)" EXIT
cd "$(dirname "$0")"
SCRIPTS_DIR="$(pwd -P)"
source "${SCRIPTS_DIR}/../utils.sh"

main "$@"
