#!/usr/bin/perl -w
use strict;
use LWP::Simple;
use HTML::TableExtract;

# uywamy wersji witryny Kanada/angielski, gdy zawarta tam tabela 
# umoliwiajca ledzenie paczek jest prostsza w analizie ni USA.
my $url_base = "http://www.fedex.com/cgi-bin/tracking?action=track".
               "&cntry_code=ca_english&tracknumbers=";

# uytkownik chce doda nowy ledzony numer.
my @tracknums; push(@tracknums, shift) if @ARGV;

# uytkownik ma ju na dysku jakie dane, wic pobieramy je.
# technicznie rzecz biorc mona byoby wywoa grep do readdir,
# ale potem i tak trzeba bdzie przetwarza pliki @files, wic...
opendir(CWD, ".") or die $!; my @files = readdir(CWD); closedir(CWD);
foreach (@files) { /fedex_tracker_(\d+).dat/; push(@tracknums, $1) if $1; }
unless (@tracknums) { die "Nie ma paczek do ledzenia!\n"; }
my %h; undef (@h{@tracknums}); @tracknums = keys %h; # niepowtarzalny klucz.

# wyszukujemy kady numer.
foreach my $tracknum (@tracknums) {

    # pobranie danych lub koniec.
    my $data = get("$url_base$tracknum") or die $!;
    $data =~ s/&nbsp;/ /g; # spacje nierozdzielajce.

    # i adujemy tabel umoliwiajc ledzenie.
    my $te = HTML::TableExtract->new(
           headers => ["Scan Activity","Date/Time"]);
    $te->parse($data); # no dobrze, miejmy nadziej, e pobralimy wszystko.

    # teraz pobieramy nowe dane.
    my $new_data_from_site;
    foreach my $ts ($te->table_states) {
       foreach my $row ($ts->rows) {
           $new_data_from_site .= " " . join(', ', @$row) . "\n";
       }
    }

    # jeli dany numer jest nieprawidowy, idziemy dalej - 
    # przechodzimy do nastpnego.
    unless ($new_data_from_site) {
       print "Nie znaleziono danych dla paczki #$tracknum. Pomijam.\n"; next; 
    }

    # jeli ten pakiet nigdy nie by dotd ledzony, utworzymy
    # dla plik na jego dane. plik ten uywany bdzie do porwna
    # przy kolejnych wywoaniach.
    unless (-e "fedex_tracker_$tracknum.dat") {
       open(FILE, ">fedex_tracker_$tracknum.dat") or die $!;
       print FILE $new_data_from_site; close (FILE);
       print "Dodawanie danych dotyczcych #$tracknum:\n";
       print $new_data_from_site;
    }

    # jeli plik z danymi istnieje, adujemy go do acucha i robimy
    # bardzo proste porwnanie w celu sprawdzenia, czy jeden i drugi
    # s rwne sobie. jeli nie, zakadamy, e co si zmienio.
    if (-e "fedex_tracker_$tracknum.dat") {
        open(FILE, "<fedex_tracker_$tracknum.dat");
        $/ = undef; my $old_data_from_file = <FILE>; close(FILE);
        if ($old_data_from_file eq $new_data_from_site) {
            print "Nie byo adnych zmian dotyczcych paczki #$tracknum.\n";
        } else {
            print "Paczka #$tracknum w swej podry posuna si do przodu!\n";
            print $new_data_from_site; # aktualizacja uytkownika.
            open(FILE, ">fedex_tracker_$tracknum.dat");
            print FILE $new_data_from_site; close(FILE);
            # plik jest aktualizowany przed nastpnym porwnaniem.
        }
    }
}

