The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
use strict;
use warnings;

use Test::More;
use Test::Warn;
use List::MoreUtils qw(apply);
use WebService::Nestoria::Search Warnings => 1;

require 't/lib/test-lwp-recorder.pl';

##########################################################################
## create WebService::Nestoria::Search object
##
my $ns = WebService::Nestoria::Search->new(
    'country'           => 'uk',
    'encoding'          => 'json',
);
ok($ns && ref($ns), 'created WebService::Nestoria::Search object');

##########################################################################
## simplest search
##
my @results = $ns->results(
    'place_name'        => 'oxford',
    'number_of_results' => 10,
);
is(scalar(@results), 10, 'got 10 results for basic search');

##########################################################################
## search parameters
##

my @parameters_uk_richmond = (
    # default = uk is fine
    apply { $_->{'country'} = 'uk'; $_->{'place_name'} = 'richmond' } (
        { 'number_of_results' => 1,                         },
        { 'page'              => 2                          },
        { 'listing_type'      => 'buy'                      },
        { 'property_type'     => 'flat'                     },
        { 'price_max'         => '600000'                   },
        { 'price_min'         => '100'                      },
        { 'bedroom_max'       => '4'                        },
        { 'bedroom_min'       => '1'                        },
        { 'sort'              => 'newest'                   },
        { 'keywords'          => 'garden'                   },
        { 'keywords_exclude'  => 'garden'                   },
    )
);

my @parameters_es_bilbao = (
    ## size is rarely set in the UK, so we use ES here
    apply { $_->{'country'} = 'es'; $_->{'place_name'} = 'bilbao'; } (
        { 'size_max'          => '1000'                     },
        { 'size_min'          => '10'                       },
    ),
);

my @parameters_de_wiesbaden = (
    ## rooms are used instead of bedrooms in Germany, so we use DE here
    apply { $_->{'country'} = 'de'; $_->{'place_name'} = 'wiesbaden'; } (
        { 'room_max'          => '1000'                     },
        { 'room_min'          => '10'                       },
    ),
);

my @parameters_uk_coordinates = (
    ## no placename set for these queries
    apply { $_->{'country'} = 'uk' } (
        {
            # 51.186654,0.738345,50.492894,-0.931577
            'south_west'      => '51.19,0.74',
            'north_east'      => '50.43,-0.93',
        },
        { 'centre_point'      => '51.47,-0.14',     },
        { 'radius'            => '51.47,-0.14,1km', },
    ),
);

my @parameters = (
    @parameters_uk_richmond,
    @parameters_es_bilbao,
    @parameters_de_wiesbaden,
    @parameters_uk_coordinates
);

foreach my $parameters (@parameters) {
    my $request  = $ns->request(%$parameters);
    my $response = $request->fetch;

#   uncomment for debugging:
#   note($request->url);

    my $query_string = join(
        ", ", 
        (
            apply { $_ = "$_: $parameters->{$_}" }
            sort keys %$parameters
        )
    );

    ok(
        $response && ($response->status_code == 200), 
        "$query_string - response"
    );
    ok(
        $response->count >= 1,
        "$query_string - results"
    );
};

##########################################################################
## objects and shortcuts
##

$ns = WebService::Nestoria::Search->new(
    'country'           => 'uk',
    'encoding'          => 'json',
    'place_name'        => 'clerkenwell',
);

isa_ok($ns,                 'WebService::Nestoria::Search'                  );
isa_ok($ns->request,        'WebService::Nestoria::Search::Request'         );
isa_ok($ns->query,          'WebService::Nestoria::Search::Response'        );
isa_ok(($ns->results)[0],   'WebService::Nestoria::Search::Result'          );
isa_ok(($ns->results)[0],   'WebService::Nestoria::Search::Result'          );
isa_ok($ns->metadata,       'WebService::Nestoria::Search::MetadataResponse');

##########################################################################
## keywords
##

$ns = WebService::Nestoria::Search->new(
    'country'           => 'uk',
);

my @keywords = $ns->keywords;
ok(@keywords, 'got keywords list');
ok(scalar(grep {$_ eq 'garden'} @keywords), "found 'garden' keyword");

done_testing;