#! /usr/bin/perl
use strict;
use warnings;
no warnings qw(once);
use CGI;
use CGI::Carp qw( fatalsToBrowser );
use DBI;
use Encode;
use POSIX;
use HTML::Entities;
use utf8;
use locale;
require '../config.pm';

my $dbh = DBI->connect($config::local_connstr, $config::local_username, $config::local_password)
	or die "connect: " . $DBI::errstr;
$dbh->{AutoCommit} = 0;
$dbh->{RaiseError} = 1;

binmode STDOUT, ':utf8';

# Find auxillary parameters.
my %params = ();
my $q = $dbh->prepare('SELECT * FROM ratings WHERE id < 0');
$q->execute;
while (my $ref = $q->fetchrow_hashref) {
	$params{$ref->{'id'}} = $ref->{'rating'};
}
my $match_stddev = $params{-2} * sqrt(2.0);

print CGI->header(-type=>'text/html; charset=utf-8', -expires=>'+5m');
POSIX::setlocale(&POSIX::LC_ALL, 'nb_NO.UTF-8');

printf <<"EOF", $params{-3}, $match_stddev;
<html>
  <head>
    <title>WLoH-rating</title>
    <link rel="stylesheet" href="/style" type="text/css" />
  </head>
  <body>
    <h1>WLoH-rating</h1>

    <p><em>Dette er et hobbyprosjekt fra tredjepart, og ikke en offisiell del av
      <a href="http://wordfeud.aasmul.net/">Wordfeud Leage of Honour</a>.</em></p>

    <p>Ratingen er dog basert på spilledata fra WLoH (takk til Lobotommy
      for tilgang!), og oppdateres
      hver hele time. Den er fullstendig uoffisiell, og har ingen innflytelse
      på WLoH, men brukes for å estimere vinnersannsynligheter i
      <a href="/">sannsynlighetsberegningen</a>.</p>

    <p>Vær obs på at det
      er betydelig usikkerhetsmargin, spesielt for spillere som ikke
      har spilt spesielt mange kamper.</p>

    <p>Modellen kan endre seg når som helst når jeg føler for det :-)
      Ikke ta ratingen alt for alvorlig, selv om den er basert på
      relativt fornuftige matematiske modeller. Husk at all statistikk
      sier mer om fortiden enn om framtiden.</p>

    <h2>Modellparametre</h2>

    <p>For de som vet litt om slikt. Det finnes også en lengre, mer detaljert
      <a href="/ratings-explained">forklaring</a> beregnet på ikke-matematikere.</p>

    <ul>
      <li>MLE-basert modell med én skalar (styrke) per spiller og to globale skalarer (begge standardavvik, se under), løst med syklisk MM (minorization-maximization). Antall iterasjoner før konvergens: $params{-1}.</li>
      <li>Rimelighetfunksjon, prior: Normalfordeling med µ=1500, &sigma;=%.1f (est.)</li>
      <li>Rimelighetfunksjon, per kamp: Normalfordeling med µ=(score1 - score2), &sigma;=%.1f (est.)</li>
      <li>Vekting: Inneværende sesong samt de tre siste vektes fullt ut
	(likt med prior). Deretter eksponentielt synkende vekting, med
        halveringstid på tre sesonger. Spill som er registrert med
        150-0, 0-150 eller 150-150 ignoreres.</li>
    </ul>

    <h2>Divisjonsoversikt</h2>

    <table>
      <tr>
        <th>Div.</th>
        <th>Snitt</th>
        <th>Std.avvik</th>
      </tr>
EOF

$q = $dbh->prepare('SELECT divisjon,AVG(rating) AS avg_rating,STDDEV(rating) AS stddev_rating FROM ratings NATURAL JOIN siste_divisjon GROUP BY divisjon ORDER BY divisjon');
$q->execute;

my $i = 0;
while (my $ref = $q->fetchrow_hashref) {
	if (++$i % 2 == 0) {
		print "      <tr class=\"odd\">\n";
	} else {
		print "      <tr class=\"even\">\n";
	}
	printf "        <th>%d.</th>\n", $ref->{'divisjon'};
	printf "        <td class=\"num\">%.1f</td>\n", $ref->{'avg_rating'};
	printf "        <td class=\"num\">%.1f</td>\n", $ref->{'stddev_rating'};
	print "      </tr>\n";
}

print <<"EOF";
    </table>

  <h2>Rankingliste</h2>

  <table>
    <tr>
      <th></th>
      <th>Nick</th>
      <th>Rating</th>
      <th>Sist sett</th>
    </tr>
EOF

$q = $dbh->prepare('
SELECT *
FROM ratings
  NATURAL JOIN kanonisk_navn
  NATURAL JOIN siste_divisjon
ORDER BY rating DESC');
$q->execute;

$i = 0;
while (my $ref = $q->fetchrow_hashref) {
	if (++$i % 2 == 0) {
		print "    <tr class=\"odd\">\n";
	} else {
		print "    <tr class=\"even\">\n";
	}
	printf "      <th>%d.</th>\n", $i;
	printf "      <td><a href=\"http://wordfeud.aasmul.net/bruker-%d\">%s</a></td>\n", $ref->{'id'}, HTML::Entities::encode_entities(Encode::decode_utf8($ref->{'navn'}));
	printf "      <td class=\"num\">%.1f</td>\n", $ref->{'rating'};
	printf "      <td><a href=\"http://wordfeud.aasmul.net/serie-%d\">%s</a></td>\n", $ref->{'serie_id'}, $ref->{'serie_navn'};
	print "    </tr>\n";
}

print <<"EOF";
    </table>
  </body>
</html>
EOF

$match_stddev = $params{-2} * sqrt(2.0);

$dbh->rollback;
