#!/usr/bin/perl

$|=1;

require 'gismu.pl';
my @gismu = @{$VAR1};
undef $VAR1;
require 'cmavo.pl';
my @cmavo = @{$VAR1};
undef $VAR1;

use strict;
use Text::Wrap qw(wrap $columns);
$columns = 80;

my @quizzers = (
		\&quizrafsitogismu,
		\&quizgismutorafsi,
		\&quizdeftogismu,
		\&quizgismutodef,

		\&quizcmavotodef,
		\&quizdeftocmavo,
		);

sub fisher_yates_shuffle {
    my $array = shift;
    my $i;
    for ($i = @$array; --$i; ) {
	my $j = int rand ($i+1);
	next if $i == $j;
	@$array[$i,$j] = @$array[$j,$i];
    }
}

sub quiz {
    my $msg = shift;
    my @choices = @_;

    print "$msg\n";
    my $cnt = 0;
    fisher_yates_shuffle(\@choices);
    foreach my $choice (@choices) {
	printf("%2i:\t%s\n",$cnt++,$choice->[1]);
    }

    print "Answer: ";
    my $answer;
    chomp($answer = <STDIN>);
    if(!$choices[$answer][0]) {
	print "Wrong answer.\n";
	foreach my $choice (@choices) {
	    if($choice->[0]) {
		print $choice->[1],"\n";
	    }
	}
	sleep 4;
    } else {
	print "*** RIGHT ANSWER!.\n";
	my @list;
	foreach my $choice (@choices) {
	    if($choice->[0]) {
		push @list, $choice->[1];
	    }
	}
	if($#list>0) {
	    foreach(@list) {
		print "$_\n";
	    }
	    sleep 4;
	} else {
	    sleep 2;
	}
    }
}

sub quizdeftogismu {
    my $idx = int rand $#gismu;
    my @false;
    for(my $i=0;$i<4;$i++) {
      my $tmp = int rand ($#gismu+1);
      redo if $tmp==$idx;
      push @false, $tmp;
    }
    my $msg = sprintf("Definition:\n%s\n\nPick the gismu:",
		      wrap(" ","",$gismu[$idx]->{'def'}));
    my @false = map { [0, wrap("","",$gismu[$_]->{'gismu'})] } @false;
    &quiz($msg,@false,[1, wrap("","",$gismu[$idx]->{'gismu'})]);
}

sub quizgismutodef {
    my $idx = int rand $#gismu;
    my @false;
    for(my $i=0;$i<4;$i++) {
      my $tmp = int rand ($#gismu+1);
      redo if $tmp==$idx;
      push @false, $tmp;
    }
    my $msg = sprintf("gismu:\n%s\n\nPick the definition:",$gismu[$idx]->{'gismu'});
    my @false = map { [0, $gismu[$_]->{'def'}] } @false;
    &quiz($msg,@false,[1, $gismu[$idx]->{'def'}]);
}

sub quizgismutorafsi {
    my $correct;
    my $idx;
    for(;;) {
	$idx = int rand $#gismu;
	redo unless $#{ $gismu[$idx]->{'rafsi'} }>=0;
	my @rafsi = @{ $gismu[$idx]->{'rafsi'} };
	$correct = $rafsi[int rand ($#rafsi+1)];
	last;
    }
    my @false;
    for(my $i=0;$i<4;$i++) {
      my $tmp = int rand ($#gismu+1);
      redo if $tmp==$idx;
      redo unless defined $gismu[$tmp]->{'rafsi'};
      my @rafsi = @{$gismu[$tmp]->{'rafsi'}};
      my $somerafsi = $rafsi[int rand ($#rafsi+1)];
      push @false, $somerafsi;
    }
    my $msg = sprintf("gismu:\n%s\n\nPick the rafsi:",$gismu[$idx]->{'gismu'});
    my @false = map { [0, $_] } @false;
    &quiz($msg,@false,[1, $correct]);
}

sub quizrafsitogismu {
    my $idx;
    my $ansstr;
    my @false;
    for(;;) {
	$idx = int rand (1+$#gismu);
	redo unless defined $gismu[$idx]->{'rafsi'};
	my @rafsi = @{ $gismu[$idx]->{'rafsi'} };
	my $rafsi = $rafsi[int rand ($#rafsi+1)];
	$ansstr = $rafsi;
	last;
    }
    for(my $i=0;$i<4;$i++) {
	my $tmp = int rand (1+$#gismu);
	redo if $tmp==$idx;
        redo unless defined $gismu[$tmp]->{'rafsi'};
	push @false, [0, $gismu[$tmp]->{'gismu'}];
    }
    &quiz(sprintf("rafsi: %s\n\nPick the gismu:",$ansstr),
	  @false,[1,$gismu[$idx]->{'gismu'}]);
}

sub quizcmavotodef {
    my $idx = int rand ($#cmavo+1);
    my $msg = sprintf("cmavo: %s\n\nPick the definition:",
		      $cmavo[$idx]->{'cmavo'});
    my @false;
    for(my $i=0;$i<4;$i++) {
	my $tmp = int rand ($#cmavo+1);
	redo if $tmp==$idx;
	push @false, $tmp;
    }
    &quiz($msg,
	  map { [$_==$idx?1:0, $cmavo[$_]->{'def'}] } (@false,$idx));
}

sub quizdeftocmavo {
    my $idx = int rand ($#cmavo+1);
    my $msg = sprintf("Definition: %s\n\nPick the cmavo:",
		      $cmavo[$idx]->{'def'});
    my @false;
    for(my $i=0;$i<4;$i++) {
	my $tmp = int rand ($#cmavo+1);
	redo if $tmp==$idx;
	push @false, $tmp;
    }
    &quiz($msg,
	  map { [$_==$idx?1:0, $cmavo[$_]->{'cmavo'}] } (@false,$idx));
}

for(;;) {
    print "\x1b\x5b\x48\x1b\x5b\x32\x4a";
    print "Lojban Vocab Flasher - Jay Kominek <jay.kominek\@colorado.edu>\n\n";
    my $choice = int rand ($#quizzers+1);
    &{$quizzers[$choice]}();
}
