<?php

class ModuleMeet extends Module
{
  function __construct($System)
  {
    parent::__construct($System);
    $this->Name = 'Meet';
    $this->Version = '1.0';
    $this->Creator = 'Chronos';
    $this->License = 'GNU/GPL';
    $this->Description = 'List of dance meet items';
    $this->Dependencies = array();
    $this->RSSChannels = array();
  }

  function Start(): void
  {
    $this->System->RegisterPage(['seznamka'], 'PageMeetList');
    $this->System->RegisterPage(['seznamka', 'inzerat'], 'PageMeetItem');
    $this->System->RegisterPage(['seznamka', 'aktualizace'], 'PageMeetUpdate');
    $this->System->RegisterPage(['seznamka', 'rss'], 'PageMeetRss');
    Core::Cast($this->System)->RegisterMenuItem('/seznamka', 'Seznamka');
  }
}

class PageMeetList extends Page
{
  function __construct($System)
  {
    parent::__construct($System);
    $this->Title = 'Seznamka';
    $this->Description = 'Taneční seznamka';
  }

  function Show(): string
  {
    global $Config;

    $Filter = new Filter();
    $Filter->Items = array(
      array('Name' => 'pohlavi', 'Type' => 'Enumeration', 'DbName' => 'Gender', 'Title' => 'Pohlaví',
        'States' => array(0 => 'Obě', 1 => 'Muži', 2 => 'Ženy')),
      array('Name' => 'name', 'Type' => 'String', 'DbName' => 'Name', 'Title' => 'Jméno'),
      array('Name' => 'vek', 'Type' => 'Integer', 'DbName' => 'Age', 'Title' => 'Věk', 'Units' => 'let'),
      array('Name' => 'vyska', 'Type' => 'Integer', 'DbName' => 'Height', 'Title' => 'Výška', 'Units' => 'cm'),
      array('Name' => 'vaha', 'Type' => 'Integer', 'DbName' => 'Weight', 'Title' => 'Váha', 'Units' => 'Kg'),
      array('Name' => 'message', 'Type' => 'String', 'DbName' => 'Message', 'Title' => 'Zpráva'),
      array('Name' => 'location', 'Type' => 'String', 'DbName' => 'Location', 'Title' => 'Umístění'),
      array('Name' => 'source', 'Type' => 'String', 'DbName' => 'SourceName', 'Title' => 'Zdroj'),
    );

    $Output = '';
    if (array_key_exists('lvm', $_GET) and ($_GET['lvm'] == 'seznam'))
    {
      $this->RawPage = true;
    } else {
      $Output .= '<div class="title">Inzeráty</div>';
    }

    $Output .= $Filter->GetOutput($this->System->Link('/seznamka/'));
    $Where = $Filter->GetWhere($this->Database);

    $DbResult = $this->Database->query('SELECT COUNT(*) FROM (SELECT *, '.
      '(SELECT MeetSource.Name FROM MeetSource WHERE MeetSource.Id = MeetItem.Source) AS SourceName FROM `MeetItem`) AS T '.
      'WHERE '.GetDefaultMeetFilter('T').' AND '.$Where);
    $DbRow = $DbResult->fetch_row();
    $PageList = GetPageList($DbRow[0]);

    $Gender = array('', 'Muž', 'Žena');
    $Output .= '<div id="list_content">';
    $Output .= $PageList['Output'];
    $TableColumns = array(
      array('Name' => 'Time', 'Title' => 'Čas'),
      array('Name' => 'Name', 'Title' => 'Jméno'),
      array('Name' => 'Height', 'Title' => 'Výška'),
      array('Name' => 'Age', 'Title' => 'Věk'),
      array('Name' => 'Weight', 'Title' => 'Váha'),
      array('Name' => 'Location', 'Title' => 'Umístění'),
      array('Name' => 'Gender', 'Title' => 'Pohlaví'),
      array('Name' => 'Message', 'Title' => 'Zpráva'),
      array('Name' => 'Source', 'Title' => 'Zdroj'),
      array('Name' => '', 'Title' => 'Detail'),
    );
    $Order = GetOrderTableHeader($TableColumns, 'Time', 1);
    $Output .= '<table class="WideTable">';
    $Output .= $Order['Output'];
    $DbResult = $this->Database->query('SELECT * FROM (SELECT *, (SELECT MeetSource.Name FROM MeetSource WHERE MeetSource.Id = MeetItem.Source) AS SourceName, '.
      '(SELECT MeetSource.URL FROM MeetSource WHERE MeetSource.Id = MeetItem.Source) AS SourceURL FROM MeetItem) AS T WHERE '.GetDefaultMeetFilter('T').' AND '.
      $Where.$Order['SQL'].$PageList['SQLLimit']);
    while ($MeetItem = $DbResult->fetch_assoc())
    {
      $Output .= '<tr>'.
        '<td>'.HumanDate(MysqlDateToTime($MeetItem['Time'])).'</td>'.
        '<td>'.$MeetItem['Name'].'</td>'.
        '<td>'.$MeetItem['Height'].'</td>'.
        '<td>'.$MeetItem['Age'].'</td>'.
        '<td>'.$MeetItem['Weight'].'</td>'.
        '<td>'.$MeetItem['Location'].'</td>'.
        '<td>'.$Gender[$MeetItem['Gender']].'</td>'.
        '<td>'.$MeetItem['Message'].'</td>'.
        '<td><a href="'.$MeetItem['SourceURL'].'">'.$MeetItem['SourceName'].'</a></td>'.
        '<td><a href="'.$this->System->Link('/seznamka/inzerat/'.$MeetItem['Id']).'">Ukázat</a></td>';
      $Output .= '</tr>';
    }
    $Output .= '</table>';
    $Output .= $PageList['Output'];
    $Output .= '</div>';
    if (array_key_exists('lvm', $_GET) and ($_GET['lvm'] == 'seznam'))
    {
    }
    else
    {
      $Output .= '<div><a href="'.$this->System->Link('/seznamka/rss/').'"><img src="'.$this->System->Link('/images/rss20.png').'" alt="rss20"/></a></div>';

      $Output .= '<div style="text-align: center;">Vložit nový inzerát: ';
      $Output .= '<form style="display:inline;"><select name="insert" id="insert" onchange="">';
      $DbResult = $this->Database->select('MeetSource', 'InsertURL, Name, Id', 'InsertURL != ""');
      while ($DbRow = $DbResult->fetch_assoc())
      {
        $Output .= '<option value="'.$DbRow['Id'].'" onclick="window.open(\''.
          $DbRow['InsertURL'].'\',\'_blank\',\'\')" onselect="window.open(\''.
          $DbRow['InsertURL'].'\',\'_blank\',\'\')">'.$DbRow['Name'].'</option>';
      }
      $Output .= '</select></form></div>';
    }
    return $Output;
  }
}

class PageMeetUpdate extends Page
{
  function __construct($System)
  {
    parent::__construct($System);
    $this->Title = 'Aktualizace seznamky';
    $this->Description = 'Aktualizace taneční seznamky';
  }

  function Show(): string
  {
    $MeetSources = new MeetSources();
    $MeetSources->Database = $this->Database;
    if (array_key_exists('i', $_GET)) $Output = $MeetSources->Parse($_GET['i']);
      else $Output = $MeetSources->Parse();
    return $Output;
  }
}

class PageMeetItem extends Page
{
  function __construct($System)
  {
    parent::__construct($System);
    $this->Title = 'Inzerát';
    $this->Description = 'Inzerát taneční seznamky';
  }

  function Show(): string
  {
    $Output = '';
    if (count($this->System->PathItems) > 2)
    {
      $id = $this->System->PathItems[2] * 1;
    } else return 'Položka nenalezena';
    if (Core::Cast($this->System)->IsAdmin())
    {
      if (array_key_exists('hide', $_GET)) $this->Database->update('MeetItem', 'Id='.$id, array('Hidden' => 1));
      if (array_key_exists('unhide', $_GET)) $this->Database->update('MeetItem', 'Id='.$id, array('Hidden' => 0));
    }

    $Output .= '<div class="title">Inzerát</div>';
    $Gender = array('', 'Muž', 'Žena');
    $DbResult = $this->Database->select('MeetItem', '*, (SELECT MeetSource.Name FROM MeetSource WHERE MeetSource.Id = MeetItem.Source) AS SourceName, '.
      '(SELECT MeetSource.URL FROM MeetSource WHERE MeetSource.Id = MeetItem.Source) AS SourceURL, '.GetDefaultMeetFilter().' AS Filter', 'Id='.$id);
    if ($DbResult->num_rows > 0)
    {
      $MeetItem = $DbResult->fetch_assoc();
      if (($MeetItem['Filter'] == '0') and !Core::Cast($this->System)->IsAdmin())
        return 'Položka nenalezena';
      if ($MeetItem['Link'] != '') $Link = '<a href="'.$MeetItem['Link'].'">Odkaz</a>';
        else $Link = '';
      $Output .= '<table class="ItemTable">'.
        '<tr><th>Čas</th><td>'.HumanDate(MysqlDateToTime($MeetItem['Time'])).'</td></tr>'.
        '<tr><th>Pohlaví</th><td>'.$Gender[$MeetItem['Gender']].'</td></tr>'.
        '<tr><th>Jméno</th><td>'.$MeetItem['Name'].'</td></tr>'.
        '<tr><th>Výška</th><td>'.$MeetItem['Height'].'</td></tr>'.
        '<tr><th>Věk</th><td>'.$MeetItem['Age'].'</td></tr>'.
        '<tr><th>Váha</th><td>'.$MeetItem['Weight'].'</td></tr>'.
        '<tr><th>Umístění</th><td>'.$MeetItem['Location'].'</td></tr>'.
        '<tr><th>Email</th><td>'.$MeetItem['Email'].'</td></tr>'.
        '<tr><th>Telefón</th><td>'.$MeetItem['Phone'].'</td></tr>'.
        '<tr><th>Zpráva</th><td>'.$MeetItem['Message'].'</td></tr>'.
        '<tr><th>Původní stránka</th><td>'.$Link.'</td></tr>'.
        '<tr><th>Zdroj</th><td><a href="'.$MeetItem['SourceURL'].'">'.$MeetItem['SourceName'].'</a></td></tr>';
      $Output .= '</table>';

      $Output .= '<div style="margin-top: 10pt; text-align: center;">Vložit nový inzerát: ';
      $Output .= '<form style="display:inline;"><select name="insert" id="insert" onchange="">';
      $DbResult = $this->Database->select('MeetSource', 'InsertURL, Name, Id', 'InsertURL != ""');
      while ($DbRow = $DbResult->fetch_assoc())
      {    
        $Output .= '<option value="'.$DbRow['Id'].'" onclick="window.open(\''.
          $DbRow['InsertURL'].'\',\'_blank\',\'\')">'.$DbRow['Name'].'</option>';
      }
      $Output .= '</select></form></div>';

      if (Core::Cast($this->System)->IsAdmin()) 
      {
        if ($MeetItem['Hidden'] == '1')
          $Output .= '<div>Skrytá položka <a href="?unhide">Zviditelnit</a></div>';
          else $Output .= '<div>Viditelná položka <a href="?hide">Skrýt</a></div>';
      }
    } else $Output .= 'Položka nenalezena';
    return $Output;
  }
}

class PageMeetRss extends Page
{
  function __construct($System)
  {
    parent::__construct($System);
    $this->Title = 'RSS inzeráty seznamky';
    $this->Description = 'RSS kanál taneční seznamky';
  }

  function Show(): string
  {
    global $Config;

    $this->RawPage = true;
    $RSS = new RSS();
    $RSS->Title = 'Taneční seznamka';
    $RSS->Description = '';
    $RSS->Link = $this->System->AbsoluteLink('/seznamka/');

    $DbResult = $this->Database->query('SELECT *, (SELECT MeetSource.Name FROM MeetSource WHERE MeetSource.Id = MeetItem.Source) AS SourceName, '.
      '(SELECT MeetSource.URL FROM MeetSource WHERE MeetSource.Id = MeetItem.Source) AS SourceURL FROM MeetItem WHERE '.
      GetDefaultMeetFilter().' ORDER BY `Time` DESC LIMIT 30');
    while ($MeetItem = $DbResult->fetch_assoc())
    {
      $Title = $MeetItem['Name'];
      if ($MeetItem['Age'] != '') $Title .= ', '.$MeetItem['Age'].' let';
      if ($MeetItem['Weight'] != '') $Title .= ', '.$MeetItem['Height'].' cm';
      if ($MeetItem['Location'] != '') $Title .= ', '.$MeetItem['Location'];
      $Description = $MeetItem['Message']."<br/>\n";
      if ($MeetItem['Email'] != '') $Description .= '<br/>Email: '.$MeetItem['Email'];
      if ($MeetItem['Phone'] != '') $Description .= '<br/>Telefon: '.$MeetItem['Phone'];
      if ($MeetItem['Age'] != '') $Description .= '<br/>Věk: '.$MeetItem['Age'].' let';
      if ($MeetItem['Height'] != '') $Description .= '<br/>Výška: '.$MeetItem['Height'].' cm';
      if ($MeetItem['Weight'] != '') $Description .= '<br/>Váha: '.$MeetItem['Weight'].' kg';
      $Description .= '<br/>Zdroj: <a href="'.$MeetItem['SourceURL'].'">'.$MeetItem['SourceName'].'</a>';
      $Time = MysqlDateTimeToTime($MeetItem['Time']);
      $TimeImport = MysqlDateTimeToTime($MeetItem['TimeImport']);
      // Append time part of TimeImport time to item time so new items will appear in correct time order even if item doesn't have time part specified
      if (TimeToMysqlTime($Time) == '00:00:00')
      {
        $Time = MysqlDateTimeToTime(TimeToMysqlDate($Time).' '.TimeToMysqlTime($TimeImport));
      }
      $RSS->Items[] = array(
        'Title' => $Title,
        'Description' => $Description,
        'Time' => $Time,
        'Link' => $this->System->AbsoluteLink('/seznamka/inzerat/'.$MeetItem['Id'].'/'),
      );
    }

    return $RSS->Generate();
  }
}
