<?php

function HumanDate(?string $Time): string
{
  return date('j.n.Y', $Time);
}

function GetMicrotime(): float
{
  list($Usec, $Sec) = explode(' ', microtime());
  return (float)$Usec + (float)$Sec;
} 

function MakeLink(string $Target, string $Title): string
{
  return '<a href="'.$Target.'">'.$Title.'</a>';
}

function Table(array $Table): string
{
  $Result = '<table class="BasicTable">';
  if (array_key_exists('Header', $Table))
  {
    $Result .= '<tr>';
    foreach ($Table['Header'] as $Item)
      $Result .= '<th>'.$Item.'</th>';
    $Result .= '</tr>';
  }
  foreach ($Table['Rows'] as $Row)
  {
    $Result .= '<tr>';
    foreach ($Row as $Index => $Item)
    {
      if ($Index == 0) $Class = ' class="Header"'; else $Class = '';
      $Result .= '<td'.$Class.' style="width: '.(floor(100 / count($Row))).'%">'.$Item.'</td>';
    }
    $Result .= '</tr>';
  }
  $Result .= '</table>';
  return $Result;
}

function ShowEditTable(string $ClassName, array $Values): string
{
  global $Classes, $Types;
  $Class = $Classes[$ClassName];
  $Table = array(
    'Header' => array('Položka', 'Hodnota'),
    'Rows' => array(),
  );

  foreach ($Class as $Index => $Item)
  {
    if (!array_key_exists($Index, $Values)) $Values[$Index] = $Item['Default'];
    switch ($Item['Type'])
    {
      case 'Boolean':
        if ($Values[$Index] == 0) $Checked = ''; else $Checked = ' checked="yes"';
        $Edit = '<input type="checkbox" name="'.$Index.'"'.$Checked.'>';
        break;
      case 'String':
        $Edit = '<input type="text" name="'.$Index.'" value="'.$Values[$Index].'">';
        break;
      case 'Integer':
        $Edit = '<input type="text" name="'.$Index.'" value="'.$Values[$Index].'">';
        break;
      default:
        $Edit = 'Neznámý typ';
    }
    array_push($Table['Rows'], array($Item['Caption'], $Edit));
  }
  $Output = '<h3>Tabulka '.$ClassName.'</h3>'.Table($Table).MakeLink('?Operation=Add2', 'Přidat');
  return $Output;
}

function ProcessURL(): array
{
  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;
}

function GetQueryStringArray(string $QueryString): array
{
  $Result = array();
  $Parts = explode('&', $QueryString);
  foreach ($Parts as $Part)
  {
    if ($Part != '')
    {
      if (!strpos($Part, '=')) $Part .= '=';
      $Item = explode('=', $Part);
      $Result[$Item[0]] = $Item[1];
    }
  }
  return $Result;
}

function SetQueryStringArray(array $QueryStringArray): string
{
  $Parts = array();
  foreach ($QueryStringArray as $Index => $Item)
  {
    $Parts[] = $Index.'='.$Item;
  }
  return implode('&amp;', $Parts);
}

function GetRemoteAddress(): string
{
  if (array_key_exists('REMOTE_ADDR', $_SERVER)) $IP = $_SERVER['REMOTE_ADDR'];
  else $IP = '0.0.0.0';
  return $IP;
}
