#!/usr/bin/perl

use strict; use warnings; use 5.010;
use DateTime::Format::Duration;
use DateTime::Duration;
use DateTime;
use Data::Dumper;

# 11d 1h 34min 45sec 960000000ns
my $duration = shift // '00000011013445.960000000:000';
(my $duration_no_zeros = $duration) =~ s/^0+//;


my $pattern = '%8e%H%M%S.%N:000';
my $pattern_no_zeros = '%e%H%M%S.%N:000';

say "Processing string [$duration]\n";

say "Result using D::F::D and pattern [$pattern]:\n" . Dumper( dfd( $pattern => $duration ) );
say "Hand rolled result:\n" . Dumper( hand_rolled( $duration ) );

say "Processing string [$duration_no_zeros]\n";

say "Result using D::F::D and pattern [$pattern_no_zeros]:\n" . Dumper( dfd( $pattern_no_zeros => $duration_no_zeros ) );
say "Hand rolled result:\n" . Dumper( hand_rolled( $duration_no_zeros ) );

exit;

sub dfd {
  my ($p, $d) = @_;
  my $dfd = DateTime::Format::Duration->new( pattern => $pattern,
                                             normalise => 1,
                                           );
  return $dfd->parse_duration( $d );
}

sub hand_rolled {
  my ($d) = @_;

  if ( $d =~ m/^(\d+)(\d\d)(\d\d)(\d\d)\.(\d{9})(:000)?$/ ) {
    my $blah = DateTime::Format::Duration->new( normalise => 1 );
    return DateTime::Duration->new( $blah->normalise( days => $1,
                                                      hours => $2,
                                                      minutes => $3,
                                                      seconds => $4,
                                                      nanoseconds => $5,
                                                    )
                                  );
  }

  return undef;
}
