#!/usr/local/bin/perl
#

use JSON qw( decode_json );
use Data::Dumper;
use LWP::UserAgent;
use CGI::Pretty qw(:standard);
use HTML::Parser;
use HTML::Entities;
use XML::Simple;
use vars '%in';


for my $p (param) {
	my @p = param($p);
	if ( scalar(@p) == 1 ) {
		$in{$p} = $p[0];
	} else {
		$in{$p} = [@p];
	}
}

unless ($in{num_train}) {
	print header( -pragma  => "no-cache" );
	print "http://spyou.org/sncf/?num_train=893754[&date=25/11/2013][&output=xml]<br><br>";
	print "Ce script extrait les infos du site infolignes.com sur une idée originale de l'ami Hervé chez <a href=\"http://www.abavala.com\">abavala.com</a>.<br>";
	print "C'est un genre d'opendata SNCF en mode bout de scotch. Je m'en sers pour informer mon système domotique de l'état des lignes que je fréquente quotidiennement.<br>";
	print "Si vous ne specifiez pas la date, elle sera fixée à aujourd'hui.<br>Date acceptable : de la veille à J+4. Attention, certains trains ne circulent que certains jours<br>Vous pouvez récupérer les numéros de trains sur les diverses fiches horaires SNCF<br>L'option ?output=xml vous permet d'obtenir une sortie XML parsable simplement<br><br>";
	print "<a href=\"?num_train=4754\">Exemple</a> d'un train circulant tous les jours. <a href=\"?num_train=4754&output=xml\">Le même</a> en XML.<br><br>";
	print "Have fun. Commentaires & idées bienvenues : root _at_ spyou _point_ org<br><br>";
	print "Ce service est l'ancètre du projet <a href=\"http://www.raildar.fr/\">raildar</a>";
	exit;
}

my (undef, undef, undef, $day, $month, $year) = localtime;
if ($in{date}) {
	($day, $month, $year) = split(/\//, $in{date});
} else {
	$year += 1900;
	$month += 1;
}
$day =~ s/[^0-9+]//g;
$month =~ s/[^0-9+]//g;
$year =~ s/[^0-9+]//g;
$in{num_train} =~ s/[^0-9+]//g;

my $url = "http://www.infolignes.com/recherche.php?date_num_train=".$year."%7C".$month."%7C".$day."&num_train=".$in{num_train};


my $ua = LWP::UserAgent->new;
$ua->agent("Personnal SNCF Ticker. Contact root\@spyou.org upon any problem");
my $res = $ua->get($url);
my $result = $res->decoded_content;

my ($foo, $result) = split(/<table class=\"resultat\">/,$result);
my ($result, $foo) = split(/<\/table>/,$result);
my ($foo, $result) = split(/<\/thead>/,$result);
my @tab;
my $line=0;
my $col=0;

my $h = HTML::Parser->new( start_h => [\&start_rtn,'tag'], text_h => [\&text_rtn,'text'], end_h => [\&end_rtn,'tag']);
$h->parse($result);

if ($in{output} eq "xml") {
	my %xml;
	my $xs = XML::Simple->new();
	$xml->{sncf_url} = $url if ($in{debug});
	$xml->{num_train} = $in{num_train};
	$xml->{date}{day} = $day;
	$xml->{date}{month} = $month;
	$xml->{date}{year} = $year;
	if ($tab[1][0]) {
		int $i;
		for ($i=1; $i<100; $i++) {
			$xml->{arret}[$i-1]{rank} = $i;
			$xml->{arret}[$i-1]{gare} = $tab[$i][0];
			$xml->{arret}[$i-1]{timing} = $tab[$i][1];
			$xml->{arret}[$i-1]{infos} = $tab[$i][2];
			last if ($tab[$i+1][0] eq "");
		}
	}

	print "Content-type: text/xml\n\n";
	print $xs->XMLout($xml, );

} else {
	print header( -pragma  => "no-cache" );
	if ($tab[1][0]) {
		print "Circulation du train ".$in{num_train}." pour le ".$day."/".$month."/".$year."<br>";
		print "<table>";
		int $i;
		for ($i=1; $i<100; $i++) {
			print "<tr><td>".$tab[$i][0]."</td><td>".$tab[$i][1]."</td><td>".$tab[$i][2]."</td></tr>";
			last if ($tab[$i][0] eq "");
		}
		print "</table>";
	} else {
		print "Le train ".$in{num_train}." ne circule pas le ".$day."/".$month."/".$year." ou bien n'existe pas";
	}
} 


sub start_rtn {
	foreach (@_) {
		if ($_ eq "tr") { $line++; }
	}
}
sub text_rtn {
	foreach (@_) {
		my $content = $_;
		$content =~ s/^\s+|\s+$//g;
		$content =~ s/&nbsp;/ /;
		next unless ($content);
		$tab[$line][$col] .= encode_entities($content);
		$col++;
	}
}
sub end_rtn {
	foreach (@_) {
		if ($_ eq "\/tr") { $col=0; }
	}
}
