#!/bin/bash
#
# osmimage [options]
#
# downloads an OpenStreetMap map specified by [options]
# by using http://developer.mapquest.com/ web service
#
# License: LPPL
#
pversion()
{
  echo "`basename $0` $VERSION"
  echo "(C) Josef Kleber   License: LPPL"
  exit 0;
}
#
function phelp()
{
  echo -e \
    "\n  `basename $0` [options]\n\n"\
    " downloads an OpenStreetMap map specified by [options]\n"\
    " by using http://developer.mapquest.com/ web service\n\n"\
    " Options:\n\n"\
    " -k  key registered at http://developer.mapquest.com/\n"\
    "     default (Example key from web site)!\n"\
    "     Please register and use your own key!\n\n"\
    " -l  specify a location\n"\
    "     e.g. 'Bergheimer Straße 110A, 69115 Heidelberg, Germany'\n\n"\
    " -x  specify a xsize (800)\n\n"\
    " -y  specify a ysize (400)\n\n"\
    " -S  short form to specify a size, e.g. 800,400\n\n"\
    " -s  specify a scale factor in the range 1692-221871572 (3385 = -z 17)\n"\
    "     see: http://open.mapquestapi.com/staticmap/zoomToScale.html\n\n"\
    " -z  specify a zoom in the range 1-18 (zoom overrides scale!)\n\n"\
    " -t  specify map type {map|sat|hyb} (map)\n\n"\
    " -i  specify image type {jpeg|jpg|gif|png} (png)\n\n"\
    " -c  specify icon color (yellow_1)\n"\
    "     see: http://open.mapquestapi.com/staticmap/icons.html\n\n"\
    " -n  specify the icon number (1)\n\n"\
    " -o  specify output basename without file extension (osmimage.IMAGETYPE)\n\n"\
    " -q  quiet; no output!\n\n"\
    " -v  prints version information\n\n"\
    " -h  prints help information\n\n"
  pversion
}
#
osmimage_error()
{
  local exitcode="$1"
  local errortext="$2"
  echo "Error ($exitcode): $errortext" >&2
  exit $exitcode
}
#
osmimage_warning()
{
  local warningtext="$1"
  echo -e "WARNING: $warningtext\n" >&2
}
#
check_prog()
{
  local prog="$1"
  hash $prog 2>/dev/null || osmimage_error 1 "$prog not installed! Aborting."
}
#
check_number()
{
  local var="$1"
  local varname="$2"
  local number='^[0-9]+$'
  if ! [[ $var =~ $number ]]
  then
     osmimage_error 2 "$varname can't be $var! Not a number!"
  fi
}
#
check_range()
{
  local var="$1"
  local min="$2"
  local max="$3"
  local exitcode="$4"
  local varname="$5"
  check_number $var $varname
  if [ $var -lt $min ]
  then
    osmimage_error $exitcode "$varname = $var; must be in the range of $min-$max"
  fi
  if [ $var -gt $max ]
  then
    osmimage_error $exitcode "$varname = $var; must be in the range of $min-$max"

  fi
}
#
check_prog wget
#
URL="http://open.mapquestapi.com/staticmap/v4/getplacemap"
KEY=""
LOCATION=""
XSIZE=""
YSIZE=""
SCALE=""
ZOOM=""
TYPE=""
IMAGETYPE=""
COLOR=""
NUMBER=""
OFILE="osmimage"
QUIET="false"
VERSION="v1.2 (23/05/2014)"
#
while getopts "k:l:x:y:S:s:z:t:i:c:n:o:qvh" flag
do
  case "$flag" in
    k) KEY="$OPTARG";;
    l) LOCATION="$OPTARG";;
    x) XSIZE="$OPTARG";;
    y) YSIZE="$OPTARG";;
    S) SIZE="$OPTARG";;
    s) SCALE="$OPTARG";;
    z) ZOOM="$OPTARG";;
    t) TYPE="$OPTARG";;
    i) IMAGETYPE="$OPTARG";;
    c) COLOR="$OPTARG";;
    n) NUMBER="$OPTARG";;
    o) OFILE="$OPTARG";;
    q) QUIET="true";;
    v) pversion;;
    h) phelp;;
  esac
done
#
if [ "$QUIET" = "true" ]
then
  exec 1>/dev/null
  exec 2>/dev/null
fi
#
if [ -z $KEY ]
then
  KEY="Kmjtd%7Cluu7n162n1%2C22%3Do5-h61wh"
  osmimage_warning "KEY not specified; using mapquest example key as default!"
fi
#
if [ -z $LOCATION ]
then
  LOCATION="Bergheimer Straße 110A, 69115 Heidelberg, Germany"
  osmimage_warning "LOCATION not specified; using Dante e.V. Office as default!"
fi
#
if [ -z $XSIZE ]
then
  XSIZE=800
  osmimage_warning "XSIZE not specified; using XSIZE=800 as default!"
fi
check_range $XSIZE 1 3840 11 XSIZE
#
if [ -z $YSIZE ]
then
  YSIZE=400
  osmimage_warning "YSIZE not specified; using YSIZE=400 as default!"
fi
check_range $YSIZE 1 3840 12 YSIZE
#
if [ -z $SIZE ]
then
  SIZE="$XSIZE,$YSIZE"
fi
#
if [ -z $SCALE ]
then
  if [ -z $ZOOM ]
  then
    SCALE=3385
    osmimage_warning "SCALE not specified, using SCALE=3385 as default!"
  fi
else
  check_range $SCALE 1692 221871572 13 SCALE
fi
#
if [ -z $TYPE ]
then
  TYPE="map"
  osmimage_warning "TYPE not specified; using map as default!"
fi
#
if [ -z $IMAGETYPE ]
then
  IMAGETYPE="png"
  osmimage_warning "IMAGETYPE not specified; using png as default!"
fi
#
if [ -z $COLOR ]
then
  COLOR="yellow_1"
  osmimage_warning "COLOR not specified; using yellow_1 as default!"
fi
if [ -z $NUMBER ]
then
  NUMBER=1
  osmimage_warning "NUMBER not specified; using 1 as default!"
fi
check_number $NUMBER NUMBER
#
ULOCATION="&location=$LOCATION"
USIZE="&size=$SIZE"
if [ -z $ZOOM ]
then
  USCALEZOOM="&scale=$SCALE"
else
  check_range $ZOOM 1 18 14 ZOOM
  USCALEZOOM="&zoom=$ZOOM"
fi
UTYPE="&type=$TYPE"
UIMAGETYPE="&imagetype=$IMAGETYPE"
USHOWICON="&showicon=${COLOR}-${NUMBER}"
UOFILE="${OFILE}.${IMAGETYPE}"
#
IMGURL="${URL}?key=${KEY}${ULOCATION}${USIZE}${USCALEZOOM}${UTYPE}${UIMAGETYPE}${USHOWICON}"
#
wget "$IMGURL" -O "$UOFILE"
exit 0
