package DateTime::Format::Czech;
BEGIN {
  $DateTime::Format::Czech::VERSION = '0.2';
}

use utf8;
use Moose;

=encoding utf-8

=head1 SYNOPSIS

Format your DateTime values as usual in Czech. Now also
with month names, day names and less sugar!

=head1 DESCRIPTION

    my $fmt = DateTime::Format::Czech->new;
    my $date = DateTime->new(year => 2010, month => 6, day => 13);
    say $fmt->format_datetime($date); # 13. června 2010

=head1 ATTRIBUTES

=over 4

=item B<show_time>

Include time in the output. Off by default.

=item B<show_date>

Include date in the output. On by default.

=item B<show_year>

Include year in the date output (“1. 12. 2010”). Off by default.

=item B<show_day_name>

Include day name in date output (“neděle 13. 6.”). Off by
default.

=item B<show_month_name>

Use month name instead of its number (“1. prosince 2010”).
On by default.

=item B<compound_format>

The C<sprintf> pattern used to glue the time and date parts.
The default value is C<%s v %s> (“5. 6. v 16.30”).

=back

=cut

has show_time => (is => 'ro', isa => 'Bool', default => 0);
has show_date => (is => 'ro', isa => 'Bool', default => 1);
has show_year => (is => 'ro', isa => 'Bool', default => 0);
has show_day_name => (is => 'ro', isa => 'Bool', default => 0);
has show_month_name => (is => 'ro', isa => 'Bool', default => 1);
has compound_format => (is => 'ro', isa => 'Str', default => '%s v %s');

my @MONTH_NAMES = qw/
    ledna února března dubna
    května června července srpna září
    října listopadu prosince/;

my @DAY_NAMES = qw/
    pondělí úterý středa čtvrtek
    pátek sobota neděle/;

=head1 METHODS

=over 4

=item B<format_date>

Takes a L<DateTime> value, returns a string representation
of its date part.

=cut

sub format_date
{
    my ($self, $date) = @_;
    my $output = $self->show_month_name ?
        join('. ', $date->day, $MONTH_NAMES[$date->month_0]) :
        sprintf '%i. %i.', $date->day, $date->month;
    $output = $DAY_NAMES[$date->wday_0] . ' ' . $output if $self->show_day_name;
    $output .= ' ' . $date->year if $self->show_year;
    return $output;
}

=item B<format_time>

Takes a L<DateTime> value, returns a string representation
of its time part in 24-hour time system. Minutes are zero-padded
if needed (“13.00”, “19.01”).

=cut

sub format_time
{
    my ($self, $date) = @_;
    return sprintf '%i.%02i', $date->hour, $date->minute;
}

=item B<format_datetime>

Formats a given L<DateTime> value, returning date and time parts
as configured by the C<show_date> and C<show_time> attributes. The
date and time parts are glued together using the C<compound_format>
pattern. You can also call this method using the shorter C<format>
name.

=back

=cut

sub format_datetime
{
    my ($self, $date) = @_;
    if ($self->show_time && $self->show_date) {
        return sprintf $self->compound_format,
            $self->format_date($date), $self->format_time($date);
    }
    return $self->format_date($date) if $self->show_date;
    return $self->format_time($date);
}

sub format {
    return shift->format_datetime(@_);
}

=head1 AUTHOR

Tomáš Znamenáček, zoul@fleuron.cz

=cut

'SDG';