#!/usr/bin/perl w
my $infilename = $ARGV[0];
my $basevar = "\@$ARGV[1]\@";

my $pickatrandom = 1;
if (($ARGV[2]) && ($ARGV[2] eq "all"))
{
    $pickatrandom = 0;
}

# Ustanowienie pliku wyjciowego
my $outfilename = "/tmp/pyro.txt";
open(OUTFILE, "> $outfilename")
    or die "Nie mona otworzy pliku $outfilename do zapisu: $!\n";
print OUTFILE "$basevar\n";
close (OUTFILE);

local $/;
undef $/;

open(INFILE, "< $infilename")
    or die "Nie mona otworzy pliku $infilename do odczytu: $!\n";
$infilecontents = <INFILE>;
close (INFILE);

open(OUTFILE, "< $outfilename")
    or die "Nie mona otworzy pliku $outfilename do odczytu: $!\n";
$outfilecontents = <OUTFILE>;
close (OUTFILE);

while ($outfilecontents =~ /\@[A-Za-z0-9]+\@/)
{
    local $/;
    undef $/;

    open(OUTFILE, "< $outfilename")
        or die "Nie mona otworzy pliku $outfilename do odczytu: $!\n";
    $outfilecontents = <OUTFILE>;
    close (OUTFILE);

# $baseline to pierwszy wiersz ze zmienn w OUTFILE (pliku wyjciowym).
    if ($outfilecontents =~ /^(.*?)(\@\w+\@)(.*?)$/m)
    {
        $baseline = "$1$2$3";
        $varname=$2;
    }
    chomp $varname;

    if ($infilecontents =~/\#$varname\n(.*?)\n\n/s)
    {
        $varblock = "$1\n";
    }
    else
    {
        die "Nie znaleziono zmiennej $varname w pliku $infilename.\n";
    }

    @varblockarr = split (/\n/, $varblock);
    @outlinesarr = ();

    if ($pickatrandom)
    {
        # Generuj losowy cig z elementw wejciowych
        $randline = $varblockarr [ rand @varblockarr ];
        $curline = $baseline;
        chomp ($curline);
        chomp ($randline);
        $curline =~ s/$varname/$randline/;
        push (@outlinesarr, $curline);
    }
    else
    {
        #Generuj wszystkie moliwe kombinacje elementw wejciowych
        foreach $varline (@varblockarr)
        {
            $curline = $baseline;
            chomp ($curline);
            chomp ($varline):
            $curline =~ s/$varname/$varline/;
            push (@outlinesarr, $curline);
        }
    }

    $outlines = join ("\n", @outlinesarr);
    $outfilecontents =~ s/\Q$baseline\E/$outlines/s
        or die "nie znaleziono wiersza bazowego.\n";
    $outfilecontents =~ s/\n\n/\n/mg;
    open(OUTFILE, "> $outfilename")
        or die "Nie mona otworzy pliku $outfilename do zapisu: $!\n";
    print OUTFILE $outfilecontents;
    close(OUTFILE);
}
if ($pickatrandom)
{
    print $outfilecontents;
}
