package Pear::LocalLoop::Plugin::Postcodes;
use Mojo::Base 'Mojolicious::Plugin';

use Geo::UK::Postcode::Regex;
use GIS::Distance;

sub register {
  my ( $plugin, $app, $conf ) = @_;

  $app->helper( get_location_from_postcode => sub {
    my ( $c, $postcode, $usertype ) = @_;
    my $postcode_obj = Geo::UK::Postcode::Regex->parse( $postcode );

    my $location;

    unless ( defined $postcode_obj && $postcode_obj->{non_geographical} ) {
      my $pc_result = $c->schema->resultset('GbPostcode')->find({
        incode => $postcode_obj->{incode},
        outcode => $postcode_obj->{outcode},
      });
      if ( defined $pc_result ) {
        # Force truncation here as SQLite is stupid
        $location = {
          latitude => (
            $usertype eq 'customer'
            ? int($pc_result->latitude * 100 ) / 100
            : $pc_result->latitude
          ),
          longitude => (
            $usertype eq 'customer'
            ? int($pc_result->longitude * 100 ) / 100
            : $pc_result->longitude
          ),
        };
      }
    }
    return $location;
  });

  $app->helper( get_distance_from_coords => sub {
    my ( $c, $buyer, $seller ) = @_;

    my $gis = GIS::Distance->new();

    my $buyer_lat = $buyer->latitude;
    my $buyer_long = $buyer->longitude;
    my $seller_lat = $seller->latitude;
    my $seller_long = $seller->longitude;

    if ( $buyer_lat && $buyer_long 
      && $seller_lat && $seller_long ) {
      return int( $gis->distance( $buyer_lat, $buyer_long => $seller_lat, $seller_long )->meters );
    }
    return;
  });
}

1;
