#!/usr/bin/perl

# (c) Petra Galuscakova, 2009
# galuscakova@gmail.com

# Usage: perl score.pl wingri 62575 > seen.html

# Library LWP::UserAgent is needed 
# http://search.cpan.org/~gaas/libwww-perl-5.834/lib/LWP/UserAgent.pm
use LWP::UserAgent;
use strict;	
use warnings;

use encoding 'utf8';
use utf8;
use open qw/:std :utf8/;

my $SEEN = 1;
my $UNSEEN = 0;

my $page_chart = "";
my $page_user = "";

my @chart; # saves, wheter user saw a movie
my %movie_names;
my %user_chart;
my $userscore = 0;
my $username = $ARGV[0];
my $usernumber = $ARGV[1];
my $length = 25;

download_charts();
download_user_charts();
read_chart();
read_user();
$userscore = calculate_score();
print_outputs();

# Download top 200 movies
sub download_charts {
	 
	# Create a user agent object
	my $ua = LWP::UserAgent->new;
	$ua->agent("MyApp/0.1 ");

	# Create a request
	my $req = HTTP::Request->new(POST => 'http://www.csfd.cz/zebricky/nejlepsich-200-filmu/?limit=200&zanr=0&rok=0&rok2=0&puvod=0&typ=0');

	# Pass request to the user agent and get a response back
	my $res = $ua->request($req);

	# Check the outcome of the response
	if ($res->is_success) {
		$page_chart .= $res->content;
	}
	else {
		my $error .= $res->status_line;
		print $error;
	}
}

# Dowload movies seen by the user
sub download_user_charts {
	my $iteration = 1;
	my $end = 0;

	while (! $end) {

		# Create a user agent object
		my $ua = LWP::UserAgent->new;
		$ua->agent("MyApp/0.1 ");

		# Create a request
		my $adr = "http://www.csfd.cz/uzivatel/" . $usernumber . "-" . $username . "/hodnoceni/?page=" . $iteration . "&podle=data";
		my $req = HTTP::Request->new(POST => $adr);

		# Pass request to the user agent and get a response back
		my $res = $ua->request($req);

		# Check the outcome of the response	
		if ($res->is_success) {
			$page_user .= $res->content;

			if ($page_user =~ "\.\.\. žádné \.\.\.") {
				$end = 1;
			}

		}
		else {
			my $error .= $res->status_line;
			print $error;
			
			$end = 1;
		}

		$iteration++;
	}
}

# Get names of top 200 movies
sub read_chart {

	$page_chart =~ s/\r$//g;
	my @page_chart = split('\n', $page_chart);

	foreach my $line (@page_chart) {

		if ($line =~ /<td><a href=\"\/film\//) {

			my ($first, $second) = split("/\">", $line);
			my ($movie, $rest) = split("</a>", $second);

			my $str_movie = substr $movie, 0, $length;
			push @chart, $str_movie;
			$movie_names{$str_movie} = $movie;
		}
	}
}

# Get names of the movies seen by the user
sub read_user {
	
	$page_user =~ s/\r$//g;
	my @page_user = split('\n', $page_user);

	foreach my $line (@page_user) {

		if ($line =~ "</a> \(....\)") {

			my ($movie, $rest) = split("</a>", $line);

			$movie =~ s/^( )*//g;
			my $str_movie = substr $movie, 0, $length;
			$user_chart{$str_movie} = $SEEN;
		}
	}
}

# Calculate how many of top 200 movies has user seen
sub calculate_score {
	my $score = 0;
	
	foreach my $movie (@chart) {
		if (exists $user_chart{$movie} and defined $user_chart{$movie}) {
			$score++;
		}
	}

	return $score;
}

# Print score and list of 200 top movies as html file
sub print_outputs {
	print "<html>\n<body>\n\n";

	print "Score for $username is $userscore<br><br>\n\n";

	# Print movies, seen movies are printed bold
	my $i = 1;
	foreach my $movie (@chart) {
		if (exists $user_chart{$movie} and defined $user_chart{$movie}) {
			print "<b>$i   $movie_names{$movie}\</b><br>\n";
		} else {
			print "$i   $movie_names{$movie}<br>\n";
		}
		$i++;
	}

	print "</body>\n</html>"
}
