#!/bin/sh
#  r.unpack   --  unpack up a raster map packed with r.pack:
#     tar+gzip'd map elements => GRASS 6 mapset structure
#
#   (c) 2004-2008, 2012 GRASS Development Team
#   AUTHOR: Hamish Bowman, Otago University, New Zealand
#
#   This program is free software under the GNU General Public
#   License (>=v2). Read the file COPYING that comes with GRASS
#   for details.
#

#%module
#% description: Unpacks a raster map packed with r.pack.
#% keywords: raster, copying
#%end
#%option
#% key: input
#% type: string
#% gisprompt: old,file,input
#% description: Name of input pack file
#% required: yes
#%end
#%option
#% key: output
#% type: string
#% key_desc: name
#% gisprompt: new,cell,raster
#% description: Name for output raster map (default: taken from input file internals)
#% required : no
#%end
#%flag
#% key: o
#% description: Override projection check (use current location's projection)
#%end


if [ -z "$GISBASE" ] ; then
   echo "You must be in GRASS GIS to run this program." >&2
   exit 1
fi   
if [ "$1" != "@ARGS_PARSED@" ] ; then
   exec g.parser "$0" "$@"
fi

# check for tar,gzip
for PRGM in tar gzip ; do
   if [ -z "`which $PRGM`" ] ; then
      g.message -e "$PRGM must be installed to use this program."
      exit 1
   fi
done


if [ -z "$GRASS_OVERWRITE" ] ; then
   GRASS_OVERWRITE=0
fi


if [ ! -e "$GIS_OPT_INPUT" ] ; then
   g.message -e "File not found <$GIS_OPT_INPUT>"
   exit 1
fi

MAPSET=`g.gisenv get=MAPSET`
LOCATION_NAME=`g.gisenv get=LOCATION_NAME`
GISDBASE=`g.gisenv get=GISDBASE`
MSET_DIR="$GISDBASE/$LOCATION_NAME/$MAPSET"

# create temporary directory to hold bits
TMP_DIR="`g.tempfile pid=$$`"
if [ $? -ne 0 ] || [ -z "$TMP_DIR" ] ; then
   g.message -e "Unable to create temporary files"
   exit 1
fi

rm -f "$TMP_DIR"
mkdir "$TMP_DIR"

if [ ! -d "$TMP_DIR" ] ; then
   g.message -e "Unable to create temporary directory"
   exit 1
fi


cleanup()
{
   g.message -v "Cleaning up ..."
   cd "$MSET_DIR"
   rm -rf "$TMP_DIR"
}
#### trap ctrl-c so that we can clean up tmp
trap 'cleanup' 2 3 15


cp "$GIS_OPT_INPUT" "$TMP_DIR"/
cd "$TMP_DIR"/

# remove .pack and path from $GIS_OPT_INPUT
#MAP_NAME="`basename "$GIS_OPT_INPUT" | sed -e 's/\.pack$//'`"

INPUT_BASE=`basename $GIS_OPT_INPUT`
DATA_NAME=`tar tzf "$INPUT_BASE" | head -n 1 | cut -f1 -d'/'`
if [ -z "$DATA_NAME" ] ; then
   g.message -e "Pack file unreadable"
   cleanup
   exit 1
fi

if [ -z "$GIS_OPT_OUTPUT" ] ; then
   MAP_NAME="$DATA_NAME"
else
   MAP_NAME="$GIS_OPT_OUTPUT"
fi

eval `g.findfile element=cell file="$MAP_NAME" mapset=.`
if [ ! -z "$file" ] && [ "$GRASS_OVERWRITE" -ne 1 ] ; then
   g.message -e "Raster map <$MAP_NAME> already exists"
   cleanup
   exit 1
fi


# extract data
tar xzf "$INPUT_BASE"
if [ $? -ne 0 ] ; then
   g.message -e "Pack file unreadable"
   cleanup
   exit 1
fi


cd "$DATA_NAME"/

# check projection compatibility in a rather crappy way
if [ ! -z `diff PROJ_INFO "$MSET_DIR"/../PERMANENT/PROJ_INFO` ] ; then
    if [ $GIS_FLAG_O -eq 1 ] ; then
        g.message -w "Projection information does not match. Proceeding.."
    else
        g.message -e "Projection information does not match. Aborting."
        cleanup
        exit 1
    fi
fi


# install in $MAPSET
for ELEMENT in cats cell cellhd colr fcell grid3 hist ; do
    if [ -e "$ELEMENT" ] ; then
	if [ ! -d "$MSET_DIR/$ELEMENT/" ] ; then
	   mkdir "$MSET_DIR/$ELEMENT/"
	fi
	cp "$ELEMENT" "$MSET_DIR/$ELEMENT/$MAP_NAME"
    fi
done

if [ -d "cell_misc" ] ; then
    if [ ! -d "$MSET_DIR/cell_misc" ] ; then
	mkdir "$MSET_DIR/cell_misc"
    fi
    cp -r "cell_misc"/ "$MSET_DIR/cell_misc/$MAP_NAME"
fi


cleanup

g.message -v "Done. Map saved to <$MAP_NAME>"
exit 0
