#! /usr/bin/perl

use ccbs;
use strict;
use warnings;

ccbs::admin_only();

my $dbh = ccbs::db_connect();
my $cgi = new CGI;

my $tournament = $cgi->param('tournament');
my $round = $cgi->param('round');
my $group = $cgi->param('group');

$dbh->{AutoCommit} = 0;

my $tournamentdata = $dbh->selectrow_hashref('SELECT * FROM tournaments NATURAL JOIN machines WHERE tournament=?',
	undef, $tournament);

my %checked_songs = ();

# Loop through all parameters and see what parameters differ between old- and current
# versions
for my $p ($cgi->param()) {
	next if ($p =~ /^old-(.*?)$/);
	next unless (defined($cgi->param('old-' . $p)));
	next if ($cgi->param($p) eq $cgi->param('old-' . $p));

	my $val = $cgi->param($p);
	undef $val if ($val =~ /^\s*$/);

	# _Before_ we do changes to the database, check if this is possibly something
	# that will trigger a foreign key error. There will be an error if the tuple
	# (song,playmode,difficulty) is set (ie. all members are set) and the combination
	# doesn't exist in songratings, so check that. However, only check once per
	# song (or else we'll be doing lots of unneeded database calls).
	if ($p =~ /^(?:playmode|difficulty|song)(\d+)-(\d+)$/ && !defined($checked_songs{"$1-$2"})) {
		# check that the entire triple is set
		if (defined($cgi->param("playmode$1-$2"))   && $cgi->param("playmode$1-$2") !~ /^\s*$/ &&
		    defined($cgi->param("difficulty$1-$2")) && $cgi->param("difficulty$1-$2") !~ /^\s*$/ &&
		    defined($cgi->param("song$1-$2"))       && $cgi->param("song$1-$2") !~ /^\s*$/) {
			my $ref = $dbh->selectrow_hashref('SELECT COUNT(*) AS num_songs FROM songratings WHERE song=? AND playmode=? AND difficulty=? AND machine=?',
				undef, $cgi->param("song$1-$2"), $cgi->param("playmode$1-$2"),
				$cgi->param("difficulty$1-$2"), $tournamentdata->{'machine'});
			if ($ref->{'num_songs'} != 1) {
				# Fetch the name of the song if we can
				$ref = $dbh->selectrow_hashref('SELECT title FROM songs WHERE song=?',
					undef, $cgi->param("song$1-$2"));
				ccbs::user_error(_("The song") . $ref->{'title'} . _("doesn't have steps for ") .
					$cgi->param("playmode$1-$2") . " " . $cgi->param("difficulty$1-$2") . _(" on ").
					$tournamentdata->{'machinename'} . ".");
			}
			$checked_songs{"$1-$2"} = 1;
		}
	}

	if ($p =~ /^score(\d+)-(\d+)/) {
		if (defined($val) && ($val < 0 || $val > 10000)) {
			ccbs::user_error(_("All scores must be between 0 and 10000 (inclusive)."));
		}
	
		$dbh->do('UPDATE scores SET score=? WHERE tournament=? AND round=? AND parallel=? AND player=? AND songnumber=?', undef,
			$val, $tournament, $round, $group, $1, $2);
	} elsif ($p =~ /^playmode(\d+)-(\d+)/) {
		$dbh->do('UPDATE scores SET playmode=? WHERE tournament=? AND round=? AND parallel=? AND player=? AND songnumber=?', undef,
			$val, $tournament, $round, $group, $1, $2);
	} elsif ($p =~ /^difficulty(\d+)-(\d+)/) {
		$dbh->do('UPDATE scores SET difficulty=? WHERE tournament=? AND round=? AND parallel=? AND player=? AND songnumber=?', undef,
			$val, $tournament, $round, $group, $1, $2);
	} elsif ($p =~ /^song(\d+)-(\d+)/) {
		$dbh->do('UPDATE scores SET song=? WHERE tournament=? AND round=? AND parallel=? AND player=? AND songnumber=? AND chosen=\'t\'', undef,
			$val, $tournament, $round, $group, $1, $2);
	}
}

$dbh->do('UPDATE bigscreen.active_groups SET last_updated=now() WHERE tournament=? AND round=? AND parallel=?',
	undef, $tournament, $round, $group);
$dbh->do('NOTIFY scores');

$dbh->commit;
$dbh->disconnect;

ccbs::print_see_other('show-tournament.pl?id=' . $tournament . '#round' . $round);

