package PageOrder;
use strict;

sub new {
  my $proto = shift;
  my $class = ref($proto) || $proto;
  my $self  = {};
  my $data = 0;
  my $line = undef;
  my $attr = undef;
  my $val = undef;
  my $nothing = undef;
  $self->{NAME}   = undef;
  $self->{PREPENDS}  = [];
  $self->{APPENDS}  = [];
  $self->{PRINTED} = 0;

  # Load pageorder from stdin
  while(! ( ($line = <STDIN>) =~ /}/)) {
    next if $line =~ /^\#/;               # Skip comments
    next if $line eq "\n";        # Skip emptylines

    for ($line) {
      s/^\s+//;
      s/\s+$//;
    }

    ($attr,$val) = split /\s+/, $line, 2;

    if($attr eq "data") {
      $data = 1;
    }

    for ($attr) {
      SWITCH: {
        /^name$/i && do { $self->{NAME} = $val; last SWITCH; };
        /^file$/i && do { if(!$data) { push @{$self->{PREPENDS}}, $val; }
                             else { push @{$self->{APPENDS}}, $val; }
                        last SWITCH; };
        $nothing = 1;
      }
    }
  }

  bless ($self, $class);
  return $self;
}

sub print {
  my $self = shift;
  my $file = undef;

  if($self->{PRINTED} == 0) {
  # First make sure prepends and appends have been printed before us
  foreach $file (@{$self->{PREPENDS}}) {
    &findAndPrint($self,$file);
  }
  foreach $file (@{$self->{APPENDS}}) {
    &findAndPrint($self,$file);
  }

  print "    PageOrder {\n";
  print "      name $self->{NAME}\n";
  foreach $file (@{$self->{PREPENDS}}) {
    print "      part $file\n";
  }
  print "      data\n";
  foreach $file (@{$self->{APPENDS}}) {
    print "      part $file\n";
  }
  print "    }\n";

    $self->{PRINTED} = 1;
  }

  return;
}

sub findAndPrint {
  my $self = shift;
  my ($file) = @_;
  my $page = undef;
  my $found = 0;

  $file =~ s/(=?\\)\"//g;

  foreach $page (@::pages) {
    if($page->page_type eq "PAGEORDER") {
      if($page->name eq $file) {
        $found = 1;
        if($page->printed == 0) {
          $page->print();
        }
      }
    }
  }

  print "Could not find reference to `$file'...\n" if !$found;

  return;
}

sub find {
  my $self = shift;
  my ($file) = @_;
  my $page = undef;
  my $found = 0;
  $file =~ s/(=?\\)\"//g;
  foreach $page (@::pages) {
    if($page->page_type eq "PAGEORDER") {
      if($page->name eq $file) {
        return $page->path;
      }
    }
  }

  return "(not found)";
}


sub name {
          my $self = shift;
          if (@_) { $self->{NAME} = shift }
          return $self->{NAME};
}

sub prepends {
          my $self = shift;
          if (@_) { @{ $self->{PREPENDS} } = @_ }
          return @{ $self->{PREPENDS} };
}

sub appends {
          my $self = shift;
          if (@_) { @{ $self->{APPENDS} } = @_ }
          return @{ $self->{APPENDS} };
}

sub printed {
          my $self = shift;
          if (@_) { $self->{PRINTED} = shift }
          return $self->{PRINTED};
}

1;  # so the require or use succeeds
