use XML::LibXML;
use YAML::Loader;
use XML::Writer;
use Pod::DocBook;

use utf8;

open my $meta_fh, '<', '/home/yanick/work/xpathscript/trunk/META.yml' or die;

our $doc = XML::Writer->new( NEWLINES => 1 );

$doc->startTag( 'book' );

do_bookinfo();

do_podfile( '/home/yanick/work/xpathscript/trunk/lib/XML/XPathScript.pm' );

do_podfile( $_ ) for qw{
    /home/yanick/work/xpathscript/trunk/lib/XML/XPathScript/Stylesheet.pod
/home/yanick/work/xpathscript/trunk/lib/XML/XPathScript/Processor.pm
/home/yanick/work/xpathscript/trunk/lib/XML/XPathScript/Template.pm
/home/yanick/work/xpathscript/trunk/lib/XML/XPathScript/Template/Tag.pm
/home/yanick/work/xpathscript/trunk/lib_tomkit/Apache2/TomKit/Processor/XPathScript.pm
/home/yanick/work/xpathscript/trunk/lib_axkit/Apache/AxKit/Language/YPathScript.pm
/home/yanick/work/xpathscript/trunk/script/xpathscript
};

$doc->endTag;

$doc->end;

sub do_bookinfo {
    my $loader = YAML::Loader->new;
    my $meta;
    {
        local $/;
        $meta = $loader->load( <$meta_fh> );
    }

    $doc->startTag( 'bookinfo' );
    $doc->dataElement( 'title' => $meta->{name} );
    $doc->dataElement( 'subtitle' => 'version '.$meta->{version} );
    my @authors = @{$meta->{author}};
    $doc->startTag( 'authorgroup' ) if @authors > 1;
    process_author( $_ ) for @authors;
    $doc->endTag                    if @authors > 1;
    $doc->endTag( 'bookinfo' );
}

#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

sub process_author {
    my( $author ) = @_;

    $author =~ s/<.*?>//;

    my( $firstname, $surname ) = split ' ', $author;

    $doc->startTag( 'author' );
    $doc->dataElement( 'firstname' => $firstname );
    $doc->dataElement( 'surname' => $surname );
    $doc->endTag;

    return;
}

#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

sub do_podfile {
    my( $filename ) = @_;

    my $output;
    open my $fh_out, '>', \$output;

    my $parser = Pod::DocBook->new( doctype => 'chapter',
                                        spaces => 3 );

    $parser->parse_from_file( $filename, $fh_out );

    $output =~ s#(<anchor.*?)>#$1 />#g;
    $output =~ s/é/e/g;

    use utf8;
    utf8::encode( $output ) ;
    my $doc = XML::LibXML->new->parse_string( $output );

    $doc->setEncoding( 'utf8' );

    my( $chapter ) = $doc->findnodes( '/chapter' );

    my( $title_section ) = 
        $chapter->findnodes( './section[title/text()="NAME"]' );

    my( $title ) = $title_section ? 
                        $title_section->findvalue( 'para/text()' )
                        : ( undef );

    my( $name,  $desc ) = split '-', $title;

    my( $tn ) = $chapter->findnodes( './title' );
    $tn->appendText( $title );

    $chapter->removeChild( $title_section ) if $title_section;

    my $abbrev = XML::LibXML::Element->new( 'titleabbrev' );
    $chapter->appendChild( $abbrev );
    $abbrev->appendText( $name );

    move_description( $chapter );

    remove_sections ( $chapter, 'BUGS', 'AUTHORS', 'AUTHOR' );

    # move license to appendix

    print $chapter->toString( 0, 'utf8'  );

}

#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

sub remove_sections {
    my $chapter = shift;

    my @sections = map $chapter->findnodes( "section[title/text()='$_']" ), @_;

    $chapter->removeChild( $_ ) for @sections;

}

#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

sub move_description {
    my $chapter = shift;

    my $first = $chapter->firstChild;

    my( $description ) = $chapter->findnodes(
    'section[title/text()="DESCRIPTION"]' );

    return unless $description;
    my( $title ) = $description->findnodes( 'title' );
    $description->removeChild( $title );

    $chapter->insertBefore( $_, $first ) for $description->childNodes;
    $chapter->removeChild( $description );
}