#!/usr/bin/perl -W

use strict;
use warnings;

use Gtk2 -init;
use Cairo;

use AA;
use AA::Gfx;
use AA::UI;
use AA::Graph;
use AA::Net;
use AA::Anim;

my $ui = AA::UI->new('');

my $back = AA::Background->new('bg');

my $title = AA::Label->new('title');
$title->MultiSet(
	'text' => 'Goldbergův algoritmus',
	'size' => 60,
	'x' => 1024/2,
	'y' => 80,
);

my @v;
for (my $i=0; $i<5; $i++) {
	my $v = AA::NetV->new("v$i");
	$v->MultiSet(
		'x' => 100 + 180*$i,
		'y0' => 600,
		'label' => ($i == 0) ? "Z" : ($i == 4) ? "S" : $i,
		'h' => ($i == 0) ? 5 : 0,
	);
	push @v, $v;
}

my @e;
for (my $i=0; $i<4; $i++) {
	my $e = AA::NetE->new("e$i", $v[$i], $v[$i+1]);
	$e->Set('c', 5);
	$e->Set('f', 0);
	push @e, $e;
}

for (my $i=1; $i<@v; $i++) {
	my $ii = $i;	# need to keep a copy in the current closure
	$v[$i]->Bind('xs', sub { $e[$ii-1]->Get('f') - (($ii == @v-1) ? 0 : $e[$ii]->Get('f')) });
}
$v[4]->{XS}->Set('color', [0,1,0]);

sub flow($$) {
	my ($i,$df) = @_;
	$e[$i]->Set('f', $e[$i]->Get('f') + $df);
}

sub up($) {
	my ($i) = @_;
	$v[$i]->Set('h', $v[$i]->Get('h') + 1);
}

sub hint($) {
	my ($h) = @_;
	for (my $i=0; $i<@v; $i++) {
		$v[$i]->Set('hint', $i == $h);
	}
}

my $scenario;

if (!@ARGV || $ARGV[0] eq "1") {
	$scenario = [
		sub { flow(0, 5);	hint(1); },
		sub { up(1); },
		sub { flow(1, 5);	hint(2); },
		sub { up(2); },
		sub { flow(2, 5);	hint(3); },
		sub { up(3); },
		sub { flow(3, 5);	hint(-1); },
	];
} elsif ($ARGV[0] eq "2") {
	$title->Set('text', "Goldberg v úzkých");
	for (my $i=0; $i<@v-1; $i++) {
		$e[$i]->Set('c', 5-$i);
	}
	$scenario = [
		sub { flow(0, 5); hint(1); },
		sub { up(1); },
		sub { flow(1, 4); hint(2); },
		sub { up(2); },
		sub { flow(2, 3); hint(3); },
		sub { up(3); },
		sub { flow(3, 2); },
		sub { up(3); },
		sub { flow(2, -1); hint(2); },
		sub { up(2); },
		sub { flow(1, -1); hint(1); },
		sub { up(1); },
		sub { up(1); },
		sub { flow(1, 1); },
		sub { up(1); },
		sub { up(1); },
		sub { up(1); },
		sub { flow(0, -1); hint(2); },
		sub { up(2); },
		sub { flow(2, 1); hint(3); },
		sub { up(3); },
		sub { up(3); },
		sub { flow(2, -1); hint(2); },
		sub { up(2); },
		sub { up(2); },
		sub { flow(2, 1); hint(3); },
		sub { up(3); },
		sub { up(3); },
		sub { flow(2, -1); hint(2); },
		sub { up(2); },
		sub { up(2); },
		sub { flow(2, 1); },
		sub { flow(1, -1); hint(1); },
		sub { flow(0, -1); hint(3); },
		sub { up(3); },
		sub { up(3); },
		sub { flow(2, -1); hint(2); },
		sub { flow(1, -1); hint(1); },
		sub { flow(0, -1); hint(-1); },
	];
} elsif ($ARGV[0] eq "3") {
	$title->Set('text', "Goldberg s nejvyšším vrcholem");
	for (my $i=0; $i<@v-1; $i++) {
		$e[$i]->Set('c', 5-$i);
	}
	$scenario = [
		sub { flow(0, 5); hint(1); },
		sub { up(1); },
		sub { flow(1, 4); },
		sub { up(1); },
		sub { up(1); },
		sub { up(1); },
		sub { up(1); },
		sub { up(1); },
		sub { flow(0, -1); hint(2); },
		sub { up(2); },
		sub { flow(2, 3); },
		sub { up(2); },
		sub { up(2); },
		sub { up(2); },
		sub { up(2); },
		sub { up(2); },
		sub { up(2); },
		sub { flow(1, -1); hint(1); },
		sub { flow(0, -1); hint(3); },
		sub { up(3); },
		sub { flow(3, 2); },
		sub { up(3); },
		sub { up(3); },
		sub { up(3); },
		sub { up(3); },
		sub { up(3); },
		sub { up(3); },
		sub { up(3); },
		sub { flow(2, -1); hint(2); },
		sub { flow(1, -1); hint(1); },
		sub { flow(0, -1); hint(-1); },
	];
} else {
	die "What do you want?\n";
}

$ui->RunScenario($scenario);
