package Acme::MilkyHolmes::Character;
use Mouse;

use Data::Section::Simple;
use Localizer::Resource;
use Localizer::Style::Gettext;
use YAML::Tiny;
use utf8;

has localizer => (
    is  => 'ro',
);

has locale => (
    is       => 'rw',
    isa      => 'Str',
    required => 1,
    default  => 'ja',
);

has common => (
    is => 'ro',
);

no Mouse;

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

    my $sep = $self->_localized_field('name_separator');
    $sep = ' ' if ( !defined $sep );

    if ( defined $self->_localized_field('name') ) {
        return $self->_localized_field('name');
    }
    elsif ( $self->locale eq 'ja' ) {
        if( defined $sep && $sep eq '・' ) {
            return $self->firstname . $sep . $self->familyname;
        }
        return $self->familyname . $sep . $self->firstname;
    }
    return $self->firstname . $sep . $self->familyname;
}

sub firstname {
    my ($self) = @_;
    return $self->_localized_field('firstname');
}

sub familyname {
    my ($self) = @_;
    return $self->_localized_field('familyname');
}

sub nickname {
    my ($self) = @_;
    if ( defined $self->_localized_field('nickname') ) {
        return $self->_localized_field('nickname');
    }
    return $self->_localized_field('firstname');
}

sub birthday {
    my ($self) = @_;
    return $self->_localized_field('birthday');
}

sub voiced_by {
    my ($self) = @_;
    return $self->_localized_field('voiced_by');
}

sub nickname_voiced_by {
    my ($self) = @_;
    return $self->_localized_field('nickname_voiced_by');
}

sub _localized_field {
    my ($self, $name) = @_;
    if ( exists $self->localizer->{ $self->locale } ) {
        my $localizer = $self->localizer->{ $self->locale };
        return $localizer->maketext($name);
    }
    return $self->{$name};
}

sub BUILD {
    my ($self, $args) = @_;

    my $ds = Data::Section::Simple->new( ref $self );
    my $sections = $ds->get_data_section();
    if ( exists $sections->{common} ) {
        my $common = YAML::Tiny->read_string( delete $sections->{common} );
        $self->{common} = $common;
    }

    for my $section_name ( keys %{ $sections || {} } ) {
        my $yaml = YAML::Tiny->read_string($sections->{$section_name});

        my $localizer = Localizer::Resource->new(
            dictionary => $yaml->[0],
            format     => Localizer::Style::Gettext->new(),
        );
        $self->{localizer}->{$section_name} = $localizer;
    }
}

1;
__END__

=encoding utf-8

=for stopwords ja

=head1 NAME

Acme::MilkyHolmes::Character - Character base class for Milky Holmes

=head1 SYNOPSIS

    use strict;
    use warnings;
    use utf8;
    use Acme::MilkyHolmes::Character::SherlockShellingford;

    my $sherlock = Acme::MilkyHolmes::Character::SherlockShellingford->new();
    $sherlock->locale('en');
    $sherlock->name;       # => 'Sherlock Shellingford'
    $sherlock->firstname;  # => 'Sherlock'
    $sherlock->familyname; # => 'Shellingford'
    $sherlock->nickname;   # => 'Sheryl'
    $sherlock->birthday;   # => 'March 31'
    $sherlock->voiced_by;  # => 'Suzuko Mimori'

=head1 METHODS

=head2 C<name>

=head2 C<firstname>

=head2 C<familyname>

=head2 C<nickname>

=head2 C<birthday>

=head2 C<voiced_by>


=head1 SEE ALSO

=over 4

=item * Characters in Milky Holmes (Wikipedia - ja)

L<http://ja.wikipedia.org/wiki/%E6%8E%A2%E5%81%B5%E3%82%AA%E3%83%9A%E3%83%A9_%E3%83%9F%E3%83%AB%E3%82%AD%E3%82%A3%E3%83%9B%E3%83%BC%E3%83%A0%E3%82%BA%E3%81%AE%E7%99%BB%E5%A0%B4%E4%BA%BA%E7%89%A9>

=item * Milky Holmes (Wikipedia - en)

L<http://en.wikipedia.org/wiki/Tantei_Opera_Milky_Holmes>

=back

=cut