#!/bin/sh
# Send message via mail at specified time
#

myname=`basename $0`	# 自分のファイル名を得る
usage () {		# usageを表示する関数を先頭にしておくと親切
  cat<<_EOU_
$myname: 指定した時間に自分にメイルを送る
オプションにはこんなんがあるじょー
	-t ADDRESS		メイルを送る追加の宛先(常に自分には送られる)
	-m "メッセージ"		送信メッセージ
例:
$myname +1		1分後にメッセージを送る
$myname +5h		5時間後にメッセージを送る
$myname +3d		3日後にメッセージを送る
$myname 7/15 12:00	7/15の12時に送る
			(月の省略はできない.時刻を省略すると午前8時)
$myname 18:00		今日の18時に送る。既に18時を過ぎてたら明日の18時。

時刻だけ指定して起動するとメッセージ入力を促されるので
日本語でも英語でも何行でも書いて、最後にピリオド(.)一個だけいれておしまい。
_EOU_
  exit 0
}

# ここからデフォルト変数定義。=(イコール)の前後に空白はだめよ
message=''
when=''
mailto=`whoami`
verbose=0
tmpdir=/tmp
tmpfile=$tmpdir/$myname-$$

RM=/bin/rm

finalize () {			# 途中で ^C されたときにやるべき処理
  $RM -f $tmpfile		# 特に必要なければ書かない
  echo 'さらばい.'
  exit 1
}
trap finalize 2 3		# 拾うシグナルを列挙

# 関数定義をつらつらと

parseResult () {
    read result
    echo result="$result"
    case "$result" in
      Job*)
	n=`echo $result|sed 's/^[Jj]ob \([0-9]*\) .*/\1/'`
	at -l
	echo "上記 $n 番のジョブとして登録されました。"
	echo "送信を取り消すときは"
	echo "% atrm $n"
	echo "としてください。"
	;;
      *incomplete*|*garbl*)
        echo "時刻指定がおかしいみたい"
	echo ''
	usage ;;
      *)
       # ???
      ;;
    esac
}

register () {
  [ "$when" = "" ] && when="$@"
  if [ "$message" = "" ]; then
    echo "$when に $mailto 宛に送るメッセージを入力してください。"
    echo "(C-d または . のみの行で終了)"
    while read l; do
      [ "$l" = "." ] && break
      message="$message
$l"
    done
  fi
  (cd /; at $when<<EOC > $tmpfile 2>&1)
echo "$message" | nkf | mail -s "Reminder at `LANG=C date`" $mailto
EOC
  cat $tmpfile | parseResult
}

while [ "$1" != "" ];
do
  case "$1" in
    -v)	verbose=1 ;;
    -m) shift; message="$1" ;;
    -t) shift; mailto="$mailto $1" ;;
    -h) usage ;;		# -h helpオプション
    --) shift; break ;;
    +1h)		when="now + 1hours" ;;
    +1d)		when="now + 1d" ;;
    +1)			when="now + 1minute" ;;
    +[0-9]*h)		when="now $1ours" ;;
    +[0-9]*d)		when="now $1ays" ;;
    +[0-9]*)		when="now $1minutes" ;;
    */*) case "$2" in
	    *:*) when="$2 $1"
		 shift ;;
	    '')  when="08:00 $1"
	    	 ;;
	 esac
	 ;;
    *)	break ;;		# -で始まらないものが来たら即処理突入
  esac
  shift	
done

# そんでメイン
# 引数が一つもなかったらusage表示しておしまい
if [ "$1$when" = "" ]; then
  usage
fi


register "$@"

# おちまい
$RM -f $tmpfile
exit 0