<?php

include_once('Database.php');
include_once('Config.php');
include_once('Global.php');
include_once('Run.php');
include_once('PrefixMultiplier.php');

session_start();

class Application
{
  var $NoFullPage = false;

  function Link($URL)
  {
    return($this->Config['BaseURL'].$URL);
  }

  function Run()
  {

  }
}

class MyApplication extends Application
{
  var $Database;
  var $Config;

  function __construct()
  {
  }

  function ShowMenu()
  {
    $Output = '<div>'.
      //'<a href="'.$this->Link('/tance/').'">Tance</a> '.
      //'<a href="'.$this->Link('/skoly/').'">Školy</a> '.
      //'<a href="'.$this->Link('/seznamka/').'">Seznamka</a> '.
      '</div>';
    return($Output);
  }

  function ProcessURL()
  {
    if(array_key_exists('REDIRECT_QUERY_STRING', $_SERVER))
      $PathString = $_SERVER['REDIRECT_QUERY_STRING'];
    else $PathString = '';
    if(substr($PathString, -1, 1) == '/') $PathString = substr($PathString, 0, -1);
    $PathItems = explode('/', $PathString);
    if(array_key_exists('REQUEST_URI', $_SERVER) and (strpos($_SERVER['REQUEST_URI'], '?') !== false))
      $_SERVER['QUERY_STRING'] = substr($_SERVER['REQUEST_URI'], strpos($_SERVER['REQUEST_URI'], '?') + 1);
    else $_SERVER['QUERY_STRING'] = '';
    parse_str($_SERVER['QUERY_STRING'], $_GET);
    return($PathItems);
  }

  // Query: text from name
  // Page: index of page, one page is 30 items
  // Category: '', all, men, woman, kids, families, teams
  // TeamId: id of team
  // Count: number of items per page, default 30
  function QueryRunners($Category, $Page, $TeamId, $Query = null, $StartNumber = null, $Count = null)
  {
    $URL = 'http://leaderboard.teribear.cz/Home/GetRunners?category='.$Category.'&page='.$Page.'&teamId='.$TeamId;
    if ($Count != null) $URL .= '&count='.$Count;
    if ($Query != null) $URL .= '&query='.$Query;
    if ($Category != null) $URL .= '&startNumber='.$StartNumber;
    $Content = file_get_contents($URL);
    $JSON = json_decode($Content, true);
    //print_r($JSON);
    return $JSON;
  }

  function ShowTeamUpdate()
  {
    $Time = time();
    $DbResult = $this->Database->query('SELECT * FROM Team');
    while ($Team = $DbResult->fetch_assoc())
    {
      echo('Checking team '.$Team['WebId'].'...');
      $Runners = $this->QueryRunners('teams', 0, $Team['WebId']);
      foreach ($Runners['items'] as $Runner)
      {
        //print_r($Runner);
        $RunnerItem = new Runner();
        $RunnerItem->Database = $this->Database;
        $RunnerItem->Name = $Runner['Name'];
        $RunnerItem->ChipNumber = $Runner['ChipNumber'];
        if ($Runner['Type'] == 'man') $RunnerItem->Gender = 1;
        if ($Runner['Type'] == 'woman') $RunnerItem->Gender = 2;
        $RunnerItem->Team = $Team['Id'];
        $RunnerItem->AddIfNotExist();

        $DbResult = $this->Database->query('SELECT * FROM RunnerStat WHERE Runner='.$RunnerItem->Id.' ORDER BY TIME DESC LIMIT 1');
        if ($DbResult->num_rows > 0)
        {
          $RunnerStat = $DbResult->fetch_assoc();
          if ($RunnerStat['Distance'] != $Runner['OverallDistance'])
          {
            $this->Database->insert('RunnerStat', array(
            'Time' => TimeToMysqlDateTime($Time),
            'Runner' => $RunnerItem->Id,
            'Distance' => $Runner['OverallDistance'],
            'Rank' => $Runner['Pos'],
            'Money' => $Runner['Money'],
          ));
          }
        } else
        {
          $this->Database->insert('RunnerStat', array(
            'Time' => TimeToMysqlDateTime($Time),
            'Runner' => $RunnerItem->Id,
            'Distance' => $Runner['OverallDistance'],
            'Rank' => $Runner['Pos'],
            'Money' => $Runner['Money'],
          ));
        }
      }
      echo("<br/>\n");
    }
  }

  function ShowTeam()
  {
    $Output = '';

    $TeamId = 1;
    if ((count($this->PathItems) > 0) and ($this->PathItems[count($this->PathItems) - 1] != ''))
      $TeamId = $this->PathItems[count($this->PathItems) - 1];
    if (!is_numeric($TeamId)) die('TeamId needs to be numeric');

    $DbResult = $this->Database->query('SELECT * FROM Team WHERE Id='.$TeamId);
    $DbRow = $DbResult->fetch_assoc();
    $Output .= '<h4 style="text-align: center;">Team '.$DbRow['Name'].'</h4></br>';


    $Where = 'Team='.$TeamId;

    $DbResult = $this->Database->query('SELECT COUNT(*) FROM `Runner` WHERE '.$Where);
    $DbRow = $DbResult->fetch_row();
    $PageList = GetPageList($DbRow[0]);

    $Gender = array('', 'Male', 'Female');
    $Output .= '<div id="list_content">';
    $Output .= $PageList['Output'];
    $TableColumns = array(
      array('Name' => 'Name', 'Title' => 'Name'),
      array('Name' => 'Gender', 'Title' => 'Gender'),
      array('Name' => 'Distance', 'Title' => 'Distance'),
      array('Name' => 'Money', 'Title' => 'Money'),
      array('Name' => 'Rank', 'Title' => 'Rank'),
      array('Name' => 'Time', 'Title' => 'Last change'),
    );
    $Order = GetOrderTableHeader($TableColumns, 'Distance', 1);
    $Output .= '<table class="WideTable">';
    $Output .= $Order['Output'];
    $DbResult = $this->Database->select('Runner', '*, '.
      '(SELECT RunnerStat.Distance FROM RunnerStat WHERE RunnerStat.Runner=Runner.Id ORDER BY Time DESC LIMIT 1) AS Distance'.
      ', (SELECT RunnerStat.Money FROM RunnerStat WHERE RunnerStat.Runner=Runner.Id ORDER BY Time DESC LIMIT 1) AS Money'.
      ', (SELECT RunnerStat.Time FROM RunnerStat WHERE RunnerStat.Runner=Runner.Id ORDER BY Time DESC LIMIT 1) AS Time'.
      ', (SELECT RunnerStat.Rank FROM RunnerStat WHERE RunnerStat.Runner=Runner.Id ORDER BY Time DESC LIMIT 1) AS Rank',
      $Where.$Order['SQL'].$PageList['SQLLimit']);
    while($MeetItem = $DbResult->fetch_assoc())
    {
      $Output .= '<tr>'.
        '<td><a href="'.$this->Link('/runner/'.$MeetItem['Id'].'/').'">'.$MeetItem['Name'].'</a></td>'.
        '<td>'.$Gender[$MeetItem['Gender']].'</td>'.
        '<td>'.$MeetItem['Distance'].'</td>'.
        '<td>'.$MeetItem['Money'].'</td>'.
        '<td>'.$MeetItem['Rank'].'</td>'.
        '<td>'.HumanDateTime(MysqlDateTimeToTime($MeetItem['Time'])).'</td>'.
        '</tr>';
    }
    $Output .= '</table>';
    $Output .= $PageList['Output'];
    $Output .= '</div>';

    return($Output);
  }

  function ShowRunner()
  {
    $PrefixMultiplier = new PrefixMultiplier();
    $Output = '';

    $RunnerId = 1;
    if ((count($this->PathItems) > 0) and ($this->PathItems[count($this->PathItems) - 1] != ''))
      $RunnerId = $this->PathItems[count($this->PathItems) - 1];
    if (!is_numeric($RunnerId)) die('Runner id needs to be numeric');

    $DbResult = $this->Database->query('SELECT * FROM Runner WHERE Id='.$RunnerId);
    $DbRow = $DbResult->fetch_assoc();
    $Output .= '<h4 style="text-align: center;">Runner '.$DbRow['Name'].'</h4></br>';


    $Where = 'Runner='.$RunnerId;

    $DbResult = $this->Database->query('SELECT COUNT(*) FROM `RunnerStat` WHERE '.$Where);
    $DbRow = $DbResult->fetch_row();
    $PageList = GetPageList($DbRow[0]);

    $Output .= '<div id="list_content">';
    $Output .= $PageList['Output'];
    $TableColumns = array(
      array('Name' => 'Time', 'Title' => 'Time'),
      array('Name' => 'Distance', 'Title' => 'Distance [km]'),
      array('Name' => 'Money', 'Title' => 'Money [Kč]'),
      array('Name' => 'Rank', 'Title' => 'Rank'),
      array('Name' => 'Duration', 'Title' => 'Duration'),
      array('Name' => 'Length', 'Title' => 'Length [km]'),
      array('Name' => 'Speed', 'Title' => 'Speed [km/hour]'),
    );
    $Order = GetOrderTableHeader($TableColumns, 'Time', 1);
    $Output .= '<table class="WideTable">';
    $Output .= $Order['Output'];
    $DbResult = $this->Database->query('SELECT *'.
      ', (SELECT RunnerStat.Time - B.Time FROM RunnerStat AS B WHERE (B.Time < RunnerStat.Time) AND (B.Runner = RunnerStat.Runner) ORDER BY B.Time DESC LIMIT 1) AS Duration'.
      ', (SELECT RunnerStat.Distance - B.Distance FROM RunnerStat AS B WHERE (B.Time < RunnerStat.Time) AND (B.Runner = RunnerStat.Runner) ORDER BY B.Time DESC LIMIT 1) AS Length'.
      ', NULL AS Speed'.
      ' FROM RunnerStat'.
      ' WHERE '.$Where.$Order['SQL'].$PageList['SQLLimit']);
    while($MeetItem = $DbResult->fetch_assoc())
    {
      $Output .= '<tr>'.
        '<td>'.HumanDateTime(MysqlDateTimeToTime($MeetItem['Time'])).'</td>'.
        '<td>'.$MeetItem['Distance'].'</td>'.
        '<td>'.$MeetItem['Money'].'</td>'.
        '<td>'.$MeetItem['Rank'].'</td>';
      if ($MeetItem['Duration'] != null) $Output .= '<td>'.$PrefixMultiplier->Add($MeetItem['Duration'], '', 4, 'Time').'</td>';
        else $Output .= '<td>&nbsp;</td>';
      $Output .= '<td>'.$MeetItem['Length'].'</td>';
      if ($MeetItem['Duration'] > 0) $Output .= '<td>'.$PrefixMultiplier->Add($MeetItem['Length'] / $MeetItem['Duration'] * 3600, '', 4, 'Decimal').'</td>';
        else $Output .= '<td>&nbsp;</td>';
      $Output .= '</tr>';
    }
    $Output .= '</table>';
    $Output .= $PageList['Output'];
    $Output .= '</div>';

    return($Output);
  }

  function ShowPage($Content)
  {
    global $Config;

    $Output = '<?xml version="1.0" encoding="'.$this->Config['Encoding'].'"?>'."\n".
      '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">'.
      '<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="cs" lang="cs">'.
      '<head>'.
      '<link rel="stylesheet" href="'.$this->Link('/style.css').'" type="text/css" media="all" />'.
      '<meta http-equiv="content-type" content="application/xhtml+xml; charset='.$this->Config['Encoding'].'" />'.
      '<script src="'.$this->Link('/jquery.js').'"></script>';
    $Output .= '<title>Teribear stats</title>'.
      '</head><body>';
    $Output .= $Content;
    $Output .= '<br/><div class="footer">Contect: <a href="mailto:'.$Config['Contact'].'">'.$Config['Contact'].'</a> '.
       '<a href="https://svn.zdechov.net/trac/teribear/">Source code</a></div>';
    $Output .= '</body></html>';
    return($Output);
  }

  function Run()
  {
    global $Config;

    $this->Config = $Config;
    $this->Database = new Database();
    $this->Database->Connect($this->Config['Database']['Host'], $this->Config['Database']['User'],
      $this->Config['Database']['Password'], $this->Config['Database']['Database']);
    $this->Database->Prefix = $this->Config['Database']['Prefix'];
    $this->Database->charset($this->Config['Database']['Charset']);
    $this->PathItems = $this->ProcessURL();

    $Output = '';

    if(count($this->PathItems) > 0)
    {
      if($this->PathItems[0] == 'team-update') $Output .= $this->ShowTeamUpdate();
      if($this->PathItems[0] == 'runner') $Output .= $this->ShowRunner();
      else $Output .= $this->ShowTeam();
    } else $Output .= $this->ShowTeam();
    if (!$this->NoFullPage)
    {
      $Output = $this->ShowMenu().$Output;
      echo($this->ShowPage($Output));
    } else echo($Output);
  }
}

$Application = new MyApplication();
$Application->Run();
