#!/usr/bin/perl
# Prayer time reminder program, depends on ipraytime.
# some variables in this file may need to be edited by user:
# $prev_mins: the first alarm is how many minutes before the azan.
# $playfile: name of the audio file to be played at azan time.
# $playcmd: the command used to play this $playfile
# 
use strict;

#default settings:
my $prev_mins=5;
my $playfile="~/azan_madinah.mp3";
my $playcmd="toxine -A oss -V none -I -i -o/dev/null -e \"play $playfile;waitfor UI_PLAYBACK_FINISHED; quit\"";
my $ipraytime="ipraytime";

my @now=localtime();
my $mins_now = @now[1] + (60 * @now[2]);

print `$ipraytime -b`;
my @ar1 = &get_praytimes();

#first check that we are before today's Isha:
my $next_day_flag=0;
my $pname;
my $ptime;
my $mins_diff;
my $phr;
my $pmin;
($pname,$ptime)=split(/,/, @ar1[4]);
($phr,$pmin)=split(/:/, $ptime);

if($mins_now > ($pmin + ($phr * 60) - $prev_mins)) {
	# get tomorrow's prayer times:
	@ar1 = &get_praytimes(1);
	$next_day_flag=1;
	($pname,$ptime)=split(/,/, @ar1[0]);
	($phr,$pmin)=split(/:/, $ptime);
	$mins_diff = $pmin + ($phr * 60) - $mins_now;
}
else {
#find next prayer time:
	my $i=0;
	foreach (@ar1) { 
		($pname,$ptime)=split(/,/, $_);
		($phr,$pmin)=split(/:/, $ptime);
		$mins_diff = $pmin + ($phr * 60) - $mins_now;
		if($mins_diff <= $prev_mins) { $i++; }
		else { last; }
	}
	while($i > 0) { shift @ar1; $i--; }
}
print "\nNext alarm is for salat-ul-$pname at $ptime\n";

if(fork()) { exit; }

for(;;) {
	if($next_day_flag == 1) { $mins_diff += (24 * 60);}
	sleep(($mins_diff - $prev_mins) * 60);
	&alarm();
  $next_day_flag=0;
	shift @ar1; #next prayer time.
	if(!defined(@ar1[0])) { #get prayer times of next day:
		@ar1 = &get_praytimes(1);
		
	}
	#schedule next prayer time alarm:
	@now=localtime();
	$mins_now = @now[1] + (60 * @now[2]);
	($pname,$ptime)=split(/,/, @ar1[0]);
	($phr,$pmin)=split(/:/, $ptime);
	$mins_diff = $pmin + ($phr * 60) - $mins_now;
}

sub alarm {
 	print "$prev_mins minutes left for salat-ul-$pname\a\n";
	sleep(($prev_mins - 1) * 60); #sleep for 4 mins
	print "1 minute left for salat-ul-$pname\a\n";
	sleep(60); #sleep for 1 min
	print "Time now for salat-ul-$pname\a\n";
	if(fork() == 0) { exec($playcmd); }
	sleep(60); #sleep for 1 min
	print "You're 1 minute late for salat-ul-$pname\a\n";
}

sub get_praytimes {
	my $pdate="";
	if($_ == 1) { #get next day's praytime
		my @next_day=localtime(time() + (24 * 60 * 60));
		@next_day[5] += 1900;
		my $pdate=sprintf("--date %d%02d%02d", @next_day[5], @next_day[4], 
		                  @next_day[3]);
	}
	my @ret=`$ipraytime $pdate -b`;
	my @pnames=split(/ |\n/,$ret[0]);
	@pnames=grep($_ ne '', @pnames);
	shift @pnames;
	delete(@pnames[1]); #delete Shurooq.
	@pnames=grep($_ ne '', @pnames);
	my @ar1=split(/ |\n/,$ret[2]);
	@ar1=grep($_ ne '', @ar1);
	shift @ar1;
	delete(@ar1[1]); #delete Shurooq.
	@ar1=grep($_ ne '', @ar1);
	for(my $i=0; $i < 5; $i++) {
		@ar1[$i]=@pnames[$i].",".@ar1[$i];
	}
	return(@ar1);
}
