########################
# Spaced repetition v1.0
# peterhey
########################

$arg=join('',@ARGV);

if ( $arg =~ /-h/ ){ 
print "Spaced repetition v1.0
\t-s\tis turning on sound
\t-r\treverse mode & use second column\n\n" ;
exit 0 ;}
if ( $arg =~ /-s/ ){ $sound=1 ;}
if ( $arg =~ /-r/ ){ $reverse=1 ;} 

$file = 'srdat';
open  $info, $file or die "Could not open $file: $!";
open( $ftmp, '>', 'srdattmp');
 $new = 0;  $exit=0;  $is=0;  $ipl=0;  $ns=0;

 $how_many_new_words = 7;
 $how_many_reverse_words = 10;
 $interval = 28800;	# - in sec
 $esc = "\033W4 \033M1";
 $epochtime = `/bin/date +%s`;

sub say{
	@s=split /\ \ \ /, @_[0];
	open (tts, "> /tmp/ttsUSFifo");
	print tts $esc.$s[0];
	close tts;
}

sub ifagainmp3{
	while($answer eq "r\n") { system("./audiosc @_[0]"); $answer=<>; }
}

sub settings{
	if($answer eq "}\n") { say($first_s) ;}
	elsif($answer eq "ss\n") { print "New speed [50 - 200]: ";
		$answer=<>;	system("lipc-set-prop -i com.lab126.tts TtsISpeed $answer");	print "\nNew speed: ".$answer."\n";}
	elsif($answer eq "s\n") { system("lipc-set-prop -s com.lab126.tts TtsSVoice Samantha");	print "TTS Samantha.\n";
		say($first_s) ;}
	elsif($answer eq "t\n") { system("lipc-set-prop -s com.lab126.tts TtsSVoice Tom");	print "TTS Tom.\n"; 
		say($first_s) ;}
	elsif($answer eq "q\n") { $exit = 1;	print "Exit=1\n";	}
	elsif($answer eq "v\n") { print "\nNew volume [0-16]: ";
		$answer=<>;
		system("source /usr/bin/lipc-set-prop -i com.lab126.audio Volume $answer");
		print "\nNew volume: ".$answer."\n"; 
		say($first_s) ;}
}

sub reverse_words{
	for ($j = 2; $j < @_[0]; $j+=3){
		print "\n\n\n\n\n\n\n\n".$tpl[$j+1]."\n\n";
    
		if ($sound && $reverse) { say($tpl[$j+$reverse]) }
		$answer=<>; 
		settings;
		ifagainmp3($tpl[$j+2]);

		print $tpl[$j]."\n\n";    

		if ($sound && !$reverse){ say($tpl[$j]) }
	
		$answer = <>; 
		settings;
		ifagainmp3($tpl[$j+2]);
	}
}

sub print_block{
	$v_answer = $tab[0+$reverse+$reverse];

	print "\n\n\n\n\n\n".$v_answer."\n\n";
	print $tab[4+$reverse]."\n\n";    

	$first_s =	$tab[4];
	$second_s =	$tab[5];
	$ns =		$tab[6];
	chomp($ns);
	if ($sound && !$reverse) { say($first_s) }

	$answer = <>; 
	while($answer eq "}\n") { say($first_s); $answer=<>; }
	settings;
	ifagainmp3($ns);

	if ($sound && $reverse) { say($first_s) }

	print $tab[5-$reverse]."\n: ";    

	$answer="w";
	while(($answer !~ /\d+/) && ($answer !~ /del/) && ($answer !~ /^\n/) && ($answer !~ /^-/)){
		settings;
		ifagainmp3($ns);

		if ($answer eq "ef\n"){	
			open( $ft, ">tmp");
			print $ft $first_s;
			close $ft;
			system("vi tmp");
			open($ft, "<tmp");
			$first_s=<$ft>;
			close $ft;
			chomp($first_s);
			print "Nowa karta:\n\n".$first_s."\n\n".$second_s."\n\n\n";
			$answer = <>; 
		}

		if ($answer eq "es\n"){
			open( $ft, ">tmp");
			print $ft $second_s;
			close $ft;
			system("vi tmp");
			open($ft, "<tmp");
			$second_s=<$ft>;
			close $ft;
			chomp($second_s);
			print "Nowa karta:\n\n".$first_s."\n\n".$second_s."\n\n\n";
			$answer = <>; 
		}
		$answer = <>; 

		if ($answer eq "0\n" ) { $v_answer = 0;
		}elsif ($answer eq "-\n" ) { $v_answer = int($v_answer / 2);
		}elsif ($answer eq "--\n" ) { $v_answer = int($v_answer / 3);
		}elsif ($answer eq "---\n" ) { $v_answer = int($v_answer / 4);
		}elsif ($answer eq "\n" ) { $v_answer += 1 ; 
		}elsif ($answer == 2 ) { $v_answer += 2 ; 
		}elsif ($answer == 3 ) { $v_answer += 3 ; 
		}elsif ($answer == 4 ) { $v_answer += 5 ; 
		}elsif ($answer == 5 ) { $v_answer += 8 ; 
		}elsif ($answer == 6 ) { $v_answer += 12 ; 
		}elsif ($answer == 7 ) { $v_answer += 17 ; 
		}elsif ($answer == 8 ) { $v_answer += 23 ; 
		}elsif ($answer == 9 ) { $v_answer *= 2 ; 
		}elsif ($answer == 91 ) { $v_answer = $v_answer * 2 + 1 ; 
		}elsif ($answer == 92 ) { $v_answer = $v_answer * 2 + 3 ; 
		}elsif ($answer == 93 ) { $v_answer = $v_answer * 2 + 5 ; 
		}elsif ($answer == 94 ) { $v_answer = $v_answer * 2 + 7 ; 
		}elsif ($answer == 95 ) { $v_answer = $v_answer * 2 + 9 ; 
		}elsif ($answer == 96 ) { $v_answer = $v_answer * 2 + 11 ; 
		}elsif ($answer == 97 ) { $v_answer = $v_answer * 2 + 13 ; 
		}elsif ($answer == 98 ) { $v_answer = $v_answer * 2 + 15 ; 
		}elsif ($answer == 99 ) { $v_answer = $v_answer * 2 + 17 ; }
	}
	print "n: ".$v_answer."\n\n";

	$new_epoch_time = $interval * $v_answer + $epochtime;
	
	chomp($second_s);

	# -  save to file or delete
	if ($answer ne "del\n") {
		if ($ns ne ""){
			if ($reverse) {print $ftmp $tab[0]."\t".$tab[1]."\t".$v_answer."\t".$new_epoch_time."\t".$first_s."\t".$second_s."\t".$ns."\n";}
			else {print $ftmp $v_answer."\t".$new_epoch_time."\t".$tab[2]."\t".$tab[3]."\t".$first_s."\t".$second_s."\t".$ns."\n";}
		}
		else { 
			if ($reverse) {print $ftmp $tab[0]."\t".$tab[1]."\t".$v_answer."\t".$new_epoch_time."\t".$first_s."\t".$second_s."\n";}
			else {print $ftmp $v_answer."\t".$new_epoch_time."\t".$tab[2]."\t".$tab[3]."\t".$first_s."\t".$second_s."\n";}
		}
	}
	else {print "\nDeleted:\n\n".$first_s."\n".$second_s."\n\n\n"}
	$is++;


	# -  how_many_reverse_words part

	$ipl+=3;
	chomp($second_s);
	$tpl[$ipl-1+$reverse]=$first_s;
	$tpl[$ipl-$reverse]=$second_s;
	$tpl[$ipl+1]=$ns;

	if ($ipl > $how_many_reverse_words*3-1){
		if($reverse){ sleep 2;}
		reverse_words($how_many_reverse_words*3+1);
		if(!$reverse){ sleep 2;}
		$ipl=0;
	}
}

print "\n\nFor choose:\n
's'	-	Samantha voice
't'	-	Tom's voice
'ss'	-	Change speed
'v' 	-	Change volume [to fix]
'}'	-	Say again
'0' 	- 	Move word to start point
'2 - 8'	-	multiply number with 8h
'9' 	-	multiply by 2
'91-99'	-	multiply by 2 and add extra
'-'	-	divade by 2
'--'	-	divade by 3
'---'	-	divade by 4
'Enter'	-	next and add 8h
'ef'	-	edit first sentence [default is vi]
'es'	-	edit second sentence [default is vi]
'q'	-	exit
'del'	-	delete\n";
<>;

while( $line = <$info>)
{        
	 @tab=split /\t/, $line;

	$time = $tab[1+$reverse+$reverse];
	if ( ($time == 9999999999) && ($new < $how_many_new_words) && ($exit == 0)) {		# jesli nowy i jeden z 20     
		print_block();	  
		$new++;
	
	}elsif ( ($time < $epochtime) && ($exit == 0))	{			# jesli do powtorki na ten dzien
		print_block();	  

	}else {									# wszystki pozostale przepisz bez zmian
		print $ftmp $line;
	}
}

reverse_words($ipl+1);

$epochtimee=`/bin/date +%s`;
$min = ($epochtimee - $epochtime) / 60;
print "\n\nNumber of words:  ".$is.".\n";
printf ("Time of repetition: %.2f min.\n\n\n",$min);

close $info;
close $ftmp;

system("mv srdattmp $file");
system("ile-nowych");
