#!/usr/bin/perl -w
###########################################
# router-setup - use yaml data to set 
#   up neo4j data model
# Mike Schilli, 2014 (m@perlmeister.com)
###########################################
use strict;
use FindBin qw( $Bin );
use REST::Neo4p;
use YAML qw( LoadFile );
use Log::Log4perl qw( :easy );

Log::Log4perl->easy_init();

my %lans     = ();
my @gateways = ();

REST::Neo4p->connect(
 'http://127.0.0.1:7474' ) or die;

  # Delete all data
my $query = REST::Neo4p::Query->new('
MATCH (n)
OPTIONAL MATCH (n)-[r]-()
DELETE n,r');
$query->execute;

my $index = REST::Neo4p::Index->new(
  "node", "router_index" );

my $yaml = LoadFile( "$Bin/routers.yml" );

for my $router ( @$yaml ) {

  DEBUG "Adding router ",
   "$router->{ name }/$router->{ lan_ip }";

  my $node =
    REST::Neo4p::Node->new( $router );
  $index->add_entry( $node, 
      { name => $router->{ name } } );

  if( exists $router->{ gateway } ) {
    push @gateways, 
      [ $node, $router->{ gateway } ];
  }

  $lans{ $router->{ lan_ip } } = $node;
}

for my $gateway ( @gateways ) {
  my( $node, $gateway_ip ) = @$gateway;

  if( !exists $lans{ $gateway_ip } ) {
    die "Gateway $gateway_ip not defined";
  }

  DEBUG "Adding ", 
    $node->get_property("name"), 
      " -[:gateway]-> ",
      $lans{ $gateway_ip }->
        get_property("name"); 

  $node->relate_to( 
    $lans{ $gateway_ip }, "gateway" );
}
