#weer |week|kans|<plaats>
use utf8;
use URI::Escape;
use Date::Format;
sub weer
{
    my ($msg, $dbh, $kanaal) = @_, my ($content, $plaats, $min, $max), my @content, my @parts;

    if ($msg eq '' || $msg eq 'week' || $msg eq 'kans') #knmi
    {
        if ($msg eq '')
        { $content = download('ftp://ftp.knmi.nl/pub_weerberichten/basisverwachting.txt'); }
        else
        { $content = download('ftp://ftp.knmi.nl/pub_weerberichten/middellange_termijn_verwachting.txt'); }
        if ($content)
        {
            @content = split(/\n/, $content);
            for(1..4) { shift @content; }
            for($i = 1; $i <= $#content; $i++)
            { $content[$i] eq '' && last; }
            if ($msg eq 'kans')
            {
                for(1..$i) { shift @content; }
                for($i = 1; $i <= $#content; $i++)
                { $content[$i] eq '' && last; }
            }
            while($#content >= $i) { pop @content; }
            $content = join("\n", @content);
            cache("weer $msg", $content, time2str('%Y-%m-%d %H:%M:%S', time+900));
            return $content;
        }
        else
        { return "Niks gevonden! Wellicht is 't KNMI down."; }
    }
    else #weeronline.nl
    {
        # We hebben een overzicht van steden
        if ($msg !~ m/^\d+$/)
        {
            $content = download("http://www.weeronline.nl/Go/Search/SearchResults?searchCriteria=".uri_escape($msg)."&pageIndex=0&searchAction=WeatherInformation");

            if ($content eq '')
            { return "Niks gevonden! Wellicht is Weeronline.nl down"; }
            if ($content =~ m/\s0 zoekresultaten voor/)
            { return "Niks gevonden!"; }

            @content = grep(/document\.getElementById\('minimap/, split(/[\r\n]+/, $content));
            @content = map { s/^\s*<a href="\/[^\/]*\/([^\/]*)\/([^\/]*)\/[^"]*?(\d+)".*$/sprintf('%-40s: %s', "$2, $1", "$3");/ei; $_ } @content;

            # Maar één stad, direct die downloaden
            if ($#content == 0)
            {
                ($msg = $content[0]) =~ s/.*:\s//;
            }
            # Eerste stad is directe match
            elsif (($plaats = $content[0]) =~ s/,.*?(\d+)$//
             && lc $plaats eq lc $msg)
            {
                $msg = $1;
            }
            # Toon overzicht van weercodes
            else
            {
                $max = $kanaal ? 2 : 8;
                return join("\n", $#content >= $max ? @content[0..$max-1] : @content);
            }
        }

        # We hebben een stad
        if ($msg =~ m/^\d+$/)
        {
            $content = download("http://weeronline.nl/a/b/c/".uri_escape($msg));

            if ($content eq '')
            { return "Niks gevonden! Wellicht is Weeronline.nl down."; }
            if ($content !~ m#<span class="morning">#)
            { return "Niks gevonden!"; }

            @content = split(/[\r\n]+/, $content);

            ($plaats) = grep(/De weersverwachting voor <strong>[^<]*</, @content);
            $plaats =~ s/^.*De weersverwachting voor <strong>([^<]*)<\/strong>.*$/$1/;

            @parts = grep(/(ochtend|middag|avond)<img/, @content);
            @parts = map { s/^\s*\w*<img alt="Het weer $plaats: ([^"]*)".*$/$1/; $_ } @parts;

            ($min, $max) = map { s/^\s*<strong title="\w+temperatuur (\d+).*$/$1/; $_ }
                           grep(/<strong title="\w+temperatuur (\d+)°">/, @content);

            $return = sprintf("De weersverwachting voor %s: \'s ochtends %s, \'s middags %s en \'s avonds %s. Minimum temperatuur %d°C, maximum temperatuur %d°C."
                             ,$plaats
                             ,$parts[0]
                             ,$parts[1]
                             ,$parts[2]
                             ,$min
                             ,$max
                             );

            cache("weer $msg", $return, time2str('%Y-%m-%d %H:%M:%S', time+900));
            return $return;
        }

    }
}

sub weer_help
{
    my $return;
    $return  = "Toon de weersverwachting: weer |week|kans|<plaats>\n";
    $return .= "Bv.: weer -> toon het weer\n";
    $return .= "Bv.: weer week -> toon het weer voor de komende week\n";
    $return .= "Bv.: weer kans -> toon kansen op neerslag, zon, etc.\n";
    $return .= "Bv.: weer amsterdam -> toon de weercodes voor Amsterdam\n";
    $return .= "Bv.: weer 4058223 -> toon het weer voor vandaag in Amsterdam\n";
    return $return;
}

1;
