#!perl
# gen-hu : auxiliary script for Hungarian
#
# output files
#
#   t-hu.txt (a main part of data/hu.txt)
#   t-hu.t   (a main part of t/loc_hu.t)
#
use strict;
use warnings;

my @a = qw( cs dz dzs gy ly ny sz ty zs );

open my $textf, ">t-hu.txt" or die "t-hu.txt";
binmode $textf;
my $text1 = '';
my $text2 = "#here ccs is identical to cscs etc.\n";

open my $testf, ">t-hu.t" or die "t-hu.t";
binmode $testf;
my $test1 = '';
my $test2 = '';

for my $e (@a) {
    my @c = split //, $e;
    my $u1 = uc $c[0];
    my $l1 = lc $c[0];
    my $u2 = uc $c[1];
    my $l2 = lc $c[1];
    my @set;
    if (@c == 2) {
	@set = map { ($_ & 2 ? $u1 : $l1).($_ & 1 ? $u2 : $l2) } (0..3);
    } else {
	my $u3 = uc $c[2];
	my $l3 = lc $c[2];
	@set = map { ($_ & 4 ? $u1 : $l1).($_ & 2 ? $u2 : $l2)
					 .($_ & 1 ? $u3 : $l3) } (0..7);
    }

    my $set = @set;
    my $s_1 = $set - 1;
    my $max = 2 * $set -1;
    my @third = (8,2,7);
    for my $i (0..$s_1) {
	$text1 .= "{" . $set[$i] . "};";
	$text1 .= ($i ? $u1 : $l1). "+" .(@c == 2 ? 1 : 2);
	if ($i != 0 && $i != $s_1) {
	    $text1 .= "---1 ";
	    $text1 .= sprintf "[.0.0.%d.0]", $third[$i < $set/2];
	    $text1 .= sprintf "[.0.0.%d.0]", $third[$i % 3] if @c == 3;
	}
	$text1 .= "\n";
    }
    for my $i (0..$max) {
	my $f = $i & $set ? $u1 : $l1;
	my $left = $f. $set[$i & $s_1];
	my $r1 = $set[$i & $set ? $s_1 : 0];
	my $r2 = $set[$i & $s_1];

	$text2 .=  "{$left};<{$r1}><{$r2}>\n";
	$test2 .= qq|ok(\$objHu->eq("$left", "$r1$r2"));\n|;
    }
    for my $i (1..$s_1) {
	$test1 .= qq|ok(\$objHu->eq("$set[$i-1]", "$set[$i]"));\n|;
    }
}

print $textf "$text1$text2";
close $textf or die '$textf';

#------
my $count1 = $test1 =~ s/->eq/->eq/g;
my $count2 = $test2 =~ s/->eq/->eq/g;

my $test_count = 34;
print $testf "\n# $test_count\n\n";

print $testf "\$objHu->change(level => 2);\n\n";
print $testf $test1;
$test_count += $count1;
print $testf "\n# $test_count\n\n";

$test_count += 6;
print $testf "\n# $test_count\n\n";

$test1 =~ s/->eq/->lt/g;
print $testf "\$objHu->change(level => 3);\n\n";
print $testf $test1;
$test_count += $count1;
print $testf "\n# $test_count\n\n";

$test_count += 22;
print $testf "\n# $test_count\n\n";

print $testf $test2;
$test_count += $count2;
print $testf "\n# $test_count\n\n";

$test1 =~ s/->lt/->gt/g;
print $testf "\$objHu->change(upper_before_lower => 1);\n\n";
print $testf $test1;
$test_count += $count1;
print $testf "\n# $test_count\n";

close $testf or die '$testf';
