#!/bin/sh
#
# Copyright (C) 2006 Mekensleep
#
# Mekensleep
# 24 rue vieille du temple
# 75004 Paris
#       licensing@mekensleep.com
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301, USA.
#
# Authors:
#  Loic Dachary <loic@gnu.org>
#
set -e 

: ${top_srcdir:=..}

if uname | grep -i cygwin > /dev/null 
then is_cygwin=/bin/true
else is_cygwin=/bin/false
fi

function set_versions() {
    local module=$1
    version_current=$(PYTHONPATH=$top_srcdir python -c "from $module.version import version; print version")
    version_previous=$(PYTHONPATH=$top_srcdir python -c "from $module.version import version; print version - 1")
    version_next=$(PYTHONPATH=$top_srcdir python -c "from $module.version import version; print version + 1")
}

function patch_version() {
    local file=$1
    local version=$2

    if xsltproc /dev/stdin $file > $file.tmp <<EOF
<?xml version="1.0" encoding="ISO-8859-1"?>

<xsl:stylesheet version="1.0"
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

 <xsl:preserve-space elements="*" />
 <xsl:output method="xml" indent="yes"
	     encoding="ISO-8859-1"
 />

 <xsl:template match="/settings/@poker_network_version">
   <xsl:attribute name="poker_network_version">$version</xsl:attribute>
 </xsl:template>

 <xsl:template match="/sequence/@poker_network_version">
   <xsl:attribute name="poker_network_version">$version</xsl:attribute>
 </xsl:template>

 <!-- copy the rest verbatim -->
 <xsl:template match="@*|node()">
  <xsl:copy>
   <xsl:apply-templates select="@*|node()"/>
  </xsl:copy>
 </xsl:template>

</xsl:stylesheet>
EOF
    then cat $file.tmp ; mv $file.tmp $file
    fi
}

function patch_preferences() {
    local dir=$1

    pref=$(echo $ROOT/$dir/share/poker-network*/poker2d/poker2d.xml)
    xsltproc /dev/stdin $pref.ref > $pref <<EOF
<?xml version="1.0" encoding="ISO-8859-1"?>

<xsl:stylesheet version="1.0"
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

 <xsl:preserve-space elements="*" />
 <xsl:output method="xml" indent="yes"
	     encoding="ISO-8859-1"
 />

 <xsl:template match="/settings/@servers">
   <servers>$SERVER</servers>
 </xsl:template>

 <xsl:template match="/settings/@verbose">
   <xsl:attribute name="verbose">3</xsl:attribute>
   <xsl:attribute name="batch">yes</xsl:attribute>
 </xsl:template>

 <!-- copy the rest verbatim -->
 <xsl:template match="@*|node()">
  <xsl:copy>
   <xsl:apply-templates select="@*|node()"/>
  </xsl:copy>
 </xsl:template>

</xsl:stylesheet>
EOF

}

function install() {
    #
    # Install current version
    #
    if $is_cygwin ; then
        : uninstall already installed version
        : install from .exe in $ROOT/root
    else
        pushd $top_srcdir
        make maintainer-clean || /bin/true
        AUTOMAKE=automake-1.9 ACLOCAL=aclocal-1.9 autoreconf --install
        ./configure --prefix=$ROOT/root --enable-upgrades=$ROOT --with-poker2duserpath=$ROOT
        make install
        patch_preferences root
        popd
    fi

    #
    # Install previous version
    #
    if $is_cygwin ; then
        : make sure previous version .exe is here and expanded
    else
        #
        # Change the version number of the installed version to
        # pretend that it's the previous version.
        #
        rsync -aH $ROOT/root/ $ROOT/$version_current
        patch_version $ROOT/root/share/poker-network/poker2d/poker2d.xml $version_previous
        patch_version $ROOT/root/share/poker-network/poker2d/client.xml $version_previous
        perl -pi -e 's/(version_number)\s*=\s*".*"/$1 = "'$version_previous'"/'  $ROOT/root/lib/python*/site-packages/$MODULE/__init__.py
    fi
}

function run() {
    if $is_cygwin ; then
        :
    else
        for dir in $ROOT/root/lib/python*/site-packages ; do
            if [ -d $dir/pokerui ] ; then
                export PYTHONPATH=$dir:$PYTHONPATH
            fi
        done
        pushd $ROOT
        $ROOT/root/games/poker2d $ROOT/poker2d.xml
        popd
    fi
}

function install_next() {
    #
    # Install fake next version
    #
    local python

    if $is_cygwin ; then
        python=$ROOT/root/python
    else
        python=$ROOT/$version_next/lib/python*
    fi

    rsync -aH $ROOT/$version_current/ $ROOT/$version_next
    perl -pi -e 's/(version_number)\s*=\s*".*"/$1 = "'$version_next'"/' $python/site-packages/$MODULE/__init__.py
}

function cleanup() {
    local ROOT=$1
    if $is_cygwin ; then
        :
    else
        rm -fr $ROOT
    fi
}

function prepare() {
    local ROOT=$1
    if $is_cygwin ; then
        :
    else
        mkdir $ROOT
    fi
}

DRY_RUN=/bin/false
NOT_DRY_RUN=/bin/true
declare -i VERBOSE
VERBOSE=0

function usage() {
    echo "$0: "
}

MODULE=pokernetwork
ROOT=/tmp/upgrade-rsync
SERVER=localhost:19380

while getopts 'hnv:m:r:s:' o ; do
  case $o in
      h) usage ;;
      n) DRY_RUN=/bin/true ; DRY=echo ; NOT_DRY_RUN=/bin/false ;;
      v) VERBOSE=$OPTARG
         set -x
         ;;
      m) MODULE=$OPTARG ;;
      r) ROOT=$OPTARG ;;
      s) SERVER=$OPTARG ;;
  esac
done

set_versions $MODULE

cleanup $ROOT
prepare $ROOT

install
run
install_next
run

#cleanup $ROOT
