#!/usr/bin/perl
# Open Location Codes / Plus Codes NS and EW component splitter
# Author: Dan Jacobson https://www.jidanni.org/
# Copyright: https://www.gnu.org/licenses/gpl.htm
# Created: 2024-04-13T09:24:43+0000
# Last-Updated: 2024-04-17T08:08:33+0000
#     Update #: 90
# https://github.com/google/open-location-code/blob/main/docs/specification.md#most-significant-10-digits

use strict;
use warnings q(all);
my $u = "Usage: $0 --mode_argument";
die $u unless @ARGV;
my $mode = shift;
if ( $mode eq "--split-code" ) {    # Convert Plus Codes into split Plus Codes.
    ## We pick apart Plus Codes, separating them into their N and E components.
    ## Input: plus codes, one per line. Leading URL stuff, if any, will be stripped.
    ## echo https://plus.codes/7QP26R85+WX https://plus.codes/7QP26F86+WQ \
    ## https://plus.codes/7QP26Q8X+WV | xargs -n 1 | ./olc --split-code
    #Output
## 7QP26R85WX: 7P68W N, Q2R5X E
## 7QP26F86WQ: 7P68W N, Q2F6Q E
## 7QP26Q8XWV: 7P68W N, Q2QXV E

    while (<>) {
        s!.*/!!;
        tr/+//d;
        chomp;
        my ( $i, @f );
        for ( split //, $_ ) {
            $f[ $i++ % 2 ] .= $_;
        }
        printf "%s: %s N, %s E$/", $_, @f;
    }
}
elsif ( $mode eq "--lonlat2split_code" )
{    ## Convert lon lat pairs to split codes
    my @a = split //, '23456789CFGHJMPQRVWX';
    while (<>) {
        chomp;
        my ( @ll, @ans );
        my @ll_0 = reverse split;
        for ( 0, 1 ) {
            $ll[$_] = int( 8000 * ( $ll_0[$_] + 90 * ( $_ + 1 ) ) );
        }
        for ( 1 .. 5 ) {
            for ( 0, 1 ) {
                push @{ $ans[$_] }, $a[ $ll[$_] % 20 ];
                $ll[$_] /= 20;
            }
        }
        my @o;
        for ( 0, 1 ) {
            $o[$_] = join "", reverse @{ $ans[$_] };
        }
        print join " ", @o;
        print $/;
    }
}
## elsif ( $mode eq "--encode" ) {...} #Just create a plus code from a lon lat
## elsif ( $mode eq "--decode" ) {...} #Just create a lon lat from a plus code
else { die $u }