<?php

include_once(dirname(__FILE__).'/../../includes/zip.lib.php');
include_once(dirname(__FILE__).'/../../includes/dbc.php');
include_once(dirname(__FILE__).'/CreateAddon.php');

//ini_set('memory_limit', '100M');

function CreateZipFromDir(&$Zip, $Path, $ZipPath)
{
  $FileList = scandir($Path);
  foreach ($FileList as $FileName)
  {
    if (file_exists($Path.$FileName) and ($FileName != '.') and ($FileName != '..'))
    {
      if (is_dir($Path.$FileName)) CreateZipFromDir($Zip, $Path.$FileName.'/', $ZipPath.$FileName.'/');
        else $Zip->addFile(file_get_contents($Path.$FileName), $ZipPath.$FileName);
    }
  }
}

function OutputAoWoWToFile($ExportId)
{
  global $System;

  $Output = '';
  $Export = new Export($System);
  $Export->Id = $ExportId;
  $Export->Init();
  if (function_exists('gzcompress'))
  {
    $SaveFilename = $Export->TempDir.'CzAoWoW_SQL.zip';
    $SQLFilename = 'CzAoWoW_SQL.sql';
    $BufferZip = $Export->ExportToAoWoWSQL();
    $ZipFile = new zipfile();
    $ZipFile->addFile($BufferZip, $SQLFilename);
    $Buffer = $ZipFile->file();
    file_put_contents($SaveFilename, $Buffer);
  } else $Output .= ShowMessage('Funkce pro tvorbu Zip souboru není podporována.', MESSAGE_CRITICAL);
  //$Output .= '<script type="text/javascript" language="JavaScript" charset="utf-8">'.
  //  'setTimeout("parent.location.href=\''.$SaveFilename.'\'", 3000)'.
  //  '</script>';

  $Output .= 'Pokud nezačalo stahování, soubor by mělo jít stáhnout pomocí tohoto odkazu: '.
    '<a href="'.$System->Link('/'.$Export->TempDirRelative.'CzAoWoW_SQL.zip').'">'.$SQLFilename.'</a><br />'.
    'Pokud se vám zdá, že filtr na export nefunguje, vymažte si vyrovnávací paměť prohlížeče a zkuste stáhnout soubor znovu.';
  return $Output;
}

function OutputAoWoWToHTML($ExportId)
{
  global $System;

  $Export = new Export($System);
  $Export->Id = $ExportId;

  $Output = 'Vygenerovaný SQL kód: <br /><pre class="SQLCode">'.
     htmlspecialchars($Export->ExportToAoWoWSQL()).
    '</pre>';
  return $Output ;
}

function OutputMangosSQLToFile($ExportId)
{
  global $System;

  $Output = '';
  $Export = new Export($System);
  $Export->Id = $ExportId;
  $Export->Init();
  if (function_exists('gzcompress'))
  {
    $SaveFilename = $Export->TempDir.'CzWoW_SQL.zip';
    $SQLFilename = 'CzWoW_SQL.sql';
    $BufferZip = $Export->ExportToMangosSQL();
    $ZipFile = new zipfile();
    $ZipFile->addFile($BufferZip, $SQLFilename);
    $Buffer = $ZipFile->file();
    file_put_contents($SaveFilename, $Buffer);
  } else $Output .= ShowMessage('Funkce pro tvorbu Zip souboru není podporována.', MESSAGE_CRITICAL);
  //$Output .= '<script type="text/javascript" language="JavaScript" charset="utf-8">'.
  //  'setTimeout("parent.location.href=\''.$SaveFilename.'\'", 3000)'.
  //  '</script>';

  $Output .= 'Pokud nezačalo stahování, soubor by mělo jít stáhnout pomocí tohoto odkazu: '.
    '<a href="'.$System->Link('/'.$Export->TempDirRelative.'CzWoW_SQL.zip').'">'.$SQLFilename.'</a><br />'.
    'Pokud se vám zdá, že filtr na export nefunguje, vymažte si vyrovnávací paměť prohlížeče a zkuste stáhnout soubor znovu.';
  return $Output;
}

function OutputMangosSQLToHTML($ExportId)
{
  global $System;

  $Export = new Export($System);
  $Export->Id = $ExportId;
  $Export->Init();
  $Output = 'Vygenerovaný SQL kód: <br /><pre class="SQLCode">'.
    htmlspecialchars($Export->ExportToMangosSQL()).
    '</pre>';
  return $Output;
}

function OutputAddon($ExportId)
{
  global $System;

  if (function_exists('gzcompress'))
  {
    $Addon = new ExportAddon($System);
    $Addon->Id = $ExportId;
    $Addon->Init();
    $Output = $Addon->MakeAddon();

    $Output .= 'Generování addonu...<br />';
    $SaveFilename = $Addon->TempDir.'CzWoW_Addon-'.$Addon->ClientVersion['Version'].'.zip';
    $Zip = new zipfile();
    CreateZipFromDir($Zip, $Addon->TempDir.'CzWoW/', 'CzWoW/');
    $Zip->addFile(file_get_contents(dirname(__FILE__).'/files/'.$Addon->ClientVersion['Version'].'/CzWoW/OptionsFrame.xml'), 'CzWoW/OptionsFrame.xml');
    $Zip->addFile(file_get_contents(dirname(__FILE__).'/files/'.$Addon->ClientVersion['Version'].'/CzWoW/CzWoW.xml'), 'CzWoW/CzWoW.xml');
    $Zip->addFile(file_get_contents(dirname(__FILE__).'/files/'.$Addon->ClientVersion['Version'].'/CzWoW/CzWoW.toc'), 'CzWoW/CzWoW.toc');
    $Zip->addFile(file_get_contents(dirname(__FILE__).'/files/'.$Addon->ClientVersion['Version'].'/CzWoW/CzWoW.lua'), 'CzWoW/CzWoW.lua');
    $Zip->addFile(file_get_contents(dirname(__FILE__).'/files/'.$Addon->ClientVersion['Version'].'/CzWoW/GameMenuFrame.xml'), 'CzWoW/GameMenuFrame.xml');
    $Zip->addFile(file_get_contents(dirname(__FILE__).'/files/'.$Addon->ClientVersion['Version'].'/CzWoW/Localization.lua'), 'CzWoW/Localization.lua');
    $Buffer = $Zip->file();
    file_put_contents($SaveFilename, $Buffer);
    $Output .= 'Hotovo<br /><br />';
  } else $Output = ShowMessage('Funkce pro tvorbu Zip souboru není podporována.', MESSAGE_CRITICAL);
  //$Output .= '<script type="text/javascript" language="JavaScript" charset="utf-8">'.
  //  'setTimeout("parent.location.href=\''.$SaveFilename.'\'", 3000)'.
  //  '</script>';

  $Output .= 'Soubor ke stažení: '.
    '<a href="'.$System->Link('/'.$Addon->TempDirRelative.'CzWoW_Addon-'.$Addon->ClientVersion['Version'].'.zip').'">CzWoW_Addon-'.$Addon->ClientVersion['Version'].'.zip</a><br />'.
    'Pokud se vám zdá, že filtr na export nefunguje, vymažte si vyrovnávací paměť prohlížeče a zkuste stáhnout soubor znovu.';
  $Output .= '<br /><strong>Použití ve hře</strong><br />Menu addonu ve hře vyvoláte povelem /czwow.';
  return $Output;
}

function OutputXMLToFile($ExportId)
{
  global $System;

  $Output = '';
  $Export = new Export($System);
  $Export->Id = $ExportId;
  $Export->Init();
  if (function_exists('gzcompress'))
  {
    $SaveFilename = $Export->TempDir.'CzWoW_XML.zip';
    $SQLFilename = 'CzWoW_XML.sql';
    $BufferZip = $Export->ExportToXML();
    $ZipFile = new zipfile();
    $ZipFile->addFile($BufferZip, $SQLFilename);
    $Buffer = $ZipFile->file();
    file_put_contents($SaveFilename, $Buffer);
  } else $Output .= ShowMessage('Funkce pro tvorbu Zip souboru není podporována.', MESSAGE_CRITICAL);
  //$Output .= '<script type="text/javascript" language="JavaScript" charset="utf-8">'.
  // 'setTimeout("parent.location.href=\''.$SaveFilename.'\'", 3000)'.
  // '</script>';

  $Output .= 'Pokud nezačalo stahování, soubor by mělo jít stáhnout pomocí tohoto odkazu: '.
    '<a href="'.$System->Link('/'.$Export->TempDirRelative.'CzWoW_XML.zip').'">CzWoW_SQL.zip</a><br />'.
    'Pokud se vám zdá, že filtr na export nefunguje, vymažte si vyrovnávací paměť prohlížeče a zkuste stáhnout soubor znovu.';
  return $Output;
}

function OutputXMLToHTML($ExportId)
{
  global $System;

  $Export = new Export($System);
  $Export->Id = $ExportId;
  $Export->Init();
  $Output = 'Vygenerované XML: <br /><pre class="SQLCode">'.
    htmlspecialchars($Export->ExportToXML()).
    '</pre>';
  return $Output;
}

function OutputDBCToFile($ExportId)
{
  global $System;

  $Export = new Export($System);
  $Export->Id = $ExportId;
  $Export->Init();

  $Output = '';
  $DbResult = $System->Database->query('SELECT `Id` FROM `ExportTask` WHERE (`Export` = '.$ExportId.
      ') AND ((`TimeFinish` < `TimeStart`) OR (`TimeFinish` IS NULL))');
  if ($DbResult->num_rows == 0)
  {
    if (array_key_exists('Regenerate', $_POST))
    {
      $System->Database->query('UPDATE `ExportTask` SET `TimeQueued` = NOW(), `Progress`=0 , `TimeStart` = NULL, `TimeFinish` = NULL WHERE `Export` = '.$ExportId);
      $Output .= ShowMessage('Soubor zařazen znovu ke zpracování do fronty.');
      $System->ModuleManager->Modules['Log']->WriteLog('Zadání úlohy pro vygenerování dbc souboru', LOG_TYPE_DOWNLOAD);
    } else {
      $Output .= '<form action="?Action=View&amp;Tab=7&amp;ExportId='.$ExportId.'" method="post">'.
        '<input type="submit" name="Regenerate" value="'.T('Regenerate').'"/></form><br />';
    }
  }

  $Output .= 'U DBC souborů export textů funguje jinak, protože generování je náročné, '.
    'jsou požadavky zařazovány do fronty a postupně zpracovávány.<br />'.
    'DBC soubory je nutné zabalit do souboru patch-enGB-5.MPQ uvnitř složky "DBFilesClient" a '.
    'hru spouštět přes upravený spouštěcí soubor. Zabalit je můžete pomocí programu '.
    '<a href="../download/mpqediten32.zip">Ladik\'s MPQ Editor</a>. Stav vygenerování '.
    'můžete sledovat na této stránce.<br /><br />';

  $DbResult = $System->Database->query('SELECT * FROM `ExportTask` WHERE `Export` = '.$ExportId);
  if ($DbResult->num_rows == 0)
  {
    $System->Database->query('INSERT INTO `ExportTask` (`Export` ,`TimeQueued`, `Progress` ) VALUES ('.$ExportId.', NOW(), 0)');
    $System->ModuleManager->Modules['Log']->WriteLog('Zadání úlohy pro vygenerování DBC souboru', LOG_TYPE_DOWNLOAD);
    $System->Database->query('UPDATE `ExportTask` SET `Progress`=0 WHERE `Export`='.$Export->Id);
  }

  $DbResult = $System->Database->query('SELECT `TimeFinish` FROM `ExportTask` WHERE `Export` = '.$ExportId);
  $ExportTask = $DbResult->fetch_assoc();
  if ($ExportTask['TimeFinish'] <> '')
  {
    $Output .= '<strong>Souhrný balík: <a href="'.$System->Link('/'.$Export->TempDirRelative.'CzWoW_DBC.zip').'">CzWoW_DBC.zip</a></strong><br/>';
    $DbResult = $System->Database->query('SELECT `Group`.* FROM `ExportGroup` JOIN `Group` ON `Group`.`Id` = `ExportGroup`.`Group` WHERE `ExportGroup`.`Export`='.$Export->Id.' AND `Group`.`DBCFileName` != ""');
    while ($Group = $DbResult->fetch_assoc())
    {
      if (file_exists($Export->TempDir.'dbc/'.$Group['DBCFileName'].'.dbc'))
        $Output .= '<a href="'.$System->Link('/'.$Export->TempDirRelative.'dbc/'.$Group['DBCFileName'].'.dbc').'">'.$Group['DBCFileName'].'.dbc</a><br/>';
    }
  } else {
    $Output .= ShowProgress($Export);

  }
  return $Output;
}

function ShowProgress($Export)
{
  global $System;

  $Output = '';
  $Output .= 'Fronta zpracování exportů. Zobrazuje procenta dokončení: <br /><br />';

  $Output .= '<script src="'.$System->Link('/style/jquery.js').'"></script>'.
    '<script>'.
    '$(document).ready(function() {'.
    'var refreshId = setInterval(function() {'.
    '$("#progress").load("'.$System->Link('/export/progress?i='.$_GET['ExportId']).'"); '.
    '}, 1000);'.
    '});'.
    '</script>';

  $Output .= ' <div id="progress">'.$System->ModuleManager->Modules['Export']->GetTaskProgress($_GET['ExportId'] * 1).
    '</div><br />';

  // Check if process task is running
  $Timeout = 60 * 60 * 2; // two hours
  $DbResult = $System->Database->query('SELECT * FROM `ExportTask` '.
    'LEFT JOIN `Export` ON `Export`.`Id` = `ExportTask`.`Export` '.
    'WHERE ((`Export`.`OutputType` = 9) OR (`Export`.`OutputType` = 10)) AND '.
    '(`TimeFinish` IS NULL) AND (`TimeQueued` < (NOW() - '.$Timeout.'))');
  if ($DbResult->num_rows > 0)
  {
    $System->ModuleManager->Modules['Log']->WriteLog('ProcesTask nepracuje přes 2 hodiny, pravděpodobně nepracuje!', LOG_TYPE_ERROR);
  }
  return $Output;
}

function OutputEXEToFile($ExportId)
{
  global $System;

  $Export = new Export($System);
  $Export->Id = $ExportId;
  $Export->Init();
  $Export->LoadFilters();

  $Output = '';
  // Allow to regenerate output if it was previously finished
  $DbResult = $System->Database->query('SELECT `Id` FROM `ExportTask` WHERE (`Export` = '.$ExportId.
    ') AND ((`TimeFinish` < `TimeStart`) OR (`TimeFinish` IS NULL))');
  if ($DbResult->num_rows == 0)
  {
    if (array_key_exists('Regenerate', $_POST))
    {
      $System->Database->query('UPDATE `ExportTask` SET `TimeQueued` = NOW(), `Progress`=0, `TimeStart` = NULL, `TimeFinish` = NULL WHERE `Export` = '.$ExportId);
      $Output .= ShowMessage('Soubor zařazen znovu ke zpracování do fronty.');
      $System->ModuleManager->Modules['Log']->WriteLog('Zadání úlohy pro vygenerování exe souboru', LOG_TYPE_DOWNLOAD);
    } else {
      $Output .= '<form action="?Action=View&amp;Tab=7&amp;ExportId='.$ExportId.'" method="post">'.
        '<input type="submit" name="Regenerate" value="'.T('Regenerate').'"/></form><br />';
    }
  }

  $Output .= 'U souhrné instalace češtiny funguje export textů jinak, protože generování je náročné, jsou požadavky zařazovány do fronty a postupně zpracovávány.<br /><br />';

  // Start task for the first time if export task was not yet started
  $DbResult = $System->Database->query('SELECT * FROM `ExportTask` WHERE `Export` = '.$ExportId);
  if ($DbResult->num_rows == 0)
  {
    $System->Database->query('INSERT INTO `ExportTask` (`Export`, `TimeStart` ) VALUES ('.$ExportId.', NOW())');
    $System->ModuleManager->Modules['Log']->WriteLog('Zadání úlohy pro vygenerování DBC souboru', LOG_TYPE_DOWNLOAD);
  }

  $DbResult = $System->Database->query('SELECT `TimeFinish` FROM `ExportTask` WHERE `Export` = '.$ExportId);
  $ExportTask = $DbResult->fetch_assoc();
  if ($ExportTask['TimeFinish'] <> '')
  {
    $FileName = 'Instalace_CzechWoW_'.$Export->ClientVersion['Version'].'.exe';
    $Output .= '<strong>Souhrný EXE balík: <a href="'.$System->Link('/'.$Export->TempDirRelative.$FileName).'">'.$FileName.'</a></strong><br/>';
  } else {
    $Output .= ShowProgress($Export);
  }
  return $Output;
}

function OutputLua($ExportId)
{
  global $System;

  $Export = new Export($System);
  $Export->Id = $ExportId;
  $Export->Init();

  if (function_exists('gzcompress'))
  {
    $Output = 'Generování lua souborů...<br />';
    $Export->ExportToLua();
    $SaveFilename = $Export->TempDir.'CzWoW_Lua.zip';
    $ZipFile = new zipfile();
    CreateZipFromDir($ZipFile, $Export->TempDir.'lua/', '');
    $Buffer = $ZipFile->file();
    file_put_contents($SaveFilename, $Buffer);
    $Output .= 'Hotovo<br /><br />';
  } else $Output = ShowMessage('Funkce pro tvorbu Zip souboru není podporována.', MESSAGE_CRITICAL);
  //$Output .= '<script type="text/javascript" language="JavaScript" charset="utf-8">'.
  //  'setTimeout("parent.location.href=\''.$SaveFilename.'\'", 3000)'.
  //  '</script>';

  $Output .= '<strong>Soubory:</strong><br/>'.
    'Souhrný archív <a href="'.$System->Link('/'.$Export->TempDirRelative.'CzWoW_Lua.zip').'">CzWoW_Lua.zip</a><br />';
  $DbResult = $System->Database->query('SELECT `Group`.* FROM `ExportGroup` JOIN `Group` ON `Group`.`Id` = `ExportGroup`.`Group` WHERE `ExportGroup`.`Export`='.$Export->Id.' AND `Group`.`LuaFileName` != ""');
  while ($Group = $DbResult->fetch_assoc())
  {
    $Output .= '<a href="'.$System->Link('/'.$Export->TempDirRelative.'lua/'.$Group['LuaFileName'].'.lua').'">'.$Group['LuaFileName'].'.lua</a><br/>';
  }
  $Output .= '<br /><br /><strong>Použití ve hře</strong><br />Ze souborů vytvořte MPQ archív a nahrajte ho do hry do podsložky jako Data/enUS/patch-enUS-5.MPQ nebo Data/enUS/patch-enGB-5.MPQ. Pro starší verze hry než 3.2.0 je nutné spouštět hru pomocí programu WoWMe.exe (WoW Model Editor Fix).';
  return $Output;
}

function ExportOutput($ExportId, $Type)
{
  if ($Type == 1) $Output = OutputMangosSQLToHTML($ExportId);
  else if ($Type == 2) $Output = OutputMangosSQLToFile($ExportId);
  else if ($Type == 3) $Output = OutputAoWoWToHTML($ExportId);
  else if ($Type == 4) $Output = OutputAoWoWToFile($ExportId);
  else if ($Type == 5) $Output = OutputXMLToHTML($ExportId);
  else if ($Type == 6) $Output = OutputXMLToFile($ExportId);
  else if ($Type == 7) $Output = OutputAddon($ExportId);
  else if ($Type == 8) $Output = OutputLua($ExportId);
  else if ($Type == 9) $Output = OutputDBCToFile($ExportId);
  else if ($Type == 10) $Output = OutputEXEToFile($ExportId);
  else $Output = ShowMessage('Nebyl vybrán žádný formát výstupu.', MESSAGE_CRITICAL);
  return $Output;
}
