package Geo::Coder::Many::Response;

use strict;
use warnings;

=head1 NAME

Geo::Coder::Many::Response - standard geocoder response container object

=head1 DESCRIPTION

This module provides a standard response format for geocoder results - the
various geocoder plugins should all do the necessary conversions to return a
response in this format.

=head1 METHODS

=head2 new

Constructs and returns a new, empty response object.

=cut

sub new {
    my $class = shift;
    my $args = shift;

    my $self = {
        location        => $args->{location},
        responses       => [],
        response_code   => 401,
        geocoder        => undef,
    };

    bless $self, $class;

    return $self;
}

=head2 add_response

Takes a response, together with the name of the geocoder used to produce it,
and stores it.

=cut

sub add_response {
    my $self = shift;
    my $response = shift;
    my $geocoder = shift;

    $self->{geocoder} = $geocoder;

    if ( $response->{longitude} && $response->{latitude} ) {
        push @{$self->{responses}}, $response;
        $self->{response_code} = 200;
	return 1;
    }
    return 0;
}

=head2 set_response_code

=cut

sub set_response_code {
    my $self = shift;
    my $response_code = shift;
    $self->{response_code} = $response_code;
    return $response_code;
}

=head2 get_location
    
Getter for the location string

=cut

sub get_location { return shift->{location}; }

=head2 get_response_code

Getter for the response code

=cut

sub get_response_code { return shift->{response_code}; }

=head2 get_geocoder

Getter for the geocoder name

=cut

sub get_geocoder { return shift->{geocoder}; }

=head2 get_responses

In list context, returns all of the responses. In scalar context, returns the
first response.

=cut

sub get_responses {
    my $self = shift;
    return wantarray ? @{$self->{responses}} : $self->{responses}->[0];
}

1;
