The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
# $Id: Date.pm 7370 2012-04-09 01:17:33Z chris $

=head1 NAME

WebService::IMDB::Date

=head1 DESCRIPTION

Constructor always returns a L<DateTime::Incomplete>.

=cut

package WebService::IMDB::Date;

use strict;
use warnings;

our $VERSION = '0.05';

use Carp;
our @CARP_NOT = qw(WebService::IMDB WebService::IMDB::Trivium);

use DateTime::Format::Strptime;
use DateTime::Incomplete;


sub _new {
    my $class = shift;
    my $ws = shift;
    my $data = shift or die;

    if (ref $data eq "HASH" && exists $data->{'normal'} && defined $data->{'normal'}) {
	# TODO: Check whehter locale affects this.
	my $dt = $data->{'normal'};
	my ($y, $m, $d) = $dt =~ m/^(\d{4})(?:-(\d{2})(?:-(\d{2}))?)?$/ or die "Failed to parse '$dt'";
	if (defined $y && defined $m && defined $d) {
	    return DateTime::Incomplete->new('year' => $y, 'month' => $m, 'day' => $d);
	} elsif (defined $y && defined $m) {
	    return DateTime::Incomplete->new('year' => $y, 'month' => $m);
	} elsif (defined $y) {
	    return DateTime::Incomplete->new('year' => $y);
	} else {
	    die "";
	}

    } elsif (ref $data eq "HASH" && exists $data->{'text'}) {

	if (!defined $data->{'text'}) { # A bit hacky, but not sure how else to deal with this.
	    return undef;
	} else {
	    # Some 'text' dates are actually parseable, e.g. those of the format "July 14, 2007".  Attempt to detect them
	    # and parse to a DateTime::Incomplete
	    my $d = DateTime::Format::Strptime->new('pattern' => "%B %d, %Y", 'on_error' => "undef")->parse_datetime($data->{'text'});
	    if (defined $d) {
		return DateTime::Incomplete->new('year' => $d->year(), 'month' => $d->month(), 'day' => $d->day());

	    } elsif ($data->{'text'} =~ m/^\d{1,2}\/\d{2}$/) {
		my ($m, $y) = $data->{'text'} =~ m/^(\d{1,2})\/(\d{2})$/ or die "Failed to parse '$data->{'text'}'";
		return DateTime::Incomplete->new('year' => $y, 'month' => $m);

	    } elsif ($data->{'text'} =~ m/^\d{1,2}\/\d{1,2}\/\d{2}$/) {
		my ($m, $d, $y) = $data->{'text'} =~ m/^(\d{1,2})\/(\d{1,2})\/(\d{2})$/ or die "Failed to parse '$data->{'text'}'";
		return DateTime::Incomplete->new('year' => $y, 'month' => $m, 'day' => $d);

	    } else {
		return $data->{'text'};
	    }
	}

    } elsif (ref $data eq "" && $data =~ m/^\d{4}-\d{2}-\d{2}$/) {
	my ($y, $m, $d) = $data =~ m/^(\d{4})-(\d{2})-(\d{2})$/ or die "Failed to parse '$data'";
	return DateTime::Incomplete->new('year' => $y, 'month' => $m, 'day' => $d);

    } else {
	croak "Unable to parse date";
    }
}

1;