# -*- perl -*-

#
# $Id: Berlin_DE.pm,v 1.17 2005/10/16 20:34:22 eserte Exp $
# Author: Slaven Rezic
#
# Copyright (C) 2000 Slaven Rezic. All rights reserved.
# This package is free software; you can redistribute it and/or
# modify it under the same terms as Perl itself.
#
# Mail: eserte@cs.tu-berlin.de
# WWW:  http://user.cs.tu-berlin.de/~eserte/
#

package Geography::Berlin_DE;

use strict;
# private:
use vars qw(%subcityparts %cityparts %subcitypart_to_citypart %properties);

# (alte) Bezirke => Bezirksteile
%subcityparts =
    (
     'Charlottenburg'	 => [qw/Charlottenburg-Nord Pichelsberg Westend
			        Witzleben Halensee/],
     'Friedrichshain'	 => [],
     'Hellersdorf'	 => [qw/Kaulsdorf Mahlsdorf/],
     'Hohenschönhausen'	 => [qw/Falkenberg Margaretenhöhe Wartenberg Malchow/],
     'Kreuzberg'	 => [],
     'Köpenick'		 => [qw/Friedrichshagen Grünau Hessenwinkel
			        Karolinenhof
			        Müggelheim Oberschöneweide Rahnsdorf
			        Schmöckwitz Wilhelmshagen/],
     'Lichtenberg'	 => [qw/Friedrichsfelde Karlshorst/],
     'Marzahn'		 => [qw/Biesdorf/],
     'Mitte'		 => [],
     'Neukölln'		 => [qw/Britz Buckow Rudow/],
     'Pankow'		 => [qw/Blankenfelde Buchholz Buch Niederschönhausen
			        Rosenthal Französisch-Buchholz/],
     'Prenzlauer Berg'	 => [],
     'Reinickendorf'	 => [qw/Borsigwalde Frohnau Heiligensee Hermsdorf
			        Konradshöhe Lübars Tegel Waidmannslust
			        Wittenau/, 'Märkisches Viertel'],
     'Schöneberg'	 => [qw/Friedenau Schöneberg-Nord/],
     'Spandau'		 => [qw/Gatow Kladow Siemensstadt Haselhorst Staaken/],
     'Steglitz'		 => [qw/Lankwitz Lichterfelde/],
     'Tempelhof'	 => [qw/Lichtenrade Mariendorf Marienfelde/],
     'Tiergarten'	 => [qw/Tiergarten-Süd Hansaviertel Moabit/],
     'Treptow'		 => [qw/Adlershof Altglienicke Baumschulenweg
			        Bohnsdorf Johannisthal
			        Niederschöneweide/],
     'Wedding'		 => [qw/Gesundbrunnen/],
     'Weißensee'	 => [qw/Blankenburg Heinersdorf Karow/],
     'Wilmersdorf'	 => [qw/Grunewald Schmargendorf/],
     'Zehlendorf'	 => [qw/Dahlem Nikolassee Wannsee/],
    );

while(my($cp,$scp) = each %subcityparts) {
    $subcitypart_to_citypart{$cp} = $cp; # self-reference
    foreach (@$scp) { $subcitypart_to_citypart{$_} = $cp }
}

# (neue) Bezirke => (alte) Bezirke
%cityparts =
    ('Mitte'                            => [qw/Mitte Tiergarten Wedding/],
     # XXX wrong Alias?
     #'Mitte-Tiergarten-Wedding'         => [qw/Mitte Tiergarten Wedding/],
     'Friedrichshain-Kreuzberg'         => [qw/Friedrichshain Kreuzberg/],
     'Pankow-Prenzlauer Berg-Weißensee' => [qw/Pankow Weißensee/,
					    'Prenzlauer Berg'],
     # XXX wrong Alias?
     #'Pankow-Prenzlauer Berg-Weissensee' => [qw/Pankow Weißensee/,
     #'Prenzlauer Berg'],
     'Charlottenburg-Wilmersdorf'       => [qw/Charlottenburg Wilmersdorf/],
     'Spandau'                          => ['Spandau'],
     'Steglitz-Zehlendorf'              => [qw/Steglitz Zehlendorf/],
     'Tempelhof-Schöneberg'             => [qw/Tempelhof Schöneberg/],
     'Neukölln'                         => [qw/Neukölln/],
     'Treptow-Köpenick'                 => [qw/Treptow Köpenick/],
     'Marzahn-Hellersdorf'              => [qw/Marzahn Hellersdorf/],
     'Lichtenberg-Hohenschönhausen'     => [qw/Lichtenberg Hohenschönhausen/],
     'Reinickendorf'                    => [qw/Reinickendorf/],
    );


# XXX Methode
%properties =
    ('has_u_bahn' => 1,
     'has_s_bahn' => 1,
     'has_r_bahn' => 1,
     'has_map'    => 1,
     # XXX etc.: z.B. Icon-Namen, weitere Feinheiten wie
     # map-Names, Zonen, overview-Karte...
    );

sub new {
    my($class) = @_;
    bless {}, $class;
}

# cityname in native or common language
sub cityname { "Berlin" }

sub center { "8581,12243" } # Brandenburger Tor

sub supercityparts { sort keys %cityparts }
sub cityparts      { sort keys %subcityparts }
sub subcityparts   { map { (@$_) } values %subcityparts }

sub citypart_to_subcitypart { \%subcityparts }
sub subcitypart_to_citypart { \%subcitypart_to_citypart }

sub get_supercitypart_for_citypart { 
    shift; # object
    my $given_citypart = shift;
    keys %cityparts; # reset!!!
    while(my($supercitypart, $cityparts) = each %cityparts) {
	for my $citypart (@$cityparts) {
warn $citypart;
	    if ($citypart eq $given_citypart) {
warn "ok! $supercitypart";
		return $supercitypart;
	    }
	}
    }
    undef;
}

sub get_cityparts_for_supercitypart {
    exists $cityparts{$_[1]} ? @{ $cityparts{$_[1]} } : ()
}

sub get_all_subparts { # ... recursive
    my($class, $name) = @_;
    if (!defined $name) {
	return map { $class->get_all_subparts($_) } $class->cityparts;
    }
    my %res = ($name => undef);
    if (exists $cityparts{$name}) {
	foreach my $cp (@{ $cityparts{$name} }) {
	    my @sub_res = $class->get_all_subparts($cp)
		unless $cp eq $name;
	    @res{@sub_res} = undef;
	}
    }
    if (exists $subcityparts{$name}) {
	@res{ @{$subcityparts{$name}} } = undef;
    }
    sort keys %res;
}

# XXX rename directory data to data_berlin_de?
sub datadir {
    require File::Basename;
    my $pkg = __PACKAGE__;
    $pkg =~ s|::|/|g; # XXX other oses?
    $pkg .= ".pm";
    if (exists $INC{$pkg}) {
	return File::Basename::dirname(File::Basename::dirname($INC{$pkg}))
	    . "/data";
    }
    undef; # XXX better solution?
}

sub parse_street_type_nr {
    my($self, $strname) = @_;
    my $type;
    my $do_round;
    if ($strname =~ /berlin\s*-\s*usedom/i) {
	$type = 'BU';
    } elsif ($strname =~ /berlin\s*-\s*kopenhagen/i) {
	$type = 'BK';
    } elsif ($strname =~ /mauer.*weg/i) {
	$type = 'M';
    } elsif ($strname =~ /havellandradweg/i) {
	$type = 'HVL';
    } elsif ($strname =~ /spreeradweg/i) {
	$type = 'S';
    } elsif ($strname =~ /hofjagdweg/i) {
	$type = 'H';
    }
    if (defined $type) {
	$do_round = 1;
    }
    ($type, undef, $do_round);
}

1;

__END__
