#!/usr/bin/perl

while (<>) {
  chomp;
  split / +/;
  next if ($_[1] ne "->");
  push(@{$map{$_[0]}}, $_[2]." ".($_[3]=~/^\[(.+)\]$/)[0]." ".$_[4]." ".($_[5]=~/^\((.+)\)$/)[0]." ".($_[6]=~/^\((.+)\)$/)[0]);
#  print ("$_[0] ->> ".$_[2]." ".($_[3]=~/^\[(.+)\]$/)[0]." ".$_[4]." ".($_[5]=~/^\((.+)\)$/)[0]." ".($_[6]=~/^\((.+)\)$/)[0]."\n");
  $node{$_[4]} = $_[2];
  $tr{$_[4]} = $_[0];
}

#print "strict digraph XS26 {\n";
print "digraph XS26 {\n";
print "\tsize=\"20,15\";\n";
print "\tratio=\"fill\";\n";
print "\tedge [ arrowsize = 0.5 ];\n";
#print "\tnodesep=50000000\n";
print "\tnode [ color = red, shape=triangle, label=\"Invalid\\nhost\", style=filled ];\n";

sub mknode {
  my ($z, $as, $mail) = @_;
  $_ = $z;

  if ($node{$_} eq "BACKBONE" or $node{$_} eq "USER") { $shp = "box"; push(@{$map{$_}}, "$node{$_} ? $tr{$_} ? ?"); }
  elsif ($node{$_} eq "XS26") { $shp = "ellipse"; }
  else { $shp = "triangle"; }
  print "\t\"$_\" [ label = \"$_\\n$node{$_}".($mail?"\\n$as\\n$mail":"")."\", shape = ".$shp.", color = gold ]\n";
}

foreach $n (keys %map) { for ($i = 0; $i < @{$map{$n}}; $i++) {
  @node1 = split (/ /, $map{$n}[$i]);
  for ($j = 0; $j < @{$map{$node1[2]}}; $j++) { if ((split(/ /,$map{$node1[2]}[$j]))[2] eq $n) { last; }; }
  @node2 = split (/ /, $map{$node1[2]}[$j]);

#  print "@node1 ($n - $i) :: @node2 ($node1[2] - $j)\n";

  if ($node1[0] eq "BACKBONE" or $node1[0] eq "USER") { @z=@node1; @node1=@node2; @node2=@z; }
  
  if (not $node1[2]) { $node1[2] = $n; }
  if (not $node1[1]) { $node1[1] = $node2[1]; }

#  print "@node1 ($n - $i) :: @node2 ($node1[2] - $j)\n";

  next if ($visited{"$node2[2] $node1[2]"} or $visited{"$node1[2] $node2[2]"});

#  print "@node1 :: @node2\n";

  if ($node2[2] and not $made{$node2[2]}) { mknode($node2[2], $node2[3], $node2[4]); $made{$node2[2]}=1; }
  if ($node1[2] and not $made{$node1[2]}) { mknode($node1[2], $node1[3], $node1[4]); $made{$node1[2]}=1; }

  $visited{"$node2[2] $node1[2]"} = 1;
  print "\t\"$node2[2]\" -> \"$node1[2]\" ";

  if ($node2[0] eq "BACKBONE" or $node2[0] eq "USER") { print "[ taillabel = \"$node1[1]\", weight = 1, color = brown ]"; }
  else {
    $node1[3] = "+1000" if ($node1[3] == '?');
    $node2[3] = "+1000" if ($node2[3] == '?');

    $l = "weight = 5, ";

    if ($note1[3] ne "+1000" and $note2[3] ne "+1000") {
      # 41 would be valid?
      $s = (1+$node1[3]+$node2[3]);
      $l = "weight = ".(500/$s).", ";
      if ($s < 22) { $l.="color = red, " }
      elsif ($s < 62) { $l.="color = blue, " }
      elsif ($s > 122) { $l.="color = gray, " }
    }

    print "[ label = \"$node1[3]/$node2[3]\", ${l}taillabel = \"$node1[1]\", headlabel = \"$node2[1]\", decorate = 1 ]"; }
  print "\n";
} }

print "\tlabel = \"\\n\\nXS26 Network map\\nLatency +1000 means no latency known yet.\"; fontsize=20;\n";
print "}\n";

