package Yahoo::Lifestyle;

use strict;
use Yahoo::BBAuth;
use LWP;
use XML::Simple;

our $VERSION = '0.2';

sub new {
    my $self = shift;
    my $param = shift;
    my $appid = $param->{appid};
    my $version = 'v0.1';
    my $url = 'http://tw.lifestyle.yahooapis.com/';
    my $request = $url.$version."/";
    bless ( { 
	    version => $version, 
	    url => $url, 
	    appid => $appid,
	    request => $request }, 
	$self);
}

sub auth {
    my $self = shift;
    my $param = shift; 
    my $secret = $param->{secret};
    my $bbauth = Yahoo::BBAuth->new(
	appid => $self->{appid},
	secret => $secret,
    );
    bless ( { auth => $bbauth }, $self);
}

sub Bizsearch {
    # we don't need the bbauth for this method
    my $self = shift;
    my $param = shift;
    my $p = $param->{BizName};
    my $l = $param->{address};
    my $page = $param->{page};
    my $request = $self->{request}."Biz.search?BizName=$p&address=$l&page=$page";
    my $response = XMLin($self->_get($request));
    if ($response->{status} eq 'ok') {
	return $response->{BizList};
    } else {
	return 0;
    }
}

sub BizgetDetails {
    my $self = shift;
    my $param = shift;
    my $id = $param->{id};
    my $request = $self->{request}."Biz.getDetails?ID=$id";
    my $response = XMLin($self->_get($request));
    if ($response->{status} eq 'ok') {
	return $response->{Biz};
    } else {
	return 0;
    }
}

sub BizlistReviews {
    my $self = shift;
    my $param = shift;
    my $id = $param->{id};
    my $begin = $param->{begin} || 0;
    my $limit = $param->{limit} || 10;
    my $request = $self->{request}."Biz.listReviews?id=$id&begin=$begin&limit=$limit";
    my $response = XMLin($self->_get($request));
    if ($response->{status} eq 'ok') {
	return $response->{ReviewList};
    } else {
	return 0;
    }
}

sub BizlistBuzzBizs {
    my $self = shift;
    my $request = $self->{request}."Biz.listBuzzBizs";
    my $response = XMLin($self->_get($request));
    if ($response->{status} eq 'ok') {
	return $response->{BizList};
    } else {
	return 0;
    }
}

sub ClasslistClasses {
    my $self = shift;
    my $request = $self->{request}."Class.listClasses";
    my $response = XMLin($self->_get($request));
    if ($response->{status} eq 'ok') {
	return $response->{ClassList};
    } else {
	return 0;
    }
}

sub ClasslistBizsInRange {
    my $self = shift;
    my $param = shift;
    my $class = $param->{class} || 0;
    my $lon = $param->{lon} || '121.5438';
    my $lat = $param->{lat} || '25.0417';
    my $request = $self->{request}."Class.listBizsInRange?class=$class&lon=$lon&lat=$lat";
    my $response = XMLin($self->_get($request));
    if ($response->{status} eq 'ok') {
	return $response->{BizList};
    } else {
	return 0;
    }
}

sub BizaddReview {
    my $self = shift;
    my $param = shift;
    my $comment = $param->{comment};
    if ($self->auth && $self->auth->validate_sig()) {
	my $request = $self->{request}."Biz.addReview?comment=$comment";
	return $self->auth->auth_ws_get_call($request);
    } else {
	return 0;
    }
}

sub UserlistBookmarks {
    my $self = shift;
    if ($self->auth && $self->auth->validate_sig()) {
	my $request = $self->{request}."User.listBookmarks";
	my $response = XMLin( $self->auth->auth_ws_get_call($request));
	if ($response->{status} eq 'ok') {
	    return $response->{BookmarkList};
	} else {
	    return 0;
	}
    } else {
	return 0;
    }
}

sub UserlistReviews {
    my $self = shift;
    my $param = shift;
    my $biz = $param->{biz};
    my $request;
    if ($biz) {
	$request = $self->{request}."User.listReviews?biz=$biz";
    } else {
	$request = $self->{request}."User.listReviews";
    }
    if ($self->auth->auth_ws_get_call($request)) {
	my $response = XMLin($self->auth->auth_ws_get_call($request));
	if ($response->{status} eq 'ok') {
	    return $response->{ReviewList};
	} else {
	    return 0;
	}
    } else {
	return 0;
    }

}

sub _get {
    my $self = shift;
    my $url = shift;
    my $ua = LWP::UserAgent->new;
    $url .= "&appid=".$self->{appid};
    my $req = HTTP::Request->new(POST => $url);
    my $res = $ua->request($req);
    if ($res->is_success) {
	return $res->content;
    } else {
	return $res->status_line;
    }
}


1;

__END__

=head1 NAME

Yahoo::Lifestyle is a simple interface for Yahoo! Taiwan Lifestyle open APIs. And you will need the Yahoo::BBAuth for some authentication APIs. Before you use that, you have to register a appid and secret for APIs request.

=head1 VERSION

This document describes version 0.1 of Yahoo::Lifestyle, released 
January 16, 2008.

=head1 SYNOPSIS

use Yahoo::Lifestyle;

$life = Yahoo::Lifestyle({ appid => "Ea6oQPHIkY03GklWeauQHWPpPJByMjCDoxRxcW"});
$res = $life->Bizsearch({BizName => 'coffee', address => '', page => '3');
$list = $life->BizlistReviews({id => 'b4328e0fa8b25615', begin => '0', limit => '10');
print $res->{Biz}->{$_}->{Name} for (keys %{$res});
$life->bbauth({secret => $secret});
$bookmarks = $life->UserlistBookmarks;

=head1 DESCRIPTION

Yahoo! Taiwan provides open APIs for local yellow page searching. Users can search the business information by search APIs. And developers can get the comments and feedback by the open APIs. It's a little complicate if developers want to implement the mashup or any other plugins by BBAuth provided by Yahoo. Yahoo::Lifestyle uses the Yahoo::BBAuth to make a simple interface for the developers who want to use the Lifestyle APIs.

=head1 METHODS

For more methods, please just refer the Yahoo! Developers Network in Taiwan. E<lt>http://tw.developer.yahoo.com/lifestyle_api.htmlE<gt> 

=head1 AUTHORS

Hsin-Chan Chien E<lt>hcchien@hcchien.orgE<gt>

=head1 COPYRIGHT

Copyright 2008 by Hsin-Chan Chien E<lt>hcchien@hcchien.orgE<gt>.

This program is free software; you can redistribute it and/or 
modify it under the same terms as Perl itself.

See L<http://www.perl.com/perl/misc/Artistic.html>

=cut