#!/usr/bin/perl

use warnings;
use strict;

use Text::CSV_XS;

# Need binary mode to read 8bit characters (æøå)
my $csv = Text::CSV_XS->new({'binary' => 1});

my %locations;
my %addrmap;

addrmap_load();

open (CSV, "<partifinansiering-bidragsytere-latin1.txt") || die;
while (<CSV>) {
    chomp;
    my $status = $csv->parse($_);
    if ($status) {
	my @columns = $csv->fields();
	if ($columns[3] =~ m/^\d+$/ && $columns[3] > 0) {
	    $columns[0] = map_org($columns[0]);
	    my $latlon = addr_to_latlon($columns[2]);
	    #print join(",", @columns[2,3,0]),": $latlon\n";
	    if (not exists $locations{$latlon}) {
		$locations{$latlon} = [];
	    }
	    push(@{$locations{$latlon}},
		 {'org' => $columns[0],
		  'amount' => $columns[3]});
	}
    } else {
	printf "parse failed on argument '%s'\n", $csv->error_input();
    }
}
close CSV;

print "List of locations:\n\n";

for my $latlon (sort keys %locations) {
    print "$latlon:\n";
    my %orgs;
    for my $info (@{$locations{$latlon}}) {
	my $org = $info->{'org'};
	$orgs{$org} += $info->{'amount'};
    }
    for my $org (sort { $orgs{$b} <=> $orgs{$a} } keys %orgs) {
	print "  $org ",$orgs{$org},"\n";
    }
}

exit 0;

sub map_org {
    my $name = shift;
    my $org = $name;
    $org = "H" if $name =~ m/Høyre/i;
    $org = "Krf" if $name =~ m/Kristelig Folkeparti/i;
    $org = "AP" if $name =~ m/Arbeid[ae]rparti/i;
    $org = "AP" if $name =~ m/AUF/i;
    $org = "AP" if $name =~ m/Arbeidernes Ungdomsfylki/i;
    $org = "Frp" if $name =~ m/Fremskritt/i;
    $org = "SV" if $name =~ m/Sosialistisk Venstre/i;
    $org = "V" if $name =~ m/Venstre/i;
    $org = "RV" if $name =~ m/Rød Valg/i;
    $org = "RV" if $name =~ m/Rød Ungdoms/i;
    $org = "Andre" if $name =~ m/Kristent Samlings/i;
    return $org;
}

sub addrmap_load {
    %addrmap =
    (
     ''                                   => 'Oslo',
     '0116 Oslo'                          => 'Oslo',
     '0125 Oslo'                          => 'Oslo',
     '0181 Oslo'                          => 'Oslo',
     '5783 Eidfjord'                      => 'Eidfjord',
     '6092 Eggesbønes'                    => 'Eggesbønes',
     '6099 Fosnavåg'                      => 'Fosnavåg',
     '6405 Molde'                         => 'Molde',
     'Brusand, Rogaland'                  => 'Brusand',
     'Frysjavn. 31B, 0411 Oslo'           => 'Oslo',
     'Haakon VIIs gt.1, 0161 Oslo'        => 'Oslo',
     'Hamangskogen 60, 1338 Sandvika'     => 'Sandvika',
     'Hammersborgtorg 3, 0179 Oslo'       => 'Oslo',
     'Henrik Ibsensgt.9  0184 Oslo'       => 'Oslo',
     'Holtet 13, 3430 Spikkestad'         => 'Spikkestad',
     'Håkonsgaten 5, 5015 Bergen'         => 'Bergen',
     'Håkonsgt. 3, 5015  Bergen'          => 'Bergen',
     'Keiser Wilhelsgt.22, 6003 Ålesund'  => 'Ålesund',
     'Osterhaugsgt 27, 0183 Oslo'         => 'Oslo',
     'PB 304, 5804 Bergen'                => 'Bergen',
     'PB 8120, 4068 Stavanger'            => 'Stavanger',
     'Pb 1254 Vika, 0111 Oslo'            => 'Oslo',
     'Pb 1357 Vika, 0113 Oslo'            => 'Oslo',
     'Pb 1369 Vika, 0114 Oslo'            => 'Oslo',
     'Pb 1531 Vika, 0117 Oslo'            => 'Oslo',
     'Pb 1583 Vika, 0118 Oslo'            => 'Oslo',
     'Pb 1583, 0118 Oslo'                 => 'Oslo',
     'Pb 1624 Vika, 0118 Oslo'            => 'Oslo',
     'Pb 175, 5852 Bergen'                => 'Bergen',
     'Pb 1782 Vika, 0122 Oslo'            => 'Oslo',
     'Pb 1931 Vika, 0125 Oslo'            => 'Oslo',
     'Pb 1931 Vika, 0215 Oslo'            => 'Oslo',
     'Pb 23 Skøyen, 0212 Oslo'            => 'Oslo',
     'Pb 33, 1324 Lysaker'                => 'Lysaker',
     'Pb 38 Skøyen, 0212 Oslo'            => 'Oslo',
     'Pb 4 Skøyen, 0212 Oslo'             => 'Oslo',
     'Pb 94 Smestad, 0309 Oslo'           => 'Oslo',
     'Pb. 1931- Vika, 0125 Oslo'          => 'Oslo',
     'Pb. 1995- Vika, 0125 Oslo'          => 'Oslo',
     'Pb. 4- Skøyen,  0212 Oslo'          => 'Oslo',
     'Pb. 7003 St Olavs pl  0130  Oslo'   => 'Oslo',
     'Pb. 8704  Youngstorget, 0028 Oslo'  => 'Oslo',
     'Pb. 8719 Youngstorget , 0028 Oslo'  => 'Oslo',
     'Postboks 1452 Vika, 0116 Oslo'      => 'Oslo',
     'Postboks 1551, 0117 Oslo'           => 'Oslo',
     'Postboks 1995 Vika, 0125 Oslo'      => 'Oslo',
     'Postboks 1995 Vika. 0125 Oslo'      => 'Oslo',
     'Postboks 4 - Skøyen, 0212 Oslo'     => 'Oslo',
     'Postboks 530 Sentrum, 6001 Ålesund' => 'Ålesund',
     'Rådhusgt. 25, 0158 Oslo'            => 'Oslo',
     'Sjølyst Plass 2, 0278 Oslo'         => 'Oslo',
     'Sjølyst pl. 2, 0278 Oslo'           => 'Oslo',
     'Skogfaret 26, 0382 Oslo'            => 'Oslo',
     'St. Olavsplass, 0130 Oslo'          => 'Oslo',
     'Stranden 3A, 0250 Oslo'             => 'Oslo',
     'Sverresg 19, 3900 porsgrunn'        => 'Porsgrunn',
     'Youngsgt 11, Oslo'                  => 'Oslo',
     'Youngsgt. 11, 0181 Oslo'            => 'Oslo',
     'Youngstorget 11, 0181 Oslo'         => 'Oslo',
     'Øksnesv. 12A, 7715 Steinkjer'       => 'Steinkjer',

     'Nedlagt. Kontaktperson:Trine Lie Larsen' => 'Oslo',
     );
}

# Map from address to "latitude longitude" in decimal notation
sub addr_to_latlon {
    my $addr = shift;
    my $loc;
    if (exists $addrmap{$addr}) {
	$loc = $addrmap{$addr};
    } else {
	$loc = $addr;
    }
    return $loc;
}
