package WebService::Kizasi;

use version; our $VERSION = qv('0.02');

use warnings;
use strict;
use Carp;
use LWP::UserAgent;
use URI::Escape;
use WebService::Kizasi::Parser;

my $C10E_WORD_URL =
  "http://kizasi.jp/kizapi.py?span=SPAN&kw_expr=WORD&type=coll";
my $KWIC_URL    = "http://kizasi.jp/kizapi.py?kw_expr=WORD&type=kwic";
my $RANKING_URL = "http://kizasi.jp/kizapi.py?span=SPAN&type=rank";

sub new {
    my $class = shift;
    my $ua    = new LWP::UserAgent;
    $ua->env_proxy;
    $ua->agent( join '/', __PACKAGE__, $VERSION );
    bless { ua => $ua }, $class;
}

sub _get_and_parse {
    my ( $self, $uri, $keyword, $period ) = @_;
    my ($res);

    $keyword = uri_escape($keyword) if ($keyword);
    $uri =~ s/SPAN/$period/  if ($period);
    $uri =~ s/WORD/$keyword/ if ($keyword);

    $res = $self->{ua}->get($uri);
    WebService::Kizasi::Parser->parse($res);
}

sub _c10e_word {
    my ( $self, $keyword, $period ) = @_;
    _get_and_parse( $self, $C10E_WORD_URL, $keyword, $period );
}

sub c10e_word_1d {
    my ( $self, $keyword ) = @_;
    $self->_c10e_word( $keyword, '24' );
}

sub c10e_word_1w {
    my ( $self, $keyword ) = @_;
    $self->_c10e_word( $keyword, '1w' );
}

sub c10e_word_1m {
    my ( $self, $keyword ) = @_;
    $self->_c10e_word( $keyword, '1m' );
}

sub keyword_in_context {
    my ( $self, $keyword ) = @_;
    _get_and_parse( $self, $KWIC_URL, $keyword, '' );
}

sub _ranking {
    my ( $self, $period ) = @_;
    _get_and_parse( $self, $RANKING_URL, '', $period );
}

sub ranking_1d {
    my $self = shift;
    $self->_ranking('24');
}

sub ranking_1w {
    my $self = shift;
    $self->_ranking('1w');
}

sub ranking_1m {
    my $self = shift;
    $self->_ranking('1m');
}

1;

=head1 NAME

WebService::Kizasi - A Perl Interface for the Kizasi Web Services


=head1 VERSION

This document describes WebService::Kizasi version 0.0.1


=head1 SYNOPSIS

    use WebService::Kizasi;

    use Encode qw(_utf8_off);

    my $kizapi = WebService::Kizasi->new();
    my @result;

    $result[0] = $kizapi->c10e_word_1d('CPAN');
    $result[1] = $kizapi->c10e_word_1w('CPAN');
    $result[2] = $kizapi->c10e_word_1m('CPAN');
    $result[3] = $kizapi->keyword_in_context('CPAN');
    $result[4] = $kizapi->ranking_1d;
    $result[5] = $kizapi->ranking_1w;
    $result[6] = $kizapi->ranking_1m;

    for my $result (@result) {
        my $utf8off = $result->items->[0]->title;
        _utf8_off ($utf8off);
        print $utf8off,"\n";
        print $result->items->[0]->pubDate,"\n";
        print $result->items->[0]->link,"\n";
        print $result->items->[0]->guid,"\n";
        $utf8off = $result->items->[0]->description;
        _utf8_off($utf8off);
        print $utf8off,"\n";
    }

=head1 DESCRIPTION

Kizasi.jp is the sight which discovers the "sign of change"
(Kizasi) from blogs, and the WebService::Kizasi is a Perl
interface to the Kizasi WebService API (Kizapi). For details,
see http://blog.kizasi.jp/kizasi/66.

=head1 INTERFACE

=head2 new

Returns an instace of this module.

=head2 c10e_word_1d($keyword)

Returns WebService::Kizasi::Items, designates the
cooccurrence (C10E) words from the keyword in 1 day.
Keyword must be encoded as UTF-8, and the number of
C10E words are less than 60.

=head2 c10e_word_1w($keyword)

Returns WebService::Kizasi::Items, designates the
cooccurrence (C10E) words from the keyword in 1 week.
Keyword must be encoded as UTF-8, and the number of
C10E words are less than 60.

=head2 c10e_word_1m($keyword)

Returns WebService::Kizasi::Items, designates the
cooccurrence (C10E) words from the keyword in 1 month.
Keyword must be encoded as UTF-8, and the number of
C10E words are less than 60.

=head2 keyword_in_context($keyword)

Returns WebService::Kizasi::Items, designates the
sentenses which include the keyword. Keyword must be
encoded as UTF-8, and the number of sentenses are
less than 30.

=head2 ranking_1d

Returns WebService::Kizasi::Items, designates the
ranking of the topics in 1 day.

=head2 ranking_1w

Returns WebService::Kizasi::Items, designates the
ranking of the topics in 1 week.

=head2 ranking_1m

Returns WebService::Kizasi::Items, designates the
ranking of the topics in 1 month.

=head1 DIAGNOSTICS

See WebService::Kizasi::Items->status and their status_message.

=head1 CONFIGURATION AND ENVIRONMENT

WebService::Kizasi requires no configuration files, but load
proxy settings from *_proxy environment variables. See LWP::UserAgent
for more details.

=head1 DEPENDENCIES

Class::Accessor::Fast,
XML::RSS::LibXML,
version,
LWP::UserAgent,
URI::Escape,
Test::Base.

=head1 INCOMPATIBILITIES

None reported.

=head1 BUGS AND LIMITATIONS

No bugs have been reported.

Please report any bugs or feature requests to
C<bug-WebService-Kizasi@rt.cpan.org>, or through the web interface at
L<http://rt.cpan.org>.

=head1 SEE ALSO

L<WebService::Kizasi::Item>

=head1 AUTHOR

DAIBA, Keiichi  C<< keiichi@tokyo.pm.org >>


=head1 LICENSE AND COPYRIGHT

Copyright (c) 2007, DAIBA, Keiichi C<< keiichi@tokyo.pm.org >>.
All rights reserved.

This module is free software; you can redistribute it and/or
modify it under the same terms as Perl itself. See C<perldoc perlartistic>.


=head1 DISCLAIMER OF WARRANTY

BECAUSE THIS SOFTWARE IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
FOR THE SOFTWARE, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
PROVIDE THE SOFTWARE ''AS IS'' WITHOUT WARRANTY OF ANY KIND, EITHER
EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE
ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE SOFTWARE IS WITH
YOU. SHOULD THE SOFTWARE PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL
NECESSARY SERVICING, REPAIR, OR CORRECTION.

IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
REDISTRIBUTE THE SOFTWARE AS PERMITTED BY THE ABOVE LICENCE, BE
LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL,
OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE
THE SOFTWARE (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
FAILURE OF THE SOFTWARE TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
SUCH DAMAGES.