package OSM::Utils;

use strict;

our $rooturl = 'https://osm.mathmos.net';

#our $xaipserver = 'http://www.informationfreeway.org/api/';
##our $xaipserver = 'http://osmxapi.hypercube.telascience.org/api/';
#out $xapiserver = 'http://osmxapi.telascience.org/api/';
#our $xapiserver = 'http://osm.bearstech.com/osmxapi/api/';
#our $xaipserver = 'http://xapi.openstreetmap.org/api/';
#our $xaipserver = 'http://jxapi.openstreetmap.org/xapi/api/';
our $xapiserver = 'http://www.overpass-api.de/api/xapi_meta';
our $overpassserver = 'http://overpass-api.de/api';

our $gmaplink = 'https://maps.google.com/?q=';
our $gmapdir = 'https://www.google.com/maps/dir/';

our $DefaultCSS = '/default.css';
our $LeafletCSS = 'https://unpkg.com/leaflet@1.3.1/dist/leaflet.css';
our $LeafletJS = 'https://unpkg.com/leaflet@1.3.1/dist/leaflet.js';

our $LeafletEditJS = '/leaflet/leaflet-edit-osm.js';
our $LeafletHashJS = '/leaflet/leaflet-hash.js';

our $LeafletAjaxJS = 'https://cdnjs.cloudflare.com/ajax/libs/leaflet-ajax/2.1.0/leaflet.ajax.min.js';

our $FontAwesomeCSS = 'https://use.fontawesome.com/releases/v5.12.0/css/all.css';

our $linkbase = 'https://www.openstreetmap.org';

our $gnuplotbinary = '/usr/bin/gnuplot';

our %objectlink = (
    'node' => $linkbase . '/node',
    'way' => $linkbase . '/way',
    'relation' => $linkbase . '/relation',
);


our $xapitimeout = 500;

our %fulltype = (
    'n' => 'node',
    'w' => 'way',
    'r' => 'relation',
    );

sub userlink {
    require URI::Escape;
    return $linkbase . "/user/" . &URI::Escape::uri_escape($_[0]);
}

sub objectlink {
    require CGI;
    my $type = $_[0];
    my $id = $_[1];
    my $ta = lc(substr($type,0,1));
    return CGI::a({-href=>"$linkbase/$type/$id"},"$ta$id");
}

sub locationurl {
    my $lat = $_[0];
    my $lon = $_[1];
    my $zoom = 16;
    if (defined $_[2]) {
	$zoom = $_[2];
    }
    if ($zoom>16) {
	return sprintf("$linkbase/?mlat=%f&mlon=%f#map=%d/%.5f/%.5f",
		       $lat,$lon,$zoom,$lat,$lon);
    } else {
	return sprintf("$linkbase/?mlat=%f&mlon=%f#map=%d/%.4f/%.4f",
		       $lat,$lon,$zoom,$lat,$lon);
    }
}

sub locationlink {
    require CGI;
    my $lat = $_[0];
    my $lon = $_[1];
    my $link = "$lat,&nbsp;$lon";
    my $zoom = 16;
    if (defined $_[2]) {
	$link = $_[2];
    }
    if (defined $_[3]) {
	$zoom = $_[3];
    }
    if ($zoom>16) {
	return sprintf("<a href='$linkbase/?mlat=%f&amp;mlon=%f#map=%d/%.5f/%.5f&amp;layers=N'>%s</a>",
				      $lat,$lon,$zoom,$lat,$lon,$link);
    } else {
	return sprintf("<a href='$linkbase/?mlat=%f&amp;mlon=%f#map=%d/%.4f/%.4f&amp;layers=N'>%s</a>",
				      $lat,$lon,$zoom,$lat,$lon,$link);
    }
}

sub turbosearch {
    require CGI;
    my %search=@_;
    my @parts;
    foreach my $key (keys %search) {
	if ($search{$key} eq "*") {
	    push @parts, "\"$key\"=*";
	} else {
	    push @parts, "\"$key\"=\"$search{$key}\"";
	}
    }
    my $query = join('+and+',@parts);
#    my $key=$_[0];
#    my $value=$_[1];
    return CGI::a({-href=>"https://overpass-turbo.eu/?w=($query)+in+UK&R"},
		  CGI::img({src=>'/turbo.png',
			    -alt=>'OT',
			    -width=>'16',-height=>'16'}));
}



sub josmrc {
    return &josmrc_load_object(@_);
}

sub josmrc_load_object {
    require URI::Escape;
    my ($type,$id,$tags) = @_;
    my @tagstr;
    my $josmlink = sprintf('http://localhost:8111/load_object?objects=%s%d',
			   lc(substr($type,0,1)), $id);
    foreach (keys %$tags) {
	push @tagstr, &URI::Escape::uri_escape($_) . "=" . &URI::Escape::uri_escape($$tags{$_});
    }
    if (@tagstr) {
	$josmlink .= "&addtags=" . join('%7C',@tagstr);
    }
    return $josmlink;
}

sub josmrc_add_node {
    require URI::Escape;
    my ($lat,$lon,$tags) = @_;
    my @tagstr;
    my $josmlink = sprintf('http://localhost:8111/add_node?lat=%f&lon=%f',
			   $lat,$lon);
    foreach (keys %$tags) {
	push @tagstr, &URI::Escape::uri_escape($_) . "=" . &URI::Escape::uri_escape($$tags{$_});
    }
    if (@tagstr) {
	$josmlink .= "&addtags=" . join('%7C',@tagstr);
    }
    return $josmlink;
}

sub geolink {
    return "geo:$_[0],$_[1]";
}

sub bctrail {

    my $links;
    my $url = '/';
    my $i;
    my $userinfo;

    if (defined $INC{'OSM/Auth.pm'} && $INC{'dbconnect.pm'}) {
	if (&OSM::Auth::valid_user($dbconnect::dbh)) {
	    $userinfo = CGI::div({-class=>'userinfo'},CGI::img({-src=>'/silk/user.png',-alt=>'L',-title=>"Logged in as $OSM::Auth::user"}));
	} else {
	    $userinfo = CGI::div({-class=>'userinfo'},CGI::img({-src=>'/silk/user_gray.png',-alt=>'N',-title=>"Not logged in."}));
	}
    } else {
     	$userinfo = '';
    }

    if (@_) {
	$links = CGI::a({-href=>'/'}, 'Rob\'s OSM Stuff') . ' &#187; ';
	foreach ($i=0; 2*$i < scalar(@_)-1; $i++) {
	    $url .= $_[2*$i] . "/";
	    $links .= CGI::a({-href=>$url}, $_[2*$i+1]) . ' &#187;&nbsp;';
	}
	$links .= $_[2*$i];
    } else {
	$links = 'Rob\'s OSM Stuff';
    }

    return CGI::div({-id=>'bc'},
		    $userinfo .
		    CGI::span({-class=>'hide'}, 'You are in:'),
		    $links,
	) . "\n\n";
}

sub show_special_chars {
    my $string = $_[0];
    #$string =~ s/[^[:ascii:]]/\t/g;
    $string =~ s/[^\w[:ascii:]\x{2019}]/\t/ug;
    $string =~ s/[\f\n\r\t\x{7F}]/\t/g;
    $string =~ s/ /\x{2423}/g;
    $string =~ s/\t/\x{2426}/g;
    return $string;
}

our $replacement_space = "\x{2423}";
our $replacement_non_ascii = "\x{2426}";
 
sub listallobjects {
    require CGI;
    return CGI::p('All objects found (' . CGI::a({-href=>'http://localhost:8111/load_object?new_layer=true&objects=' . join(',',@_)},'Load in JOSM RC') . '):') . "\n" .
	CGI::textarea(-default=>join(' ',@_), -columns=>50, -rows=>4 ) . "\n\n";
}

sub pc {
    if ($_[1]>0) {
	return sprintf("%.1f&nbsp;%%",100*$_[0]/$_[1]);
    } else {
	return "&mdash;";
    }
}

sub cdatajs {
    require CGI;
    return CGI::script({-type=>'text/javascript'},"\n//<![CDATA[\n" . $_[0] . "\n//]]>\n");
}

sub headerdate {
    # Convert timestamp to correct format for Last-Modified HTTP Header
    my @months = qw( Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec );
    my @days = qw(Sun Mon Tue Wed Thu Fri Sat Sun);

    my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = gmtime($_[0]);
    $year+=1900;
    return sprintf("%s, %02d %s %04d %02d:%02d:%02d GMT",
                   $days[$wday], $mday, $months[$mon], $year, $hour, $min, $sec);
}

sub button {
    my %vars = @_;
    return "<button type='submit' name='$vars{'-name'}' value='$vars{'-value'}'>$vars{'-label'}</button>";
}


return 1;
