#!/bin/bash
#< Script to grab word of the day from dictionary.com
# Schedule daily from cron and pipe to mailx for daily word-of-the-day

BASENAME="/usr/bin/basename"
CURL="/usr/bin/curl"
DATE="/usr/bin/date"
ECHO="/usr/bin/echo"
RM="/bin/rm"
SED="/usr/bin/sed"

OUTPUT_FILE="${HOME}/wotd.html"
THIS_PROG="$( ${BASENAME} $0 )"
WOTD_URL="http://dictionary.reference.com/wordoftheday/"
YESTERDAY=0

function print_error {
   ${ECHO} "Error: $@" >&2
}

function print_usage {
   {
      ${ECHO} "Usage: ${THIS_PROG} [-hy]"
      ${ECHO} "       -h   Display this usage message"
      ${ECHO} "       -y   Get yesterdays word of the day"
   } >&2
}

function cleanup {
   ${RM} -f ${OUTPUT_FILE}
}

trap 'cleanup; exit 1' 1 2 3 15

function check_url {
   HTTP_CODE=$( ${CURL} -s -o /dev/null -w%{http_code} ${WOTD_URL} )
   if [ "${HTTP_CODE}" -ne "200" ]; then
      print_error "Unable to access ${WOTD_URL}"
   fi
}

function get_url {
   ${CURL} ${WOTD_URL} >${OUTPUT_FILE} 2>/dev/null
}

function parse_html {
   WOTD_SECTION=$( ${SED} -n '/span class=\"hw/,/SECBR -->/ p' ${OUTPUT_FILE} )
   WOTD_WOTD=$( ${ECHO} "${WOTD_SECTION}" | ${SED} -n '/span class=\"hw/ s/^<span class=\"hw\">\([^>]*\)<.span>.*$/\1/p' )
   WOTD_PRONOUNCE=$( ${ECHO} "${WOTD_SECTION}" | ${SED} -n '/span class=\"hw/ s#.*</span> \([^,]*\),.*$#\1#p' )
   WOTD_TYPE=$( ${ECHO} "${WOTD_SECTION}" | ${SED} -n '/span class=\"hw/ s#^.*<i>\([^<]*\)</i>.*$#\1#p' )
   WOTD_MEANINGS=$( ${ECHO} "${WOTD_SECTION}" | ${SED} -n -e '/^<!-- wotd=/,/<\/p>/ p' | ${SED} -e '1d' -e '$d' -e 's/<[^>]*>//g' )
}

function display_wotd {
   ${ECHO} "Word of the day: ${WOTD_WOTD}"
   ${ECHO} "Pronunciation: ${WOTD_PRONOUNCE}"
   ${ECHO} "Word type: ${WOTD_TYPE}"
   ${ECHO}
   ${ECHO} "This word means:"
   ${ECHO} "${WOTD_MEANINGS}"
}

while getopts ":hy" OPTION; do
  case ${OPTION} in
      "h")  print_usage && exit 0   ;;
      "y")  YESTERDAY=1             ;;
      *  )  print_usage && exit 1   ;;
  esac
done

shift $(( ${OPTIND} - 1 ))

if [ "$#" -ne "0" ]; then
   print_usage && exit 1
fi

if [ "${YESTERDAY}" -gt "0" ]; then
   TIMESTAMP=$( export TZ="America/New_York"; ${DATE} -d "yesterday" +"%Y/%m/%d" )
   WOTD_URL="http://dictionary.reference.com/wordoftheday/archive/${TIMESTAMP}.html"
fi

check_url
get_url
parse_html
display_wotd
cleanup

exit 0