#!/usr/bin/perl

$ENV{DBIC_TRACE}=1;
use JSON;
use strict;
use Data::Show;
use lib '/home/sites/clm.dmadelivers.com/www/clmapp/lib';
use CLMApp::Schema;
use CLMApp;
use LWP::UserAgent;
use HTTP::Request::JSON;
use Mojo::JSON qw(decode_json encode_json);
use Mojo::UserAgent;




my $c = new CLMApp;
my $dbix = CLMApp::Schema->connect("dbi:mysql:host=rds1.dmadelivers.com;db=dmaclm", 'dmaclm', '3lUz1OV2!',{unsafe=>1,RaiseError=>0,PrintError=>1});
no warnings 'uninitialized';

if($ARGV[0] eq 'validatezip'){
	&validatezip;
}elsif($ARGV[0] eq 'distancezip'){
	&distancezip;
}elsif($ARGV[0] eq 'warehousegps'){
	&warehousegps;
}elsif($ARGV[0] eq 'monthly'){
	&default({
		'me.statusid'=>1, 
		'me.customerid' => 1054305
	});
}else{
	&default({
#		'me.active'=>1,
		'me.statusid' => 1,
	 	'-or' => {
			'me.latitude' => 0,
			'me.longitude' => 0,
			'me.distancetodistcenter' => 0
		},
#		'me.customerid' =>  1016881,
#		'me.unitname' => { 'like' => '%qdoba%' }
#		'me.chaingroupid' => 107

		});
}


sub validatezip{

my $purl = 'https://addressvalidation.googleapis.com/v1:validateAddress?key=AIzaSyDokeXryZ4r_KJmd327UAdPr-41-ry9PAo';
my $ua  = Mojo::UserAgent->new;
my $tx = $ua->post($purl => json => {
      "address" => {
        "regionCode" => "US",
        "addressLines" => ["02909"]
      }
    });


show $tx;

show $tx->res->content;

my $body = $tx->result->body;
my $dbody = decode_json($body);

show $dbody;

# show $tx->res->content->asset->content;




}


sub distancezip{

	my $ozip = '02909';
	my $dzip = '11742';

	my $url = "https://maps.googleapis.com/maps/api/distancematrix/json?origins=$ozip&destinations=$dzip&units=imperial&key=AIzaSyDokeXryZ4r_KJmd327UAdPr-41-ry9PAo";

          my $ua = LWP::UserAgent::JSON->new;
          my $req = HTTP::Request::JSON->new(GET => $url);
          my $response = $ua->request($req);
          show $response;
          if($response->can('json_content')){
            if($response->json_content->{rows}->[0]->{elements}->[0]->{status} eq 'NOT_FOUND'  || $response->json_content->{status} eq 'UNKNOWN_ERROR' || $response->json_content->{status} eq 'INVALID_REQUEST'){
              # $response->json_content->{error_message};
              # show $src, $dst, $response->json_content;
            }

            show $response;
            my $r = $response->json_content->{"rows"}->[0]->{"elements"}->[0]->{"distance"}->{"value"};
            show $r;
            if($r){
              my $d = sprintf("%.2f", $r/1609.34);
              show $d;
            }
            return 0;
          }	


}


sub default{
	my @rows;
	my $search = shift;

# id => $dbix->resultset('Component')->auto_pk()
	my @r = $dbix->resultset('Customer')->search($search,{prefetch => ['status','distributor','chaingrp','concept','user','warehouse','orderflag','country'], 
#		length => 10, 
#		page => 1,
		result_class=>'DBIx::Class::ResultClass::HashRefInflator',
	});

# show @r;	
	# show @p;

	my @w = $c->db->resultset('DistributorWarehouse')->search({},{result_class=>'DBIx::Class::ResultClass::HashRefInflator'});
	my %warehouses;
	foreach my $w (@w){
		$warehouses{ $w->{distributorwarehouseid} } = $w;
	}

	my @err;
	foreach my $r (@r){
		my $j = {};

		# my $add = join(", ", ($r->{address}, $r->{city}, $r->{state}, $r->{zip}, $r->{countrycode}) );
		my $add = join(", ", ($r->{city}, $r->{state}, $r->{zip}, $r->{countrycode}) );
		if($r->{address} =~ /p\.?o\.?\s+box/i){
			$add = join(", ", ( $r->{city}, $r->{state}, $r->{zip}, $r->{countrycode} ) );
		}

		($j->{latitude},$j->{longitude}) = $c->gpslatlon($add);
show $add, $j;

		my $w = $warehouses{$r->{distributorwarehouseid}};
		my $d = join(", ", ($w->{address}, $w->{cityname}, $w->{state}, $w->{zip}, $w->{countrycode}) );
		if($w->{address} =~ /p\.?o\.?\s+box/i){
			$d = join(", ", ($w->{cityname}, $w->{state}, $w->{zip}, $w->{countrycode}) );
		}
		show $d;
		if($w->{zip}){
			#v$j->{distancetodistcenter} = $c->gpslatlon($add,$d) || 0;
			$j->{distancetodistcenter} = $c->gpslatlon($r->{zip},$w->{zip}) || 0;
		}
show $r, $j;
		if($j->{distancetodistcenter} ne ""){

			my $ustmt = sprintf('UPDATE Customer SET distancetodistcenter = %f, latitude = %f, longitude = %f WHERE ( customerid = %d );', $j->{distancetodistcenter}, $j->{latitude}, $j->{longitude}, $r->{customerid});
			# show $ustmt;
			print $ustmt . "\n";


			$j->{longitude} ||= 0;
			$j->{latitude} ||= 0;
			$j->{distancetodistcenter} ||= 0;
show $j;
			$c->db->resultset('Customer')->by_id($r->{customerid})->update($j);
# UPDATE Customer SET distancetodistcenter = ?, latitude = ?, longitude = ? WHERE ( customerid = ? ): '0', '0', '0', '1055535'


		}else{
			push(@err,$r);
		}
	}
	foreach my $err (@err){
		show {
			customerid => $err->{customerid},
			unitname => $err->{unitname},
			address => join(',', $err->{address},$err->{city},$err->{state},$err->{zip}),
		};

	}
#	show @err;

}

sub warehousegps{

	my $j = {};
	my @w = $c->db->resultset('DistributorWarehouse')->search({},{result_class=>'DBIx::Class::ResultClass::HashRefInflator'});

	foreach my $r (@w){
		my $j = {};

		# my $add = join(", ", ($r->{address}, $r->{city}, $r->{state}, $r->{zip}, $r->{countrycode}) );
		my $add = join(", ", ($r->{city}, $r->{state}, $r->{zip}, $r->{countrycode}) );
		if($r->{address} =~ /p\.?o\.?\s+box/i){
			$add = join(", ", ( $r->{city}, $r->{state}, $r->{zip}, $r->{countrycode} ) );
		}

		($j->{latitude},$j->{longitude}) = $c->gpslatlon($add);
show $add, $j;

		$c->db->resultset('DistributorWarehouse')->search({distributorwarehouseid => $r->{distributorwarehouseid}})->update($j);



		# my $w = $warehouses{$r->{distributorwarehouseid}};
		# my $d = join(", ", ($w->{address}, $w->{cityname}, $w->{state}, $w->{zip}, $w->{countrycode}) );
		# if($w->{address} =~ /p\.?o\.?\s+box/i){
		# 	$d = join(", ", ($w->{cityname}, $w->{state}, $w->{zip}, $w->{countrycode}) );
		# }
		# show $d;
	}

}
