package acroweb;

use Exporter;
@ISA = qw(Exporter);
@EXPORT = qw(&generujnahodne &filtruj &permutemyfield);

#### Procedura cte radky souboru jehoz nazev je  v prvnim parametru
#### a zpracovava je pro dalsi pouziti. V druhem parametruje pocet spatnych
#### moznosti.
#### Vystupem jsou otazky, ve kterych jsou nahodne prehazeny moznosti a 
#### uvodni + a - jsou nahrazena prikazy \Ans0 a \Ans1
sub filtruj{
    my ($jmenosouboru,$variantspatne,$flag)=@_;
    open(HLAVA,$jmenosouboru);
    my @predfiltrem=<HLAVA>;
    push(@predfiltrem,"konec");
    my @pofiltru=();
    my @spatne=(); # tady jsou pro kazde zadani radky zacinajici minusem
    my @nabidkaodpovedi=(); # spatne odpovedi vybrane do testu
    my @nabidkaperm=();

    # nasledujici promenne jsou pouzite pri zpracovavani zadani do
    # formy citelne acrotexem
    my $spravne="";
    my $bylominus=0;
    my $pocetspatne=0; # pocet spatnych variant pro kazdou otazku
    my $radekvystup="";
    foreach $radek (@predfiltrem)
    {
	chomp($radek);
	# radek nezacina plusem ani minusem
	if (not(substr($radek,0,1) eq "-") and not(substr($radek,0,1) eq "+")) 
	{
	    if ($bylominus==1) 
	    {
		@nabidkaodpovedi=();
		if ($flag==2)
		{
		    chomp($spravne);
		    chomp($spatne[0]);
		    $spravne=~ s/^\+//;
		    $spatne[0]=~ s/^-//;
		    $radekvystup=$radekvystup."\\interval{$spatne[0]}";
		    $radekvystup=$radekvystup."\\reseni{$spravne}";
		    # do pole @pofiltru ukladame zpracovana zadani
		    push (@pofiltru,$radekvystup."\n\n");

		}
		else
		{
		    # nahodne vybereme spatne odpovedi
		    for ($cislo=($pocetspatne-1);$cislo>=($pocetspatne-$variantspatne);$cislo--)
		    {
			$randcislo = int(rand($cislo+1));
			push(@nabidkaodpovedi,$spatne[$randcislo]);
			splice(@spatne,$randcislo,1);
		    }
		    
		    # pridame spravnou odpoved
		    push(@nabidkaodpovedi,$spravne);
		    
		    # promichame @nabidkaodpovedi a ulozime do @nabidkaperm
		    for ($cislo=$variantspatne;$cislo>=0;$cislo--)
		    {
			$randcislo = int(rand($cislo+1));
			push(@nabidkaperm,$nabidkaodpovedi[$randcislo]);
			splice(@nabidkaodpovedi,$randcislo,1);
		    }
		    
		    
		    if ($flag==1)
		    {
			# zmenime zneni posledni odpovedi, spravnost nechame
			$plusminus=substr($nabidkaperm[$variantspatne],0,1);
			$nabidkaperm[$variantspatne]=$plusminus."jiná odpověď";
		    }
		    $cislo=0;
		    
		    # zmenime tak, aby to proslo v AcroTeXu
		    for ($cislo=0; $cislo<=($variantspatne); $cislo++)
		    {
			$odpoved=$nabidkaperm[$cislo];
			$odpoved=~ s/^\+/\\Ans1 /;
			$odpoved=~ s/^-/\\Ans0 /;
			if (not($cislo==$variantspatne))
			{
			    # oddelovac variant odpovedi
			    chomp $odpoved;
			    $radekvystup=$radekvystup.$odpoved."\\\\[5pt]\n";
			}
			else
			{
			    # konec nabizenych odpovedi
			    $radekvystup=$radekvystup.$odpoved;
			}
		    }
		    # do pole @pofiltru ukladame zpracovana zadani
		    push (@pofiltru,"$radekvystup\\end{answers}\n\n\n");
		}


		# nova inicializace promennych pro cteni dalsiho zadani
		$radekvystup="";
		$pocetspatne=0;
		$spravne="";
		@spatne=();
		@nabidkaperm=();
		$bylominus=0;
	    }
	    if ($radek eq "")
	    {
		$radekvystup=$radekvystup.$radek;
	    }
	    else
	    {
		$radekvystup=$radekvystup."\\zadani{".$radek."}\n";
		if ($flag != 2)
		{
		    $radekvystup=$radekvystup."\\begin{answers}{1}\n";
		}
	    }
	}
	else
	{
	    if (substr($radek,0,1) eq "-")
	    {
		$bylominus=1;
		$pocetspatne=$pocetspatne+1;
		push(@spatne,$radek."\n");
	    }
	    else
	    {
		$spravne=$radek."\n";
	    }
	}
    }


return(@pofiltru)
}



sub generujnahodne
# parametry: 
# ----------
# soubor, 
# pocet otazek do vyberu
# pocet spatnych odpovedi do vyberu
# flag: 0 = nechat otazky  
#       1 = zmenit posledni variantu na "jina odpoved"
#       2 = poslat dal
{
    my ($jmeno,$pocetzadani,$variantspatne,$flag)=@_;
    my @hotovezadani;
    my @ktisku;

# Nacteme otazky a prislusny pocet odpovedi, odpovedi uz budou prehazene
    @ktisku=filtruj($jmeno,$variantspatne,$flag);
    
# Vybereme nahodne otazky, nejprve zjistime jejich pocet
    my $celkemzadani=@ktisku;

# vybirame nahodne polozky a ukladame do pole @hotovezadani
    for ($cislo=$celkemzadani;$cislo>($celkemzadani-$pocetzadani);$cislo--)
    {
	$randcislo = int(rand($cislo));
	push(@hotovezadani, $ktisku[$randcislo]);
	splice(@ktisku,$randcislo,1);
    }

# vratime pole @hotovezadani
    return @hotovezadani;
}

sub permutemyfield
{
# reads a field and permutes this field randomly
    my @initfield=@_;
    my $NumberOfProblems=@initfield;
    my @permutedfield=();

    for ($cislo=$NumberOfProblems;$cislo>0;$cislo--)
    {
	$randcislo = int(rand($cislo));
	push(@permutedfield, $initfield[$randcislo]);
	splice(@initfield,$randcislo,1);
    }
    
    return @permutedfield;
}


1;

