package Common::Date::Excel;

use Date::Calc qw( Add_Delta_Days );

use Common::Assert;

use base 'Common::Date';

sub priority { 600 }

sub type { 'excel' }

sub _patterns {
    [ new Common::Date::Pattern( pattern => '(\d+)', day => 1 ), new Common::Date::Pattern( pattern => '^([345]\d{4}\.)\d+$', day => 1 ), ];
}

sub days {
    my $days = shift->{_day} || return;

    if ( $days =~ /(\d+)\./ ) {
        return $1 - 2;
    } else {
        return $days;
    }
}

sub day {
    my $self = shift;

    assert( $self->days );
    assert( $self->days > 30000 && $self->days < 59999, 'days out of range' );

    my @date = Add_Delta_Days( 1900, 1, 1, $self->days );

    return $date[2];
}

sub month {
    my $self = shift;
    my @date = Add_Delta_Days( 1900, 1, 1, $self->days );

    return $date[1];
}

sub year {
    my $self = shift;
    my @date = Add_Delta_Days( 1900, 1, 1, $self->days );

    return $date[0];
}

1;
