#!/usr/bin/env perl
use strictures 2;

use Module::Find qw( findallmod );

use Geo::Distance;
use Geo::Distance::XS;

# Geo::Distance::distance() is installed by Geo::Distance::XS.
# Geo::Distance::old_distance() is pure-perl, pre GIS::Distance gutting.

my @gis_formulas = (
    grep { $_ !~ m{::Formula} }
    grep { $_ ne 'GIS::Distance::Constants' }
    grep { $_ ne 'GIS::Distance::Fast' }
    findallmod('GIS::Distance')
);

my @coords;

# Beirut to Dimashq.
@coords = ( 33.863146, 35.52824, 33.516496, 36.287842 );

# https://github.com/bluefeet/Geo-Distance/issues/15
#@coords = ( 52.484977, 13.385900, 52.485033, 13.370897 );

my %distances;

foreach my $formula (@gis_formulas) {
    my $gis = GIS::Distance->new( $formula );
    my $km = $gis->distance( @coords );
    $distances{ $formula } = $km;
}

my @geo_pp_formulas = @Geo::Distance::FORMULAS;

foreach my $formula (@geo_pp_formulas) {
    my $geo = Geo::Distance->new();
    $geo->formula( $formula );
    my $km = $geo->old_distance( 'kilometer', reverse @coords );
    $distances{ "Geo::Distance-$formula" } = $km;
}

my @geo_xs_formulas = @Geo::Distance::XS::FORMULAS;

foreach my $formula (@geo_xs_formulas) {
    my $geo = Geo::Distance->new();
    $geo->formula( $formula );
    my $km = $geo->distance( 'kilometer', reverse @coords );
    $distances{ "Geo::Distance::XS-$formula" } = $km;
}

my %formulas_by_distance;
foreach my $formula (keys %distances) {
    my $distance = sprintf('%.016f', $distances{$formula});
    my $formulas = $formulas_by_distance{ $distance } ||= [];
    push @$formulas, $formula;
}

foreach my $distance (sort keys %formulas_by_distance) {
  print "$distance:\n";
  print map { " - $_\n" } @{ $formulas_by_distance{$distance} };
}
