#!/usr/bin/perl

# Copyright (c) 2006 Joe Leslie-Hurd, distributed under the MIT license

use strict;
use warnings;
use Pod::Usage;
use Getopt::Std;

use vars qw($opt_h);

getopts('h');

if ($opt_h)
{
    pod2usage({-exitval => 2,
	       -verbose => 2});
}

# Autoflush STDIN
$|++;

sub nested_case {
    (scalar @_ == 5) or die;
    my $level = shift @_;
    my $ind = shift @_;
    my $edge = shift @_;
    my $friend = shift @_;
    my $enemy = shift @_;

    if ($level == 4) {
        my $f = "\n" . $ind . "group" . $friend . $enemy . " bl ss ko lb lc s p";
        for (my $n = 1; $n <= $friend; ++$n) { $f .= " f" . $n; }
        if ($friend + $enemy < 4) {
            my $fl = 4 - ($edge + 2 * $friend + $enemy);
            $fl =~ s/-/~/;
            $f .= " $fl";
        }
        $f .= " (*GomiDebug()*)";
        for (my $n = 1; $n <= $enemy; ++$n) { $f .= " e" . $n; }
        print STDOUT $f;
    }
    else {
        if ($level == 0) {
            print STDOUT $ind;
        }
        else {
            print STDOUT ("\n" . $ind . "(");
            $ind .= " ";
        }

        my $next_level = $level + 1;

        print STDOUT ("case n" . $next_level . " of");

        for (my $n = 0; $n < 4; ++$n) {
            my $next_edge = $edge;
            my $next_friend = $friend;
            my $next_enemy = $enemy;

            if ($n == 0) {
                ++$next_edge;
                print STDOUT ("\n" . $ind . "  Edge =>");
            }
            elsif ($n == 1) {
                print STDOUT ("\n" . $ind . "| Empty =>");
            }
            elsif ($n == 2) {
                ++$next_friend;
                print STDOUT ("\n" . $ind . "| Friend f" .
                              $next_friend . " =>");
            }
            elsif ($n == 3) {
                ++$next_enemy;
                print STDOUT ("\n" . $ind . "| Enemy e" .
                              $next_enemy . " =>");
            }
            else {
                die;
            }

            if ($next_edge <= 2) {
                my $next_ind = $ind . "  ";
                nested_case ($next_level, $next_ind,
                             $next_edge, $next_friend, $next_enemy);
            }
            else {
                print STDOUT " tooManyEdges ()";
            }
        }

        if ($level != 0) {
            print STDOUT ")";
        }
    }
}

my $ind = "          ";
print STDOUT "$ind(* Automatically generated by scripts/bigcase *)\n";
nested_case (0,$ind,0,0,0);
print STDOUT "\n";

__END__

=pod

=head1 NAME

bigcase - Automatically generates a big case split in IBoard.sml

=head1 SYNOPSIS

bigcase [-h]

=head1 ARGUMENTS

The recognized flags are described below:

=over 2

=item B<-h>

Produce this documentation.

=back

=head1 DESCRIPTION

Generates a big case split, because I got fed up editing it by hand.

=head1 BUGS

Waiting to rear their ugly heads.

=head1 AUTHORS

Joe Leslie-Hurd <joe@gilith.com>

=head1 SEE ALSO

Perl(1).

=cut
