#!/usr/local/bin/perl -w
###########################################
# label-writer - Use OpenOffice to write 
#                address labels
# Mike Schilli, 2011 (m@perlmeister.com)
###########################################
use strict;
use OpenOffice::OODoc;
use Sysadm::Install qw( :all );
use Text::CSV_XS;
use POSIX qw(ceil);

my $template        = "template.odt";
my $file            = "ready.odt";
my $addr_book       = "address-book.csv";
my $labels_per_page = 30;

my @addresses = 
   addresses_scan( $addr_book);

my $addtl_pages = 
  ceil( scalar @addresses /
       $labels_per_page ) - 1;

  # Put template in place
cp $template, $file;

my $doc = ooDocument( 
 file           => $file,
 type           => "content",
 local_encoding => "",
);

  # Extend document as necessary
my @rows = $doc->selectElements(
    '//office:body/office:text/text:p'
);

for ( 1 .. $addtl_pages ) {
  for my $row ( @rows ) {
      $doc->replicateElement( $row, "body" );
  }
}

  # All labels, including new ones
my @labels = $doc->selectElements(
  '//office:body/office:text/text:p/' .
  'draw:frame/draw:text-box/text:p'
);

my $addr_idx = 0;

for my $label ( @labels ) {
    $doc->setStyle( $label, "P1" );
    $doc->setText( $label, 
                $addresses[ $addr_idx ] );
    $addr_idx++;
    $addr_idx = 0 if 
      $addr_idx > $#addresses;
}

$doc->save();

###########################################
sub addresses_scan {
###########################################
  my( $addr_book ) = @_;

  my @addresses = ();

  open( my $fh, "<:encoding(utf8)", 
    $addr_book ) or die "$addr_book: $!";

  my $csv = Text::CSV_XS->new ( 
   { binary => 1 } ) or die 
     "Cannot use CSV: " . 
     Text::CSV->error_diag ();

  while( my $row = $csv->getline( $fh ) ) {
    unshift @$row, "";

    for ( @$row ) {
      s/^/ /;
    }

    push @addresses, 
         join( "\n", @$row );
    }
  close $fh;

  return @addresses;
}
