#!/usr/bin/perl

use strict;

use lib 'd:/Programs/Perl/lib';
use Utils;
use JFile;

my $prg     = "ShowOperationGroupTable.exe";
my $OutFile = "out.txt";

unlink($OutFile);

print "Select LatticeType (IL):\n";
print "  0: Simple hexagonal\n";
print "  1: Other simple lattices\n";
print "  2: Face centered\n";
print "  3: Body centered\n";
print "  4: C centered\n";
print " -1: Trigonal in rhomb lattice\n";
print " >>";
my $IL = <> + 0;

my $cmd = "\"$prg\" $IL > \"$OutFile\"";
print "Execute [$cmd]\n";
my $ret = system($cmd);
#print "ret = $ret\n";
if($ret) {
	print "Error: Execution of [$cmd] failed.\n";
}

my $in = JFile->new($OutFile, "r");
if(!$in) {
	print "Error: Can not read [$OutFile].\n";
	exit -1;
}
my @Op;
my %OpHash;
$in->SkipTo("TABLE OF OPERATION CODE");
for(my $i = 0 ; ; $i++) {
	my $line = $in->ReadLine();
	last if(!defined $line);

	my ($idx, $name, $x, $y, $z) = Utils::Split("\\s+", $line);
	last if(!defined $z);

	$x =~ s/-W/-X+Y/;
	$y =~ s/-W/-X+Y/;
	$z =~ s/-W/-X+Y/;
	$x =~ s/W/X-Y/;
	$y =~ s/W/X-Y/;
	$z =~ s/W/X-Y/;
	print "  $idx: $name: ($x $y $z)\n";
	$Op[$idx]      = {Name => $name, x => $x, y => $y, z => $z};
	$OpHash{$name} = {ID => $idx, x => $x, y => $y, z => $z};
}

$in->SkipTo("GROUP TABLE FOR");
my $line = $in->ReadLine();
my @idx1 = Utils::Split("\\s+", $line);
my $nOp = @idx1;
print "\n";
print "# of operation without inversion: $nOp\n";
for(my $i = 0 ; $i < $nOp ; $i++) {
	my $ip1 = $i+1;
	print "$Op[$ip1]->{Name} ";
}
print "\n";

for(my $i = 0 ; ; $i++) {
	my $line = $in->ReadLine();
	last if(!defined $line);

	my ($idx, @a) = Utils::Split("\\s+", $line);
	last if(@a < $nOp-1);
	
	print "$Op[$idx]->{Name} ";
	for(my $j = 0 ; $j < @a ; $j++) {
		my $idx2 = $a[$j];
		print "$Op[$idx2]->{Name} ";
	}
	print "\n";
}

$in->SkipTo("INVERS ELEMENTS");
my @InvOp;
for(my $i = 0 ;  ; $i++) {
	my $line = $in->ReadLine();
	last if(!defined $line);

	my @a = Utils::Split("\\s+", $line);
	last if(@a == 0);

	push(@InvOp, @a);
#	@InvOp = (@InvOp, @a);
}
print "\n";
print "Inverse elements\n";
for(my $i = 0 ; $i < @InvOp ; $i++) {
	my $ip1 = $i+1;
	print "$Op[$ip1]->{Name}=>$Op[$InvOp[$i]]->{Name} ";
}
print "\n";

$in->Close();
