<?php
/**
 * Tis file is part of XNova:Legacies
 *
 * @license http://www.gnu.org/licenses/gpl-3.0.txt
 * @see http://www.xnova-ng.org/
 *
 * Copyright (c) 2009-Present, XNova Support Team <http://www.xnova-ng.org>
 * All rights reserved.
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 *
 *                                --> NOTICE <--
 *  This file is part of the core development branch, changing its contents will
 * make you unable to use the automatic updates manager. Please refer to the
 * documentation for further information about customizing XNova.
 *
 */

define('INSIDE' , true);
define('INSTALL' , false);
define('IN_ADMIN', true);
require_once dirname(__FILE__) .'./../common.php';

include(ROOT_PATH . 'admin/statfunctions.' . PHPEXT);

if ($user['authlevel'] >= 1)
{
includeLang('admin');
includeLang('admin/statconfig');

// On r�cup�re la quantit� m�moire avant l'actualisation
// It gets much memory before the update
$MemoryInitial = round(memory_get_usage() / 1024, 1);

$mtime        = microtime();
$mtime        = explode(" ", $mtime);
$mtime        = $mtime[1] + $mtime[0];

// Heure du d�but de l'actualisation
// Start time of the update
$starttime    = $mtime;

$StatDate   = time();

$Members = array();

/*************************************************************************************/
/*                    D�but du calcul des statistiques des joueurs                   */
/*                         Start calculating player statistics                       */
/*************************************************************************************/

// On r�cup�re le classement des joueurs
// It retrieves the player rankings
$sql = <<<EOF
SELECT u.*,
s.build_rank,
s.defs_rank,
s.fleet_rank,
s.tech_rank,
s.total_rank
FROM {{table}}users AS u
LEFT JOIN {{table}}statpoints AS s ON u.id = s.id_owner AND s.stat_type = '1'
WHERE u.id = s.id_owner
ORDER BY u.id;
EOF;
$nb = 0;

$Users = doquery( $sql, '');

while ($TheUser = mysql_fetch_assoc ($Users))
{
$Members['id_owner'][$nb] = intval($TheUser['id']);
$Members['ally_id'][$nb] = intval($TheUser['ally_id']);
$Members['old_build_rank'][$nb] = intval($TheUser['build_rank']);
$Members['old_defs_rank'][$nb]= intval($TheUser['defs_rank']);
$Members['old_fleet_rank'][$nb] = intval($TheUser['fleet_rank']);
$Members['old_tech_rank'][$nb]= intval($TheUser['tech_rank']);
$Members['old_total_rank'][$nb] = intval($TheUser['total_rank']);

// Calcul des points pour la recherche
// Scoring for search
$Points         = GetTechnoPoints ( $TheUser );
$Members['tech_count'][$nb]= $Points['TechCount'];
$Members['tech_point'][$nb]= ($Points['TechPoint'] / $game_config['stat_settings']);

$nb++;
}

// On r�cup�re les plan�tes de tous les joueurs
// It retrieves the planets of all players
$sql = <<<EOF
SELECT p.*
FROM {{table}}planets AS p
LEFT JOIN {{table}}users AS u ON u.id = p.id_owner
WHERE u.id = p.id_owner
ORDER BY p.id_owner
EOF;

$Planets = doquery($sql , '');

// On r�cup�re l'id le plus petit, normalement 1 mais on sait jamais ;)
// It retrieves the smallest id, normally 1 but you never know ;)
$sql = <<<EOF
SELECT Min(id) AS `min`
FROM {{table}};
EOF;
$MinID = doquery($sql, 'users', true);
$IdUser = intval($MinID['min']);

$nb = 0;

while ($ThePlanet = mysql_fetch_assoc ($Planets))
{
if ($ThePlanet['id_owner'] != $IdUser)
{
// On est sur une plan�te d'un autre joueur
// It is on a planet of another player

$sql = <<<EOF
SELECT *
FROM {{table}}
WHERE `fleet_owner` = '{$IdUser}';
EOF;

$ResultFlyingFleet = doquery( $sql, 'fleets');

$Points = GetFlyingFleetPoints($ResultFlyingFleet);

$Members['fleets_points'][$nb] += $Points['FleetPoint'];
$Members['fleets_counts'][$nb] += $Points['FleetCount'];

// On calcule les points totaux du joueur actuel
// It gets the current player's total points
$Members['total_points'][$nb]= $Members['tech_point'][$nb] + $Members['build_points'][$nb] + $Members['defs_points'][$nb] + $Members['fleets_points'][$nb];
$Members['total_counts'][$nb]= $Members['tech_count'][$nb] + $Members['build_counts'][$nb] + $Members['defs_counts'][$nb] + $Members['fleets_counts'][$nb];

// On r�cup�re l'id du nouveau joueur
// It retrieves the id of the new player
$IdUser = intval($ThePlanet['id_owner']);

$nb++;

// Initialisation
// Initialization
$Members['build_counts'][$nb]= 0;
$Members['build_points'][$nb]= 0;

$Members['defs_counts'][$nb]= 0;
$Members['defs_points'][$nb]= 0;

$Members['fleets_counts'][$nb]= 0;
$Members['fleets_points'][$nb]= 0;
}

// Calcul des points apport�s par les b�timents
// Calculation of the points made by the buildings
$Points = GetBuildPoints ( $ThePlanet );
$Members['build_counts'][$nb]+= $Points['BuildCount'];
$Members['build_points'][$nb]+= ($Points['BuildPoint'] / $game_config['stat_settings']);
$PlanetPoints= ($Points['BuildPoint'] / $game_config['stat_settings']);

// Calcul des points apport�s par les d�fenses
// Calculation of the points made by defense
$Points = GetDefensePoints ( $ThePlanet );
$Members['defs_counts'][$nb]+= $Points['DefenseCount'];
$Members['defs_points'][$nb]+= ($Points['DefensePoint'] / $game_config['stat_settings']);
$PlanetPoints+= ($Points['DefensePoint'] / $game_config['stat_settings']);

// Calcul des points apport�s par les vaisseaux
// Calculation of the points made by the vessels
$Points = GetFleetPoints ( $ThePlanet );
$Members['fleets_counts'][$nb]+= $Points['FleetCount'];
$Members['fleets_points'][$nb]+= ($Points['FleetPoint'] / $game_config['stat_settings']);
$PlanetPoints+= ($Points['FleetPoint'] / $game_config['stat_settings']);

$IdPlanet = intval($ThePlanet['id']);

// Mise � jour des points de la plan�te
// Updated points of the planet
$QryUpdatePlanet = <<<EOF
UPDATE {{table}}
SET `points` = '{$PlanetPoints}'
WHERE`id` = '{$IdPlanet}';
EOF;
doquery ( $QryUpdatePlanet , 'planets');

}

// On efface les anciens statistiques des joueurs
// It erases the old player statistics
doquery ("DELETE FROM {{table}} WHERE `stat_type` = '1';", 'statpoints');

/*************************************************************************************/
/*                     Fin du calcul des statistiques des joueurs                    */
/*                        Finish calculating player statistics                       */
/*************************************************************************************/

/*************************************************************************************/
/*          D�but de la mise � jour des nouvelles statistiques des joueurs           */
/*                      Start updating new player statistics                         */
/*************************************************************************************/

// Mise � jour des joueurs par bloc
// Update player block
$BlocMembers = 25;

if ( sizeof($Members['id_owner']) > $BlocMembers)
{
$NumberQuerys = floor(sizeof($Members['id_owner']) / $BlocMembers);
$Query = 0;
}
else
{
$NumberQuerys = 1;
$Query = 0;
$BlocMembers = sizeof($Members['id_owner']);
}

While ( $Query <= $NumberQuerys)
{

$QryInsertStats  = <<<EOF
INSERT INTO {{table}}
(`id_owner`, `id_ally`, `stat_type`, `stat_code`, `tech_points`, `tech_count`,
`tech_old_rank`, `build_points`, `build_count`, `build_old_rank`, `defs_points`,
`defs_count`, `defs_old_rank`, `fleet_points`, `fleet_count`, `fleet_old_rank`,
`total_points`, `total_count`, `total_old_rank`, `stat_date`) VALUES
EOF;

for ($Count = $Query * $BlocMembers ; $Count < $BlocMembers * ($Query + 1) ; $Count++)
{
if ($Members['id_owner'][$Count] <> 0)
$QryInsertStats .= <<<EOF
('{$Members['id_owner'][$Count]}', '{$Members['ally_id'][$Count]}','1','1',
 '{$Members['tech_point'][$Count]}', '{$Members['tech_count'][$Count]}','{$Members['old_tech_rank'][$Count]}',
 '{$Members['build_points'][$Count]}', '{$Members['build_counts'][$Count]}','{$Members['old_build_rank'][$Count]}',
 '{$Members['defs_points'][$Count]}', '{$Members['defs_counts'][$Count]}','{$Members['old_defs_rank'][$Count]}',
 '{$Members['fleets_points'][$Count]}', '{$Members['fleets_counts'][$Count]}','{$Members['old_fleet_rank'][$Count]}',
 '{$Members['total_points'][$Count]}', '{$Members['total_counts'][$Count]}','{$Members['old_total_rank'][$Count]}',
 '{$StatDate}'),
EOF;
}

$Query++;

$QryInsertStats = substr($QryInsertStats, 0, -1);



doquery ( $QryInsertStats , 'statpoints');
}
/*************************************************************************************/
/*           Fin de la mise � jour des nouvelles statistiques des joueurs            */
/*                     Finish updating new player statistics                         */
/*************************************************************************************/

/*************************************************************************************/
/*                    D�but de la mise du classement des joueurs                     */
/*                        Start to set the player rankings                          */
/*************************************************************************************/

// Mise � jour du classement des Recherches
// Update Ranking Searches
doquery("SET @row=0;", '');
$RankQry = doquery("SELECT @row:=@row+1 AS TechRank, `id_owner` FROM {{table}} WHERE `stat_type` = '1' AND `stat_code` = '1' ORDER BY `tech_points` DESC;", 'statpoints');

while ($TheRank = mysql_fetch_assoc($RankQry))
{
$IdOwner = intval($TheRank['id_owner']);

$QryUpdateStats  = <<<EOF
UPDATE {{table}} SET
`tech_rank` = '{$TheRank['TechRank']}'
WHERE `stat_type` = '1' AND `stat_code` = '1' AND `id_owner` = '{$IdOwner}';
EOF;
doquery ( $QryUpdateStats , 'statpoints');
}

// Mise � jour du classement des B�timents
// Update rank Buildings
doquery("SET @row=0;", '');
$RankQry = doquery("SELECT @row:=@row+1 AS BuildRank, `id_owner` FROM {{table}} WHERE `stat_type` = '1' AND `stat_code` = '1' ORDER BY `build_points` DESC;", 'statpoints');

while ($TheRank = mysql_fetch_assoc($RankQry))
{
$IdOwner = intval($TheRank['id_owner']);

$QryUpdateStats  = <<<EOF
UPDATE {{table}} SET
`build_rank` = '{$TheRank['BuildRank']}'
WHERE `stat_type` = '1' AND `stat_code` = '1' AND `id_owner` = '{$IdOwner}';
EOF;
doquery ( $QryUpdateStats , 'statpoints');
}

// Mise � jour du classement des D�fenses
// Update rank Defenses
doquery("SET @row=0;", '');
$RankQry = doquery("SELECT @row:=@row+1 AS DefRank, `id_owner` FROM {{table}} WHERE `stat_type` = '1' AND `stat_code` = '1' ORDER BY `defs_points` DESC;", 'statpoints');

while ($TheRank = mysql_fetch_assoc($RankQry))
{
$IdOwner = intval($TheRank['id_owner']);

$QryUpdateStats  = <<<EOF
UPDATE {{table}} SET
`defs_rank` = '{$TheRank['DefRank']}'
WHERE `stat_type` = '1' AND `stat_code` = '1' AND `id_owner` = '{$IdOwner}';
EOF;
doquery ( $QryUpdateStats , 'statpoints');
}

// Mise � jour du classement des Flottes
// Update rank Fleet
doquery("SET @row=0;", '');
$RankQry = doquery("SELECT @row:=@row+1 AS FleetRank, `id_owner` FROM {{table}} WHERE `stat_type` = '1' AND `stat_code` = '1' ORDER BY `fleet_points` DESC;", 'statpoints');

$RankQry        = doquery("SELECT * FROM {{table}} WHERE `stat_type` = '1' AND `stat_code` = '1' ORDER BY `fleet_points` DESC;", 'statpoints');
while ($TheRank = mysql_fetch_assoc($RankQry))
{
$IdOwner = intval($TheRank['id_owner']);

$QryUpdateStats  = <<<EOF
UPDATE {{table}} SET
`defs_rank` = '{$TheRank['FleetRank']}'
WHERE `stat_type` = '1' AND `stat_code` = '1' AND `id_owner` = '{$IdOwner}';
EOF;
doquery ( $QryUpdateStats , 'statpoints');
}

// Mise � jour du classement G�n�ral
// Update Rank General
doquery("SET @row=0;", '');
$RankQry = doquery("SELECT @row:=@row+1 AS TotalRank, `id_owner` FROM {{table}} WHERE `stat_type` = '1' AND `stat_code` = '1' ORDER BY `total_points` DESC;", 'statpoints');

while ($TheRank = mysql_fetch_assoc($RankQry))
{
$IdOwner = intval($TheRank['id_owner']);

$QryUpdateStats  = <<<EOF
UPDATE {{table}} SET
`defs_rank` = '{$TheRank['TotalRank']}'
WHERE `stat_type` = '1' AND `stat_code` = '1' AND `id_owner` = '{$IdOwner}';
EOF;
doquery ( $QryUpdateStats , 'statpoints');
}

// On lib�re de la m�moire en d�truisant la variable
// It frees up memory by destroying the variable
unset($Members);

/*************************************************************************************/
/*                     Fin de la mise du classement des joueurs                      */
/*                       Finish to set the player rankings                          */
/*************************************************************************************/

/*************************************************************************************/
/*                   D�but du calcul des statistiques par alliance                   */
/*                      Start calculating statistics by alliance                     */
/*************************************************************************************/

$AllyStats = array();

// On r�cup�re le classement des alliances
// It retrieves the alliance rankings
$GameAllys = doquery("SELECT DISTINCT s1.id_owner,
s1.build_rank,
s1.defs_rank,
s1.fleet_rank,
s1.tech_rank,
s1.total_rank
FROM {{table}} AS s1
LEFT JOIN {{table}} AS s2 ON s1.id_owner = s2.id_ally
WHERE s1.stat_type = '2' AND s1.id_owner = s2.id_ally
ORDER BY `id_owner`;", 'statpoints');

$nb = 0;

while ($CurAlly = mysql_fetch_assoc($GameAllys)) {
$AllyStats['id_owner'][$nb] = intval($CurAlly['id_owner']);
$AllyStats['old_build_rank'][$nb]= intval($CurAlly['build_rank']);
$AllyStats['old_defs_rank'][$nb]= intval($CurAlly['defs_rank']);
$AllyStats['old_fleet_rank'][$nb] = intval($CurAlly['fleet_rank']);
$AllyStats['old_tech_rank'][$nb]= intval($CurAlly['tech_rank']);
$AllyStats['old_total_rank'][$nb]= intval($CurAlly['total_rank']);

$nb++;
}

$Qry = <<<EOF
SET @row=0;
EOF;
doquery($Qry, '');

// On r�cup�re les id des alliances
// It retrieves the id alliances
$QryAllys = <<<EOF
SELECT DISTINCT `id_ally`
FROM {{table}}
WHERE `stat_type` = '1' and `id_ally` <> 0
ORDER BY `id_ally`;
EOF;
$Allys = doquery($QryAllys, 'statpoints');

$nb = 0;
while ($TheAlly = mysql_fetch_assoc ($Allys))
{
$IdAlly = intval($TheAlly['id_ally']);

// On fait la somme des points de chaque joueur appartenant � l'alliance
// It is the sum of points each player belonging to the alliance
$QrySumSelect = <<<EOF
SELECT SUM(`tech_points`)  as `TechPoint`,
SUM(`tech_count`)   as `TechCount`,
SUM(`build_points`) as `BuildPoint`,
SUM(`build_count`)  as `BuildCount`,
SUM(`defs_points`)  as `DefsPoint`,
SUM(`defs_count`)   as `DefsCount`,
SUM(`fleet_points`) as `FleetPoint`,
SUM(`fleet_count`)  as `FleetCount`,
SUM(`total_points`) as `TotalPoint`,
SUM(`total_count`)  as `TotalCount`
FROM {{table}}
WHERE `stat_type` = '1'
AND `id_ally` = '{$IdAlly}';
EOF;
$Points         = doquery( $QrySumSelect, 'statpoints', true);

$AllyStats['tech_count'][$nb]= $Points['TechCount'];
$AllyStats['tech_points'][$nb]= $Points['TechPoint'];
$AllyStats['build_count'][$nb]= $Points['BuildCount'];
$AllyStats['build_points'][$nb]= $Points['BuildPoint'];
$AllyStats['defs_count'][$nb]= $Points['DefsCount'];
$AllyStats['defs_points'][$nb]= $Points['DefsPoint'];
$AllyStats['fleet_count'][$nb]= $Points['FleetCount'];
$AllyStats['fleet_points'][$nb]= $Points['FleetPoint'];
$AllyStats['total_count'][$nb]= $Points['TotalCount'];
$AllyStats['total_points'][$nb]= $Points['TotalPoint'];

$nb++;
}

// On efface les statistiques des alliances
// It clears the statistics alliances
doquery ("DELETE FROM {{table}} WHERE `stat_type` = '2';", 'statpoints');

/*************************************************************************************/
/*                    Fin du calcul des statistiques des alliances                   */
/*                        Finish calculating player statistics                       */
/*************************************************************************************/

/*************************************************************************************/
/*         D�but de la mise � jour des nouvelles statistiques des alliances          */
/*                     Start updating new alliance statistics                        */
/*************************************************************************************/
/*
$BlocAlly = 25;

if ( sizeof($AllyStats['id_owner']) > $BlocAlly)
{
$NumberQuerys = floor(sizeof($AllyStats['id_owner']) / $BlocAlly) + 1;
$Query = 0;
}
else
{
$NumberQuerys = 1;
$Query = 0;
$BlocAlly = sizeof($AllyStats['id_owner']);
}

While ( $Query < $NumberQuerys)
{

$QryInsertStats  = <<<EOF
INSERT INTO {{table}}
(`id_owner`, `id_ally`, `stat_type`, `stat_code`, `tech_points`, `tech_count`,
`tech_old_rank`, `build_points`, `build_count`, `build_old_rank`, `defs_points`,
`defs_count`, `defs_old_rank`, `fleet_points`, `fleet_count`, `fleet_old_rank`,
`total_points`, `total_count`, `total_old_rank`, `stat_date`) VALUES
EOF;

for ($Count = $Query * $BlocAlly ; $Count < $BlocAlly * $NumberQuerys ; $Count++)
{

$QryInsertStats  .= <<<EOF
('{$AllyStats['id_owner'][$Count]}', '0', '2', '1', '{$AllyStats['tech_points'][$Count]}', '{$AllyStats['tech_count'][$Count]}',
'{$AllyStats['old_tech_rank'][$Count]}', '{$AllyStats['build_points'][$Count]}', '{$AllyStats['build_count'][$Count]}',
'{$AllyStats['old_build_rank'][$Count]}', '{$AllyStats['defs_points'][$Count]}', '{$AllyStats['defs_count'][$Count]}',
'{$AllyStats['old_defs_rank'][$Count]}', '{$AllyStats['fleet_points'][$Count]}', '{$AllyStats['fleet_count'][$Count]}',
'{$AllyStats['old_fleet_rank'][$Count]}', '{$AllyStats['total_points'][$Count]}', '{$AllyStats['total_count'][$Count]}',
'{$AllyStats['old_total_rank'][$Count]}', '{$StatDate}'),
EOF;
}
$Query++;

$QryInsertStats = substr($QryInsertStats, 0, -1);

doquery ( $QryInsertStats , 'statpoints');
}*/

// On lib�re de la m�moire en d�truisant la variable
// It frees up memory by destroying the variable
unset($AllyStats);

/*************************************************************************************/
/*                    Fin de la mise du classement des alliances                     */
/*                      Finish to set the alliance rankings                         */
/*************************************************************************************/

$game_config['stats'] = $StatDate;

$mtime        = microtime();
$mtime        = explode(" ", $mtime);
$mtime        = $mtime[1] + $mtime[0];

// Heure de la fin de l'actualisation
// Finish time of the update
$endtime      = $mtime;

// Dur�e de l'actualisation
// Duration of update
$LengthTime = round($endtime - $starttime, 2);

// On r�cup�re le pique de m�moire
// It retrieves the peak memory
$MemoryPeak = round(memory_get_peak_usage() / 1024, 1);

// On r�cup�re la quantit� m�moire apr�s l'actualisation
// It gets much memory after the update
$MemoryFinish = round(memory_get_usage() / 1024, 1);

$AdminMessage = <<<EOF
<p>{$lang['adm_done']}</p>
{$lang['adm_delay_actu_stats']} {$LengthTime} secondes{$lang['adm_new_line']}
{$lang['adm_mem_start']} {$MemoryInitial} {$lang['adm_units']}{$lang['adm_new_line']}
{$lang['adm_peak_mem']} {$MemoryPeak} {$lang['adm_units']}{$lang['adm_new_line']}
{$lang['adm_mem_finish']} {$MemoryFinish} {$lang['adm_units']}{$lang['adm_new_line']}
EOF;
AdminMessage ( $AdminMessage, $lang['adm_stat_title'] );

} else
{
AdminMessage ( $lang['sys_noalloaw'], $lang['sys_noaccess'] );
}
?>