<?php
/*******************************************************************************
 * Copyright (c) 2008-2019 Eclipse Foundation and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *    Foundation - initial API and implementation
 *    Satoru Yoshida - [470121] scoreboard could be removed if no needed
*******************************************************************************/

class Scoreboard {

	public function refresh($forceRefresh) {
		global $dbh;
		$sql = "SELECT quantity FROM scoreboard " .
			"WHERE itemid = 'LASGEN' " .
			"AND quantity < (SELECT MAX(translation_id) as t FROM translations)";

		$result = mysqli_query($dbh, $sql);
		if(($result && mysqli_num_rows($result) > 0) || $forceRefresh) {

			# "lock" the scoreboard so that 2 clients don't update it simultaneously
			mysqli_query($dbh, "UPDATE scoreboard SET quantity = 9999999999 WHERE itemid = 'LASGEN'");

			# rebuilding the scoreboard takes time ... dump stuff to tmp
			mysqli_query($dbh, "CREATE TEMPORARY TABLE _tmp_scoreboard LIKE scoreboard");
			$sql = "INSERT INTO _tmp_scoreboard SELECT NULL, 'LANGPR', IF(ISNULL(b.locale),b.name,CONCAT(b.name, CONCAT(' (', CONCAT(b.locale, ')')))) AS language,  COUNT(t.string_id) / COUNT(s.string_id)*100 as tr_pct FROM strings as s inner join languages as b  left join translations as t ON s.string_id = t.string_id AND t.is_active and t.language_id = b.language_id where s.created_on > (NOW() - INTERVAL 1 YEAR) and s.value <> '' and s.is_active = 1 group by b.language_id order by tr_pct desc limit 20";
			mysqli_query($dbh, $sql);
			$sql = "INSERT INTO _tmp_scoreboard SELECT NULL, 'TOPTR', CONCAT(first_name, IF(ISNULL(last_name),'',CONCAT(' ', last_name))) AS name, count(t.string_id) as cnt from translations as t inner join users as u on u.userid = t.userid where t.created_on > (NOW() - INTERVAL 1 YEAR) and t.value <> '' and t.is_active=1 group by first_name, last_name having name <> 'Babel Syncup' order by cnt desc limit 20";
			mysqli_query($dbh, $sql);

			$sql = "INSERT INTO _tmp_scoreboard SELECT NULL, 'LASGEN', 'Scoreboard Last Generated', MAX(translation_id) FROM translations";
			mysqli_query($dbh, $sql);

			$sql = "INSERT INTO _tmp_scoreboard SELECT NULL, 'LGNOW', 'Scoreboard Last Generated Date/Time', NOW()";
			mysqli_query($dbh, $sql);
			
			mysqli_query($dbh, "LOCK TABLES scoreboard WRITE");
			mysqli_query($dbh, "DELETE FROM scoreboard");
			mysqli_query($dbh, "INSERT INTO scoreboard SELECT * FROM _tmp_scoreboard");
			mysqli_query($dbh, "UNLOCK TABLES");
			mysqli_query($dbh, "DROP TABLE _tmp_scoreboard");
		}
	}
}
?>