<?php

class PageAvailability extends Page
{
  var $FullTitle = 'Dostupnost aktivních prvků sítě';
  var $ShortTitle = 'Dostupnost sítě';
  var $ParentClass = 'PageNetwork';
  var $PeriodCount = 24;
  var $Period = array(
    array('Column' => 'Hour', 'Title' => 'Hodina', 'Period' => 1, 'MinPercent' => 100),
    array('Column' => 'Day', 'Title' => 'Den', 'Period' => 24, 'MinPercent' => 98),
    array('Column' => 'Week', 'Title' => 'Týden', 'Period' => 168, 'MinPercent' => 96), // 24 * 7
    array('Column' => 'Month', 'Title' => 'Měsíc', 'Period' => 720, 'MinPercent' => 93), // 24 * 30
    array('Column' => 'Year', 'Title' => 'Rok', 'Period' => 8760, 'MinPercent' => 92), // 365 * 24
    //array('Column' => 'TenYear', 'Title' => 'Desetiletí', 'Period' => 87600), // 365 * 24 * 10
  );

  function Show()
  {
    $Output = '<div style="font-size: small;">Dostupnost zařízení se kontroluje jednou za minutu. '.
    'Hodnoty u delších intervalů nemusí odpovídat skutečnosti, protože záznam byl spuštěn až v průběhu těchto intervalu.'.
    'Všechny prvky sítě jsou kontrolovány ze směrovačů, tj. pokud vypadne některé blízké zařízení, všechny další zařízení propojené přes něj jsou také nedostupné.</div>';
    $Output .= '<div align="center">';
    if(array_key_exists('Period', $_GET)) $Output .= 'Perioda: <a href="?">Smíšená</a> ';
      else $Output .= 'Perioda: <a href="?"><strong>Smíšená</strong></a> ';
    foreach($this->Period as $Index => $Period)
    {
      if(array_key_exists('Period', $_GET) and ($_GET['Period'] == $Index))
      $Output .= ' <a href="?Period='.$Index.'"><strong>'.$Period['Title'].'</strong></a>';
      else $Output .= ' <a href="?Period='.$Index.'">'.$Period['Title'].'</a>';
    }
    $Output .= '<br/>';

    $HostTypeList = array();
    $DbResult = $this->Database->select('NetworkDeviceType', '*');
    while($DbRow = $DbResult->fetch_assoc())
      $HostTypeList[$DbRow['Id']] = $DbRow;

    $DbResult = $this->Database->query('SELECT COUNT(*) FROM `NetworkInterface` '.
      'JOIN `NetworkDevice` ON `NetworkInterface`.`Device` = `NetworkDevice`.`Id` WHERE `NetworkDevice`.`Used` = 1 AND `NetworkDevice`.`PermanentOnline`=1');
    $DbRow = $DbResult->fetch_row();
    $PageList = GetPageList($DbRow[0]);

    $Output .= '<br />';

    $Output .= $PageList['Output'];
    $Output .= '<table class="WideTable" style="font-size: small;">';

    $TableColumns = array(
      array('Name' => 'Name', 'Title' => 'Jméno'),
    );

    $Join = '';
    $Columns = '';
    if(!array_key_exists('Period', $_GET))
    {
      foreach($this->Period as $Index => $Period)
      {
        $TableColumns[] = array('Name' => $Period['Column'], 'Title' => $Period['Title'].' [%]');
        $Join .= ' LEFT JOIN (SELECT `NetworkInterfaceStat`.`NetworkInterface`, (SUM(`NetworkInterfaceStat`.`PingCount`) / '.
        $Period['Period'].' / 60 * 100) AS `Percent` FROM `NetworkInterfaceStat` WHERE (`Time` > DATE_SUB(NOW(), INTERVAL '.
        ($Period['Period'] + 1).' HOUR)) AND (`Time` < DATE_SUB(NOW(), INTERVAL 1 HOUR)) GROUP BY `NetworkInterface`) AS `Period'.
        $Period['Column'].'` ON `Period'.$Period['Column'].'`.`NetworkInterface` = `NetworkInterface`.`Id`';
        $Columns .= ', `Period'.$Period['Column'].'`.`Percent` AS `'.$Period['Column'].'`';
      }
    } else
    {
      if(array_key_exists($_GET['Period'], $this->Period))
      {
        for($I = 0; $I < $this->PeriodCount; $I++)
        {
          $Period = $this->Period[$_GET['Period']];
          $TableColumns[] = array('Name' => 'Period'.$I.'Column', 'Title' => $I.' [%]');
          $Join .= ' LEFT JOIN (SELECT `NetworkInterfaceStat`.`NetworkInterface`, (SUM(`NetworkInterfaceStat`.`PingCount`) / '.
          $Period['Period'].' / 60 * 100) AS `Percent` FROM `NetworkInterfaceStat` WHERE (`Time` > DATE_SUB(NOW(), INTERVAL '.
          ($Period['Period'] * ($I + 1) + 1).' HOUR)) AND (`Time` < DATE_SUB(NOW(), INTERVAL '.($Period['Period'] * $I + 1).
          ' HOUR)) GROUP BY `NetworkInterface`) AS `Period'.$I.'` ON `Period'.$I.'`.`NetworkInterface` = `NetworkInterface`.`Id`';
          $Columns .= ', `Period'.$I.'`.`Percent` AS `Period'.$I.'Column`';
        }
      } else die('Neznámé id');
    }

    $Order = GetOrderTableHeader($TableColumns, 'Name', 0);
    $Output .= $Order['Output'];

    $DbResult2 = $this->Database->query('SELECT `NetworkInterface`.`Name` AS `InterfaceName`'.$Columns.', '.
      'CONCAT(`NetworkDevice`.`Name`, "-", `NetworkInterface`.`Name`) AS `Name`, `NetworkDevice`.`Name` AS `DeviceName` FROM `NetworkInterface` '.
      $Join.' JOIN `NetworkDevice` ON `NetworkInterface`.`Device` = `NetworkDevice`.`Id` WHERE `NetworkDevice`.`Used` = 1 AND `NetworkDevice`.`PermanentOnline`=1'.
      $Order['SQL'].$PageList['SQLLimit']);
    while($Interface = $DbResult2->fetch_assoc())
    {
      $Name = $Interface['DeviceName'];
      if($Interface['InterfaceName'] != '') $Name .= '-'.$Interface['InterfaceName'];
      $Output .= '<tr><td>'.$Name.'</td>';
      if(!array_key_exists('Period', $_GET))
      {
        foreach($this->Period as $Period)
        {
          if($Interface[$Period['Column']] >= $Period['MinPercent']) $Color = ' color: green;';
            else $Color = 'color: red';
          $Output .= '<td style="text-align: right;'.$Color.'">'.sprintf('%01.2f', $Interface[$Period['Column']]).'</td>';
        }
      } else
      {
        if(array_key_exists($_GET['Period'], $this->Period))
        {
          for($I = 0; $I < $this->PeriodCount; $I++)
          {
            if($Interface['Period'.$I.'Column'] >= $Period['MinPercent']) $Color = ' color: green;';
              else $Color = 'color: red';
            $Output .= '<td style="text-align: center;'.$Color.'">'.sprintf('%01.2f', $Interface['Period'.$I.'Column']).'</td>';
          }
        } else die('Neznámé id');
      }
      $Output .= '</tr>';
    }
    $Output .= '</table></div>';
    $Output .= $PageList['Output'];
    return($Output);
  }
}
