package Common::AmazonWebService;

use strict;
use warnings;

use LWP::Simple qw /get/;
use XML::XPath;

use constant kAmazonBaseUrl =>
  "http://xml.amazon.com/onca/xml2?t=webservices-20&dev-t=D2ED5GR7A6RZ7Y&mode=music&type=lite&page=1&f=xml&KeywordSearch=";

# This package is accessed via this one static method: Lookup
#
# Example:
# 	my $results = AmazonWebService::Lookup(keyword => "radiohead amnesiac");
# 	my $img = $results->[0]->{ImageUrlSmall} if(@$results);
#
# Input:
# 	-keyword- can be any string to search for. usually contains artist name and/or album name
#
# 	-albumID- not supported, but different search terms could be added later
#
# Output:
# 	-arrayref- of hashrefs is returned, each hashref is an item returned matching the lookup terms
#
sub Lookup {
    my (%args) = @_;

    if ( $args{keyword} ) {
        return LookupByKeyword( $args{keyword} );
    } elsif ( $args{albumID} ) {

        # TODO:
        #
        # return LookupByAlbumID($args{albumID});
    }
}

sub LookupByKeyword {
    my ($keyword) = @_;

    my $response = _lookupKeyword($keyword);

    return _processResponse($response);
}

sub _processResponse {
    my ($response) = @_;

    my $xp = XML::XPath->new( xml => $response );
    return _parseResults($xp);
}

sub _lookupKeyword {
    my ($word) = @_;
    return undef if ( !$word );

    my $request = kAmazonBaseUrl . $word;

    my $response = get($request);
    die "Attempt to make request failed!\n" unless defined($response);

    return $response;
}

sub _parseResults {
    my ($xp) = @_;
    my @nodes = $xp->findnodes("/ProductInfo/Details");

    my $results = [];
    foreach my $node (@nodes) {
        my $href = _parseNode($node);
        push @$results, $href;
    }

    return $results;
}

sub _parseNode {
    my ($node) = @_;
    return unless $node->isa('XML::XPath::Node');

    my $catalogType = $node->findvalue("Catalog");
    if ( $catalogType =~ /music/i ) {
        return _parseMusicNode($node);
    } elsif ( $catalogType =~ /books/i ) {
    }
}

sub _parseMusicNode {
    my ($node) = @_;
    my $href = {};

    foreach my $tag (qw(ImageUrlSmall ImageUrlMedium ImageUrlLarge ProductName ReleaseDate Manufacturer)) {
        $href->{$tag} = $node->findvalue($tag);
    }

    # they provide an <Artists> section, but we'll just
    # grab the first artist for now.
    #
    my @artists = $node->findnodes("Artists");
    $href->{ArtistName} = $artists[0]->findvalue("Artist") if (@artists);

    return $href;
}

###
1;    # Play nicely.
###
