require 'rubygems'
require 'graphviz'

class GraphViz
  class FamilyTree
    class Person
      def initialize( graph, tree, generation, id ) #:nodoc:
        @graph = graph
        @node = @graph.add_node( id )
        @node["shape"] = "box"
        @tree = tree
        @generation = generation
        @x, @y = 0, 0
        @sibling = nil
      end
      
      def id
        @node.id
      end
      
      def name
        @node.label || @node.id
      end
      
      def sibling
        @sibling
      end
      
      def sibling=(x)
        @sibling=x
      end
      
      def couples #:nodoc:
        @couples
      end
      
      def node #:nodoc:
        @node
      end
      
      # Define the current person as a man
      #
      #  greg.is_a_man( "Greg" )
      def is_a_man( name )
        @node["label"] = name
        @node["color"] = "blue"
      end
      
      # Define the current person as a boy
      #
      #  greg.is_a_boy( "Greg" )
      def is_a_boy( name )
        is_a_man( name )
      end
      
      # Define the current perdon as a woman
      #
      #  mu.is_a_woman( "Muriel" )
      def is_a_woman( name )
        @node["label"] = name
        @node["color"] = "pink"
      end
      # Define the current perdon as a girl
      #
      #  maia.is_a_girl( "Maia" )
      def is_a_girl( name )
        is_a_woman( name )
      end
      
      # Define that's two persons are maried
      #
      #  mu.is_maried_with greg
      def is_maried_with( x )
        node = @graph.add_node( "#{@node.id}And#{x.node.id}" )
        node["shape"] = "point"
        @graph.add_edge( @node, node, "dir" => "none" )
        @graph.add_edge( node, x.node, "dir" => "none" )
        @tree.add_couple( self, x, node )
      end
      
      # Define that's two persons are divorced
      #
      #  sophie.is_divorced_with john
      def is_divorced_with( x )
        node = @graph.add_node( "#{@node.id}And#{x.node.id}" )
        node["shape"] = "point"
        node["color"] = "red"
        @graph.add_edge( @node, node, "dir" => "none", "color" => "red" )
        @graph.add_edge( node, x.node, "dir" => "none", "color" => "red" )
        @tree.add_couple( self, x, node )
      end
      
      # Define that's a person is widower of another
      #
      #  simon.is_widower_of elisa
      def is_widower_of( x ) #veuf
        node = @graph.add_node( "#{@node.id}And#{x.node.id}" )
        node["shape"] = "point"
        node["color"] = "green"
        @graph.add_edge( @node, node, "dir" => "none", "color" => "green" )
        @graph.add_edge( node, x.node, "dir" => "none", "color" => "green" )
        @tree.add_couple( self, x, node )
      end

      # Define the current person as dead
      #
      #  jack.is_dead
      def is_dead
        @node["style"] = "filled"
      end
      
      # Define the kids of a single person
      #
      #   alice.kids( john, jack, julie )
      def kids( *z )
        GraphViz::FamilyTree::Couple.new( @graph, @node, [self] ).kids( *z )
      end
    end
  end
end
