#!/usr/local/bin/perl

# 
# xcalendar-mail: xcalendar フォーマットファイルを検索しメール報告する
#                 (cal, date コマンドが必要)．
# 
#     [1997/08/28] OSHIRO Naoki. calendar 呼出し用
#     [1998/02/17] OSHIRO Naoki. xcalendar 用に perl で書き換え
#     [1998/04/28] OSHIRO Naoki. 通知メールの題名日付のズレを修正
#     [1998/07/21] OSHIRO Naoki. # に続けてコメントを書けるようにした
#                                コメント行のみの場合は通知されない．
#     [1998/07/21] OSHIRO Naoki. 標準出力へのデバッグオプションを追加
#     [1998/08/06] OSHIRO Naoki. コメントだけの場合の出力を抑制
#     [1998/12/17] OSHIRO Naoki. Fri に加え Sat でもチェック日を増やした．
# 
#     $Log:$
#

require "getopts.pl";
&Getopts("d"); # d:debug

@month=("",
	"Jan", "Feb", "Mar", "Apr", "May", "Jun",
	"Jul", "Aug", "Sep", "Oct", "Nov", "Dec");
@wday=("Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat");

open(F, "cal|"); while (<F>) {$lastday=$_ if /\d+/;} close(F);
$lastday=$1 if $lastday=~/(\d+)*$/;

open(F, "date '+%Y %m %d %w'|");
while (<F>) {$date.=$_;} close(F);
($year, $month, $day, $wday)=split(' ', $date);
$day=sprintf("%d", $day);
$subject="Calendar ($month/$day)";

$caldir="$ENV{HOME}/Calendar";

# 検索するカレンダーファイルの設定
$cnt=2;
$cnt=3 if ($wday[$wday] eq "Sat");
$cnt=4 if ($wday[$wday] eq "Fri");
for ($i=0; $i<$cnt; $i++) {
    $dfile="$caldir/xc$day$month[$month]$year";
    push(@dfile, $dfile);
    $prompt{$dfile}=sprintf("[%02d/%02d]", $month, $day);
    $wfile="$caldir/xw$wday[$wday]";
    push(@dfile, $wfile);
    $prompt{$wfile}="[$wday[$wday]. ]";
    
    $day++; $wday++;
    if ($day>$lastday) {
	$month++; $month=1 if ($month>12);
	$day=1;
    }
    $wday=0 if ($wday>6);
}

# カレンダーファイルの検索
$mess="";
foreach $f ((@dfile)) {
    if (-r $f) {
	#$mess.="\n" if ($mess ne "");
	open(F, "<$f");
	$spc="";
	$tmp_mess="";
	while (<F>) {
	    next if /^\s*#/;
	    s/\s*\n+$//;
	    $tmp_mess.="$spc$_\n" unless /^\s*$/;
	    $spc="        ";
	}
	$mess.="$prompt{$f} $tmp_mess" if $tmp_mess;
	close(F);
    }
}

# なにか記述があればそれを出力
if ($mess) {
    if ($opt_d) {
	print "$mess\n";
	exit;
    }
    open(F, "|mail -s '$subject' $ENV{USER}");
    print F "$mess\n";
    close F;
}
