package HTML::FormFu::Element::DateTime;

use strict;
use base 'HTML::FormFu::Element::Date';

use Scalar::Util qw( blessed );

__PACKAGE__->mk_attrs( qw/ time / );

sub new {
   my $self = shift->next::method(@_);

   $self->time( {
           type   => '_TimeText',
           prefix => [],
       });

   $self->strftime("%d-%m-%Y %H:%M");

   return $self;
}

sub _add_elements {
   my $self = shift;

   $self->next::method(@_);

   _add_time($self);

   return;
}

sub _date_defaults {
   my $self = shift;

   my $default = $self->default;

   if ( defined $default ) {
       if ( blessed($default) && $default->isa('DateTime') ) {
           $self->day->{default}   = $default->day;
           $self->month->{default} = $default->month;
           $self->year->{default}  = $default->year;
           $self->time->{default}  = sprintf( "%02s:%02s", $default->hour, $default->minute);
       } else {
           my $builder = DateTime::Format::Builder->new;
           $builder->parser( { strptime => $self->strftime } );

           my $dt = $builder->parse_datetime($default);

           $self->day->{default}   = $dt->day;
           $self->month->{default} = $dt->month;
           $self->year->{default}  = $dt->year;
           $self->time->{default}  = sprintf( "%02s:%02s", $dt->hour, $dt->minute);
       }
   }

   return;
}

sub _add_time {
   my ($self) = @_;

   my $time = $self->time;

   my $time_name = _build_time_name($self);

   $self->element( {
           type    => $time->{type},
           name    => $time_name,
           defined $time->{default}
           ? ( default => $time->{default} )
           : (),
       } );

   return;
}

sub _build_time_name {
   my ($self) = @_;

   my $time_name
       = defined $self->time->{name}
       ? $self->time->{name}
       : sprintf "%s_time", $self->name;

   return $time_name;
}

sub process_input {
   my ( $self, $input ) = @_;

   my $day_name   = $self->_build_day_name;
   my $month_name = $self->_build_month_name;
   my $year_name  = $self->_build_year_name;
   my $time_name  = $self->_build_time_name;

   $day_name   = $self->get_element( { name => $day_name } )->nested_name;
   $month_name = $self->get_element( { name => $month_name } )->nested_name;
   $year_name  = $self->get_element( { name => $year_name } )->nested_name;
   $time_name  = $self->get_element( { name => $time_name } )->nested_name;

   my $day   = $self->get_nested_hash_value( $input, $day_name );
   my $month = $self->get_nested_hash_value( $input, $month_name );
   my $year  = $self->get_nested_hash_value( $input, $year_name );
   my $time  = $self->get_nested_hash_value( $input, $time_name );

   my ( $hour, $minute ) = split( ':', defined $time ? $time : '' );

   if (   defined $day
       && length $day
       && defined $month
       && length $month
       && defined $year
       && length $year
       && defined $hour
       && length $hour
       && defined $minute
       && length $minute )
   {
       my $dt;

       eval {
           $dt = DateTime->new(
               day   => $day,
               month => $month,
               year  => $year,
               hour  => $hour,
               minute => $minute
           );
       };

       my $value;

       if ($@) {
           $value = $self->strftime;
       } else {
           $value = $dt->strftime( $self->strftime );
       }

       $self->set_nested_hash_value( $input, $self->nested_name, $value );
   }
}

1;

__END__

=head1 NAME

HTML::FormFu::Element::DateTime - 3 select menu multi-field plus time input
field

HTML::FormFu::Element::_DateText is the same as
HTML::FormFu::Element::_DateSelect instead it is inherited from the Text
element.
