use strict;
use warnings;

use LWP::Simple;
use HTML::SimpleLinkExtor;
use URI;
use POSIX;

# ------------------ Konfiguration ---------------
# Hier stehen die Infos ueber die Cartoons
my $configfile = "cartoons.txt";

# Pfad zu den Cartoons ('/' am Schluss!)
my $path = 'cartoons/';
# ------------------------------------------------

my ($line, $index, $cur_link, $count);

open(INPUT, "<", $configfile)
     or die("Kann $configfile nicht oeffnen: $!");
$count = 0;    

# Konfigurationsdatei zeilenweise abarbeiten
while ($line = <INPUT>)
  {
  chomp($line);
  $count++;

  # Kommentarzeilen überspringen
  next if ($line =~ m/^\s*#/);

  # Leerzeilen überspringen
  next if ($line =~ m/^\s*$/);

  # Zeile zerlegen
  my ($name, $page, $pattern) = split(/\t/, $line);

  # fehlerhafte Zeilen melden
  die "Fehler in der Eingabedatei, Zeile $count:\n$line\n"  
      unless (defined($pattern));

  # Textseite mit Links laden
  my $text_page = get($page);
  unless (defined($text_page))
    {
	  print "Kann $page nicht laden!\n";
	  next;
    }

  # Create a decoder for this page
  my $decoder = HTML::SimpleLinkExtor->new();
  $decoder->parse($text_page);

  # Imagelinks extrahieren
  my @links = $decoder->img();
  my @matches = grep(/$pattern/, @links);

  # kein Link gefunden, Fehlermeldung
  if ($#matches == -1)
    {
	  print "Kein Muster gefunden fuer $name!\n";
	  print "	  Muster: $pattern\n";
	  foreach $cur_link (@links)
	    { print "	  $cur_link\n";	}
    }
  # mehrere Links auf der Seite  
  elsif ($#matches != 0)
    {
	  print "   Mehfachlinks:\n";
	  $index = 1;
	  foreach $cur_link (@matches)
	    {
	    print "      $cur_link\n";
	    do_file($name, $page, $cur_link, $index);
	    ++$index;
	    }
    }
  # nur ein Link auf der Seite  
  else
    { do_file($name, $page, $matches[0], undef); }
  }
close(INPUT);
print "Done ...\n";


sub do_file
  # Download und Speichern des/der angegebenen Cartoons.
  # Bei mehreren Cartoons auf einer Seite muss
  # $index für jede Datei einen anderen Wert haben.
  {
  my $name = shift;   # Dateiname fuer Speichern
  my $page = shift;   # Basis-URL
  my $link = shift;   # Link, nach dem gesucht wird
  my $index = shift;  # Index (multiple files)

  my $ausgabe;

  # Dateierweiterung aus dem Link extrahieren
  my $ext = 'jpg';            # default
  $link =~ /(\.[^\$\.]*)$/;
	$ext = $1 if (defined($1));

  # Absolute URI bilden
  my $uri = URI->new($link);
  my $abs_link = $uri->abs($page);
  print "Lade $name herunter ...\n";

  # Header untersuchen
  my @head = head($abs_link->as_string());
  if ($#head == -1)
    {
	  print "Link $name nicht erreichbar: ",
	        $abs_link->as_string(), "\n";
	  return;
    }
    
  # Rohdaten der Webseite holen
  my $raw_data = get($abs_link->as_string());
  unless (defined($raw_data))
    {
	  print "Kann $link nicht herunterladen: $!\n";
	  return;
    }

  if (defined($index))
    {	$ausgabe = $path . "$name.$index$ext"; }
  else
    {	$ausgabe = $path . "$name$ext"; }
  unless (open(OUT_FILE, '>', $ausgabe))
    {
	  print "Kann Datei $ausgabe nicht oeffnen: $!\n";
	  return;
    }
  print "Speichere $ausgabe ...\n";  
  binmode OUT_FILE;      # fuer Windose
  print OUT_FILE $raw_data;
  close OUT_FILE;
  }



