#!/bin/bash

set -e

case x"$1" in
x-h|x--help|xhelp)
    echo "Usage: wine/make_package [-dbg] [-win32] [-win64] [--no-build] [--force-build] [--package-only] [--msi-package] [--tar-package] [--no-package]"
    exit 0
    ;;
esac

if [ ! -e client.mk ]
then
    echo "Script must be ran from top source directory"
    exit 1
fi

target_abi=win32
target_arch=x86
pkg_type=msi

while [ "$1" != "" ]
do
    case $1 in
    -dbg)
        debug="-dbg"
        pkg_type=tar
        ;;
    -win32) 
        target_abi=win32
        target_arch=x86
        ;;
    -win64)
        target_abi=win64
        target_arch=x86_64
        ;;
    --no-build)
        no_build=yes
        ;;
    --force-build)
        force_build=yes
        ;;
    --package-only)
        no_build=yes
        no_xulinstaller=yes
        ;;
    --msi-package)
        pkg_type=msi
        ;;
    --tar-package)
        pkg_type=tar
        ;;
    --no-package)
        pkg_type=none
        ;;
    *)
        echo "make_package: Unknown option: $1"
        exit 1
        ;;
    esac
    shift
done

src_dir=$(pwd)
version=$(head -n 1 $src_dir/wine/VERSION)
dist_basename=wine_gecko-$version-$target_arch$debug
build_dir=$src_dir/../$dist_basename

if [ "$force_build" = "yes" ]
then
    echo "make_package: Removing build directory..."
    rm -rf $build_dir
fi

if [ "$no_build" != "yes" ]
then
    echo "make_package: Building xulrunner..."
    MOZCONFIG=$(pwd)/wine/mozconfig-$target_abi$debug WINE_GECKO_OBJDIR=$build_dir make -f client.mk build
fi

if [ "$no_xulinstaller" != "yes" ]
then
    echo "make_package: Preparing Wine Gecko files..."
    rm -rf $build_dir/dist/wine_gecko
    make -C $build_dir/xulrunner/installer
    cp -r $build_dir/dist/xulrunner $build_dir/dist/wine_gecko
    echo -n "Wine Gecko $version" > $build_dir/dist/wine_gecko/VERSION

    for f in $(cat wine/remove-files.txt); do
        rm -f $build_dir/dist/wine_gecko/$f
    done
else
    if [ ! -e $build_dir/dist/wine_gecko/VERSION ]
    then
        echo "make_package: --package-only option requires complete build"
        exit 1
    fi
fi

case $pkg_type in
msi)
    echo "make_package: Creating MSI file..."

    msi_dir=$build_dir/dist/msi
    rm -rf $msi_dir
    mkdir $msi_dir

    cd $build_dir/dist

    datetime=`date "+%Y\/%m\/%d %k:%m:%S"`
    keypath=`find wine_gecko -mindepth 1 -maxdepth 1 -type f | sort | head -1 | cut -d'/' -f2- | sed -e "s/\//!/g"`
    cabfile=winegecko.cab

    if [ "$target_abi" = "win64" ]
    then
        msi_sysdir=System64Folder
        msi_productname="Wine Gecko (64-bit)"
        msi_targetcpu="x64;0"
        msi_productcode=$(head -n 3 $src_dir/wine/VERSION |tail -n 1)
    else
        msi_sysdir=SystemFolder
        msi_productname="Wine Gecko (32-bit)"
        msi_targetcpu="Intel;0"
        msi_productcode=$(head -n 2 $src_dir/wine/VERSION |tail -n 1)
    fi

    mkdir $msi_dir/tables
    for f in $src_dir/wine/tables/*.in
    do
        filename=$(basename $f)
        cat $src_dir/wine/tables/$filename \
            |sed -e "s/@VERSION@/$version/g" \
            |sed -e "s/@KEYPATH@/$keypath/g" \
            |sed -e "s/@DATETIME@/$datetime/g" \
            |sed -e "s/@SYSTEMFOLDER@/$msi_sysdir/g" \
            |sed -e "s/@PRODUCTCODE@/$msi_productcode/g" \
            |sed -e "s/@PRODUCTNAME@/$msi_productname/g" \
            |sed -e "s/@TARGETCPU@/$msi_targetcpu/g" \
            > $msi_dir/tables/$(echo $filename | sed 's/.in$//')
    done

    msi_tmp=`mktemp`

    process_dirs()
    {
        depth=$1
        find wine_gecko -mindepth $depth -maxdepth $depth -type d | sort > $msi_tmp

        if [ ! -s $msi_tmp ]; then
            return
        fi

        for d in `cat $msi_tmp`;
        do
            key=`echo $d | cut -d'/' -f2- | sed -e "s/\//|/g"`
            guid=`uuidgen | tr [a-z] [A-Z]`

            keypath=`find $d -mindepth 1 -maxdepth 1 -type f | sort | head -1 | cut -d'/' -f2- | sed -e "s/\//!/g"`
            if [ "x$keypath" != "x" ]; then
                echo -e $key\\t\{$guid\}\\t$key\\t0\\t\\t$keypath >>$msi_dir/tables/component.idt
            fi

            if [ $depth = "1" ]; then
                parent=WINEGECKODIR
            else
                parent=`dirname $d | cut -d '/' -f2- | sed -e "s/\//|/g"`
            fi
            default=`basename $d`
            echo -e $key\\t$parent\\t$default >>$msi_dir/tables/directory.idt
        done

        depth=`expr $depth + 1`
        process_dirs $depth
    }

    process_dirs 1

    find wine_gecko -mindepth 1 -type d | sort > $msi_tmp

    for d in `cat $msi_tmp`;
    do
        component=`echo $d | cut -d '/' -f2- | sed -e "s/\//|/g"`
        hasfile=`find $d -mindepth 1 -maxdepth 1 -type f`
        if [ "x$hasfile" != "x" ]; then
            echo -e wine_gecko\\t$component >> $msi_dir/tables/featurecomponents.idt
        fi
    done

    find wine_gecko -type f | sort > $msi_tmp

    sequence=1
    for f in `cat $msi_tmp`;
    do
        key=`echo $f | cut -d '/' -f2- | sed -e "s/\//!/g"`
        basename=`basename $f`
        dirname=`dirname $f`
        if [ $dirname = wine_gecko ];
        then
            component=gecko
        else
            component=`echo $dirname | cut -d '/' -f2- | sed -e "s/\//|/g"`
        fi
        filesize=`ls -l $f | awk '{ print $5 }'`
        echo -e $key\\t$component\\t$basename\\t$filesize\\t\\t\\t\\t$sequence >> $msi_dir/tables/file.idt
        sequence=`expr $sequence + 1`
    done

    find wine_gecko -type f -print | sort > $msi_tmp

    mkdir $msi_dir/files
    for f in `cat $msi_tmp`;
    do
        key=`echo $f | cut -d '/' -f2- | sed -e "s/\//!/g"`
        ln -s ../../$f $msi_dir/files/$key
    done

    num_files=`find wine_gecko -type f | wc -l`
    echo -e 1\\t$num_files\\t\\t\#$cabfile\\t\\t >> $msi_dir/tables/media.idt

    rm -f $msi_tmp

    if test -z "$WINE_BUILD_DIR"
    then
        WINE=wine
        WINESERVER=wineserver
    else
        WINE=$WINE_BUILD_DIR/wine
        WINESERVER=$WINE_BUILD_DIR/server/wineserver
    fi

    if test -z "$WINEPREFIX"
    then
        tmp_wineprefix=`mktemp -d`
        export WINEDLLOVERRIDES=mshtml=
        export WINEPREFIX=$tmp_wineprefix
    fi

    rm -f $cabfile $dist_basename.msi

    $WINE cabarc.exe -r -m mszip N $cabfile msi/files

    $WINE winemsibuilder -i $dist_basename.msi msi/tables/*
    $WINE winemsibuilder -a $dist_basename.msi $cabfile $cabfile

    if test -n "$tmp_wineprefix"
    then
        $WINESERVER -k
        rm -rf $tmp_wineprefix
    fi

    echo Package done:
    echo $(pwd)/$dist_basename.msi
    ;;
tar)
    echo "make_package: Creating .tar.bz2 archive..."

    cd $build_dir/dist

    tar -cjf $dist_basename.tar.bz2 wine_gecko

    echo Package done:
    echo $(pwd)/$dist_basename.tar.bz2
    ;;
esac
