#!/bin/bash

usage() {
  echo "Usage: $0 GECKO_DIR GAIA_DIR MULET_TARBALL_URL [--release]"
  echo "  --release"
  echo "    use xpi name with version and platform"
}

if [ "$#" -lt 3 ]; then
  usage
  exit
fi

if [ -z $1 ] || [ ! -d $1 ]; then
  usage
  echo "First argument should be path to a gecko checkout"
  exit
fi
GECKO_DIR=$1

if [ -z $2 ] || [ ! -d $2 ]; then
  usage
  echo "Second argument should be path to a gaia checkout"
  exit
fi
GAIA_DIR=$2

url_re='^(http|https|ftp)://.*(tar.bz2|zip|dmg)'
if [ -z $3 ] || ! [[ $3 =~ $url_re ]] && ! [ -f $3 ] ; then
  usage
  echo "Third argument should be URL or a path to mulet tarball"
  exit
fi
MULET=$3

RELEASE=
if [ "$4" == "--release" ]; then
  RELEASE=1
fi

if [[ $MULET =~ 'linux-x86_64' ]] ; then
  PLATFORM=linux64
elif [[ $MULET =~ 'linux' ]] ; then
  PLATFORM=linux
elif [[ $MULET =~ 'win32' ]] ; then
  PLATFORM=win32
elif [[ $MULET =~ 'mac' ]] ; then
  PLATFORM=mac64
fi
if [ -z $PLATFORM ]; then
  echo "Unable to compute platform out of mulet package filename: $MULET"
  exit
fi
echo "PLATFORM: $PLATFORM"

VERSION=$(sed -nE "s/MOZ_B2G_VERSION=([0-9]+\.[0-9]+).*prerelease/\1/p" $GECKO_DIR/b2g/confvars.sh)
re='^[0-9]\.[0-9]$'
if ! [[ $VERSION =~ $re ]] ; then
  echo "Invalid b2g version: $VERSION"
  exit
fi
echo "B2G VERSION: $VERSION"

set -ex

WORK_DIR=simulator

rm -rf $WORK_DIR/
mkdir -p $WORK_DIR

# If mulet isn't a file, that's an URL and needs to be downloaded first
if [ ! -f $MULET ]; then
  URL=$MULET
  MULET=$WORK_DIR/$(basename $URL)
  wget -O $MULET $URL
fi

# Compute absolute path for all path variables
realpath() {
    [[ $1 = /* ]] && echo "$1" || echo "$PWD/${1#./}"
}
MULET=$(realpath $MULET)
WORK_DIR=$(realpath $WORK_DIR)
GAIA_DIR=$(realpath $GAIA_DIR)
GECKO_DIR=$(realpath $GECKO_DIR)
SIM_DIR=$(realpath $GECKO_DIR/b2g/simulator)
ADDON_DIR=$(realpath $WORK_DIR/addon)

mkdir -p $ADDON_DIR

# Uncompress the Mulet package
if [[ $MULET =~ .dmg$ ]]; then
  mkdir -p $WORK_DIR/dmg
  if [ "$(uname)" == "Darwin" ]; then
    hdiutil attach -verbose -noautoopen -mountpoint $WORK_DIR/dmg "$MULET"
    # Wait for files to show up
    # hdiutil uses a helper process, diskimages-helper, which isn't always done its
    # work by the time hdiutil exits. So we wait until something shows up in the
    # mnt directory. Due to the async nature of diskimages-helper, the best thing
    # we can do is to make sure the glob() rsync is making can find files.
    i=0
    TIMEOUT=900
    while [ "$(echo $WORK_DIR/dmg/*)" == "$WORK_DIR/dmg/*" ]; do
      if [ $i -gt $TIMEOUT ]; then
        echo "Unable to mount dmg file."
        exit 1
      fi
      sleep 1
      i=$(expr $i + 1)
    done
    # Now we can copy everything out of the $MOUNTPOINT directory into the target directory
    mkdir -p $ADDON_DIR/firefox
    # Try builds are not branded as Firefox
    if [ -d $WORK_DIR/dmg/Nightly.app ]; then
      cp -r $WORK_DIR/dmg/Nightly.app $ADDON_DIR/firefox/FirefoxNightly.app
    else
      cp -r $WORK_DIR/dmg/FirefoxNightly.app $ADDON_DIR/firefox/
    fi
    hdiutil detach $WORK_DIR/DMG
  else
    7z x -o$WORK_DIR/dmg $MULET
    mkdir -p $WORK_DIR/dmg/hfs
    sudo mount -o loop,ro -t hfsplus  $WORK_DIR/dmg/2.hfs $WORK_DIR/dmg/hfs
    mkdir -p $ADDON_DIR/firefox
    # Try builds are not branded as Firefox
    if [ -d $WORK_DIR/dmg/hfs/Nightly.app ]; then
      cp -r $WORK_DIR/dmg/hfs/Nightly.app $ADDON_DIR/firefox/FirefoxNightly.app
    else
      cp -r $WORK_DIR/dmg/hfs/FirefoxNightly.app $ADDON_DIR/firefox/
    fi
    sudo umount $WORK_DIR/dmg/hfs
  fi
  rm -rf $WORK_DIR/dmg
elif [[ $MULET =~ .zip$ ]]; then
  unzip $MULET -d $ADDON_DIR/
elif [[ $MULET =~ .tar.bz2 ]]; then
  (cd $ADDON_DIR/ && tar jxvf $MULET)
else
  echo "Unsupported file extension for $MULET"
  exit
fi

# Build a gaia profile specific to the simulator in order to:
# - disable the FTU
# - set custom prefs to enable devtools debugger server
# - set custom settings to disable lockscreen and screen timeout
# - only ship production apps
NOFTU=1 GAIA_APP_TARGET=production SETTINGS_PATH=$SIM_DIR/custom-settings.json make -j1 -C $GAIA_DIR profile
mv $GAIA_DIR/profile $ADDON_DIR/
cat $SIM_DIR/custom-prefs.js >> $ADDON_DIR/profile/user.js

if [ -f $ADDON_DIR/firefox/application.ini ]; then
  APPLICATION_INI=$ADDON_DIR/firefox/application.ini
elif [ -f $ADDON_DIR/firefox/FirefoxNightly.app/Contents/Resources/application.ini ]; then
  APPLICATION_INI=$ADDON_DIR/firefox/FirefoxNightly.app/Contents/Resources/application.ini
else
  echo "Unable to find application.ini file"
  exit
fi
MOZ_APP_BUILDID=$(sed -n "s/BuildID=\([0-9]\{8\}\)/\1/p" $APPLICATION_INI)
echo "BUILDID $MOZ_APP_BUILDID -- VERSION $VERSION"

XPI_NAME=fxos-simulator-$VERSION.$MOZ_APP_BUILDID-$PLATFORM.xpi
ADDON_ID=fxos_$(echo $VERSION | sed "s/\./_/")_simulator@mozilla.org
ADDON_VERSION=$VERSION.$MOZ_APP_BUILDID
ADDON_NAME="Firefox OS $VERSION Simulator"
ADDON_DESCRIPTION="a Firefox OS $VERSION Simulator"

echo "ADDON_ID: $ADDON_ID"
echo "ADDON_VERSION: $ADDON_VERSION"

FTP_ROOT_PATH=/pub/mozilla.org/labs/fxos-simulator
UPDATE_PATH=$VERSION/$PLATFORM
UPDATE_LINK=https://ftp.mozilla.org$FTP_ROOT_PATH/$UPDATE_PATH/$XPI_NAME
UPDATE_URL=https://ftp.mozilla.org$FTP_ROOT_PATH/$UPDATE_PATH/update.rdf

# Replace all template string in install.rdf
sed -e "s/@ADDON_VERSION@/$ADDON_VERSION/" \
    -e "s/@ADDON_ID@/$ADDON_ID/" \
    -e "s#@ADDON_UPDATE_URL@#$UPDATE_URL#" \
    -e "s/@ADDON_NAME@/$ADDON_NAME/" \
    -e "s/@ADDON_DESCRIPTION@/$ADDON_DESCRIPTION/" \
    $SIM_DIR/install.rdf.in > $ADDON_DIR/install.rdf

# copy all useful addon file
cp $SIM_DIR/icon.png $ADDON_DIR/
cp $SIM_DIR/icon64.png $ADDON_DIR/

# Create the final zip .xpi file
mkdir -p artifacts
FILE_NAME=fxos-simulator.xpi
if [ "$RELEASE" ]; then
  FILE_NAME=$XPI_NAME
fi
(cd $ADDON_DIR && zip -r - .) > artifacts/$FILE_NAME

