package FreeMind::Node;

use 5.010001;
use strict;
use warnings;

BEGIN {
	$FreeMind::Node::AUTHORITY = 'cpan:TOBYINK';
	$FreeMind::Node::VERSION   = '0.002';
}

use XML::LibXML::Augment
	-type  => 'Element',
	-names => ['node'],
;

require FreeMind::Document;
require Types::Standard;
require Type::Utils;

my $Milliseconds = Types::Standard::Int()
	-> create_child_type(
		constraint => sub { $_ >= 0 },
		inlined    => sub { sprintf '%s and %s >= 0', $_[0]->parent->inline_check($_[1]), $_[1] },
	)
	-> plus_coercions(
		Type::Utils::class_type({class => 'DateTime'}),
		q{ 1000 * $_->epoch },
	);

__PACKAGE__->FreeMind::Document::_has(
	BACKGROUND_COLOR  => { },
	COLOR             => { },
	FOLDED            => { isa => Types::Standard::Bool() },
	ID                => { },
	LINK              => { },
	POSITION          => { isa => Type::Utils::enum(Position => [qw/left right/]) },
	STYLE             => { },
	TEXT              => { required => 1 },
	CREATED           => { isa => $Milliseconds },
	MODIFIED          => { isa => $Milliseconds },
	HGAP              => { isa => Types::Standard::Int() },
	VGAP              => { isa => Types::Standard::Int() },
	VSHIFT            => { isa => Types::Standard::Int() },
	ENCRYPTED_CONTENT => { },
);

sub nodes
{
	shift->findnodes('./node')
}

sub toHash
{
	my $self = shift;
	return {
		$self->text => { map %{$_->toHash}, $self->nodes },
	}
}

sub toText
{
	require Text::Wrap;
	
	my $self = shift;
	my ($indent, $wrap) = @_;
	$indent ||= 0;
	local $Text::Wrap::columns = $wrap || 72;
	
	my $text = Text::Wrap::wrap(
		(q[ ] x ($indent * 4)).q[  * ],
		(q[ ] x (($indent+1) * 4)),
		$self->text,
	);
	
	# WTF?? Why Text::Wrap do this??
	$text =~ s/\t/        /gsm;
	
	join("\n", $text, $self->nodes->map(sub { $_->toText($indent+1, $wrap) }));
}

1;


__END__

=pod

=encoding utf-8

=head1 NAME

FreeMind::Document - a FreeMind C<< <node> >> XML element

=head1 DESCRIPTION

This is a subclass of L<XML::LibXML::Element> providing the following
attribute accessors:

=over

=item C<< background_color >>

=item C<< color >>

=item C<< folded >>

=item C<< id >>

=item C<< link >>

=item C<< position >>

=item C<< style >>

=item C<< text >>

=item C<< created >>

=item C<< modified >>

=item C<< hgap >>

=item C<< vgap >>

=item C<< vshift >>

=item C<< encrypted_content >>

=back

=head1 SEE ALSO

L<FreeMind::Document>, L<FreeMind::Map>.

=head1 AUTHOR

Toby Inkster E<lt>tobyink@cpan.orgE<gt>.

=head1 COPYRIGHT AND LICENCE

This software is copyright (c) 2013 by Toby Inkster.

This is free software; you can redistribute it and/or modify it under
the same terms as the Perl 5 programming language system itself.

=head1 DISCLAIMER OF WARRANTIES

THIS PACKAGE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR IMPLIED
WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.