<?php

include_once(dirname(__FILE__).'/Export.php');

class ExportAddon extends Export
{

  // Replace special codes by lua functions
  function ReplaceVarInText($string, $strlower = 'strlower')
  {

    $string = str_replace('$N', '"..'.$strlower.'(UnitName("player")).."', $string);
    $string = str_replace('$n', '"..'.$strlower.'(UnitName("player")).."', $string);
    $string = str_replace('$C', '"..'.$strlower.'(UnitClass("player")).."', $string);
    $string = str_replace('$c', '"..'.$strlower.'(UnitClass("player")).."', $string);
    $string = str_replace('$R', '"..'.$strlower.'(UnitRace("player")).."', $string);
    $string = str_replace('$r', '"..'.$strlower.'(UnitRace("player")).."', $string);
    $Gender = '$G';
    while(strpos($string, $Gender) !== false)
    {
      $Before = substr($string, 0, strpos($string, $Gender));
      $Man = substr($string, strpos($string, $Gender) + 2);
      $Woman = substr($Man, strpos($Man, ':') + 1);
      $After = substr($Woman, strpos($Woman, ';') + 1);
      $Man = substr($Man, 0, strpos($Man, ':'));
      $Woman = substr($Woman, 0, strpos($Woman, ';'));
      $Man = str_replace(' ', '', $Man);
      $Woman = str_replace(' ', '', $Woman);
      $string = $Before.'"..gsub(gsub(UnitSex("player"), "^2$", "'.$Man.'"), "^3$", "'.$Woman.'").."'.$After;
    }
    $Gender = '$g';
    while(strpos($string, $Gender) !== false)
    {
      $Before = substr($string, 0, strpos($string, $Gender));
      $Man = substr($string, strpos($string, $Gender) + 2);
      $Woman = substr($Man, strpos($Man, ':') + 1);
      $After = substr($Woman, strpos($Woman, ';') + 1);
      $Man = substr($Man, 0, strpos($Man, ':'));
      $Woman = substr($Woman, 0, strpos($Woman, ';'));
      $Man = str_replace(' ', '', $Man);
      $Woman = str_replace(' ', '', $Woman);
      $string = $Before.'"..gsub(gsub(UnitSex("player"), "^2$", "'.$Man.'"),"^3$", "'.$Woman.'").."'.$After;
    }

    $string = str_replace('$', '', $string);
    $string = str_replace("\r", '', $string);
    $string = str_replace("\n", '\r\n', $string);
    return($string);
  }

  function ReplaceEnText($string)
  {
    //  $string = mysql_escape_string($string);
    $string = strtolower($string);

    $string = str_replace('"', '\"', $string);
    $string = str_replace('$b$b', ' ', $string);
    $string = str_replace('$b $b', ' ', $string);
    $string = str_replace('$b', ' ', $string);
    $string = $this->ReplaceVarInText($string);
    $string = str_replace("\r", ' ', $string);
    $string = str_replace("\n", ' ', $string);
    $string = str_replace('\\r', ' ', $string);
    $string = str_replace('\\n', ' ', $string);
    $string = str_replace(' ', '', $string);
//    while(strpos($string, '  '))
//      $string = str_replace('  ', ' ', $string);
    return($string);
  }

  function ReplaceCzText($string)
  {
    $string = $this->Database->real_escape_string($string);
    $string = str_replace('$B', '\r\n', $string);
    $string = str_replace('$b', '\r\n', $string);
    $string = $this->ReplaceVarInText($string,'');
    return($string);
  }

  function NotCancel($string)
  {
    //echo (strpos($string,'<html>'));
    if (strpos($string,'<html>') > -1) return(false);
      else return(true);
  }

  function my_trim($string)
  {
    $string = addslashes($string);
    $string = str_replace("\n", '\r\\'."\n",$string);
    $string = str_replace("\r", '',$string);
    $string = str_replace("\\\\\\", '\\\\',$string);
    $string = str_replace("\\\\\\", '\\\\',$string);
    $string = str_replace("\\\\\\", '\\\\',$string);
    $string = str_replace("\\\\32", '\\32',$string);
    $string = str_replace('\\\\"', '\\"',$string);
    $string = str_replace('\\\\n', '\\n',$string);
    $string = str_replace('\\\\124', '\\124',$string);

    return ($string);
  }

  function MakeLanguageFiles()
  {
    global $TranslationTree, $CreatedFileList;

    $Output = '';
    $this->LoadFilters();

    $CreatedFileList = array();
    $CreatedFileListCount = array();

    if(!file_exists($this->TempDir.'CzWoW/')) mkdir($this->TempDir.'CzWoW/', 0777, true);

    $DbResult = $this->Database->query('SELECT `Group`.* FROM `ExportGroup` JOIN `Group` ON `Group`.`Id` = `ExportGroup`.`Group` WHERE `ExportGroup`.`Export`='.$this->Id.' AND `Group`.`TablePrefix` != ""');
    while($Group = $DbResult->fetch_assoc())
    {
    //získání čísla verze pro export
      $ID = $this->Database->query('SELECT LastVersion FROM `Group` WHERE Id = '.$Group['Id']);
      $LastVersion = $ID->fetch_assoc();

      if ($LastVersion['LastVersion'] < $this->ClientVersion['BuildNumber'])
        $ExportVersion = $LastVersion['LastVersion'];
      else $ExportVersion = '';

      foreach($TranslationTree[$Group['Id']]['Items'] as $Column)
      if($Column['AddonFileName'] != '')
      {
        $this->AddProgress(1);
        if(!isset($CreatedFileListCount[$Column['AddonFileName']]))
        $CreatedFileListCount[$Column['AddonFileName']] = 0;
        $CreatedFileListCount[$Column['AddonFileName']]++;
        $FileIndex = $CreatedFileListCount[$Column['AddonFileName']];

        $CreatedFileList[] = $Column['AddonFileName'].'_'.$FileIndex;
        $FileName = $this->TempDir.'CzWoW/'.$Column['AddonFileName'].'_'.$FileIndex.'.lua';
        $Output .= $Column['AddonFileName'].': ';
        $i = 0;

        $Buffer = 'CZWOW_'.$Column['AddonFileName'].'_count='.$FileIndex.';CZWOW_'.$Column['AddonFileName'].'_'.$FileIndex.'={';
        $TableTexts = array();

        //old version
        //get version before
        $BuildNumber = $ExportVersion;
        if ($ExportVersion == '') $BuildNumber = $this->ClientVersion['BuildNumber'];
        $ID = $this->Database->query('SELECT `BuildNumber` FROM `ClientVersion` WHERE '.
        ' `Imported` = 1 AND `BuildNumber` < '.$BuildNumber.' ORDER BY  `BuildNumber` DESC LIMIT 1');
        if($ID->num_rows > 0) {
          $ExportVersionOld = $ID->fetch_assoc();
          $ExportVersionOld = $ExportVersionOld['BuildNumber'];

          $DbResult2 = $this->Database->query($this->BuildQuery($Group,$ExportVersionOld));
          while($Line = $DbResult2->fetch_assoc())
          {
            $en = trim($this->ReplaceEnText($Line['En'.$Column['Column']]));
            $cz = $this->ReplaceCzText($Line[$Column['Column']]);
            if(($en <> '') and ($cz <> '') and ($this->NotCancel($en)))
            {
               $TableTexts[$en] = $cz;
            }
          }
        }
                //last version

        $DbResult2 = $this->Database->query($this->BuildQuery($Group,$ExportVersion));
        while($Line = $DbResult2->fetch_assoc())
        {
          $en = trim($this->ReplaceEnText($Line['En'.$Column['Column']]));
          $cz = $this->ReplaceCzText($Line[$Column['Column']]);
          if(($en <> '') and ($cz <> '') and ($this->NotCancel($en)))
          {
             $TableTexts[$en] = $cz;
          }
        }

        foreach($TableTexts as $key => $value) {
            $Buffer .= "\n".'["'.$key.'"]="'.$value.'",';
            $i++;
        }


        $Buffer = $Buffer."\n};if not CZWOW_".$Column['AddonFileName']." then CZWOW_".$Column['AddonFileName']."=0; end; CZWOW_".$Column['AddonFileName']."=CZWOW_".$Column['AddonFileName']."+".$i.";\n";

        file_put_contents($FileName, $Buffer);
        $Output .= '<b>Hotovo</b><br />';
      }
    }


    // Generete list file of translated
    $CountFiles = 'CountFiles.lua';
    $Buffer = '';
    foreach($CreatedFileList as $CreatedFile)
      $Buffer .= 'CZWOW_'.str_replace('_','_count=',$CreatedFile).';'."\n";
    foreach($TranslationTree as $Group)
      foreach($TranslationTree[$Group['Id']]['Items'] as $Column)
      if (($Column['AddonFileName'] != '') and (!in_array($Column['AddonFileName'].'_1', $CreatedFileList)))
      {
        $Buffer .= 'CZWOW_'.$Column['AddonFileName'].'_count=0;'."\n";
    }

    file_put_contents($this->TempDir.'CzWoW/'.$CountFiles, $Buffer);


    // Generate file Translates.xml
    $Buffer = '<Ui xmlns="http://www.blizzard.com/wow/ui/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.blizzard.com/wow/ui/.\FrameXML\UI.xsd">'."\n";
    $Buffer .= '<script file="'.$CountFiles.'"/>'."\n";
    foreach($CreatedFileList as $CreatedFile)
      $Buffer .= '<script file="'.$CreatedFile.'.lua"/>'."\n";
    $Buffer .= '</Ui>';
    file_put_contents($this->TempDir.'CzWoW/Translates.xml', $Buffer);
    return($Output);
  }


  function MakeClientStrings()
  {
    global $TranslationTree;

    $this->LoadFilters();

    $Buffer = "local f=function(name, en, cz) CzWoW_interface[name]=cz;CzWoW_interface_entoname[en]=name; end; CzWoW_interface={};CzWoW_interface_entoname={ };\n";
    $Group = $TranslationTree[14]; // client table
    $Column['Column'] = 'Text';

    $DbResult = $this->Database->query('SELECT `Group`.* FROM `ExportGroup` JOIN `Group` ON `Group`.`Id` = `ExportGroup`.`Group` WHERE `ExportGroup`.`Export`='.$this->Id.' AND `Group`.`TablePrefix` != "" AND `Group`.`Id` = 14');
    //$Group = $DbResult->fetch_assoc();
    if ($DbResult->num_rows == 0)
      $CanGenerated = '-1';
    else
      $CanGenerated = '';

    $DbResult = $this->Database->query($this->BuildQuery($Group,$CanGenerated));
    while($Line = $DbResult->fetch_array())
    {
      $Original = $this->my_trim($Line['En'.$Column['Column']]);
      $Translated = $this->my_trim($Line[$Column['Column']]);
      if($this->ClientVersion['Version'] == '2.4.3')
      {
        $Original = str_replace("|Hchannel:%d|h[%s]|h", '[%s]', $Original);
        $Translated = str_replace("|Hchannel:%d|h[%s]|h", '[%s]', $Translated);
      }
      $Buffer .= 'f("'.addslashes($Line['ShortCut']).'", "'.$Original.'","'.$Translated.'");'."\n";
    }

    if(!file_exists($this->TempDir.'CzWoW/')) mkdir($this->TempDir.'CzWoW/',0777, true);
    file_put_contents($this->TempDir.'CzWoW/LocalizationStrings.lua', $Buffer);
  }

  function MakeAddon()
  {
    if(!file_exists($this->TempDir)) mkdir($this->TempDir, 0777, true);
    $Output = $this->MakeLanguageFiles();
    $Output .= $this->MakeClientStrings();
    // $Output .= MakeMainScript($Setting);
    return($Output);
  }

  function MakeReadme()
  {
    $DbResult = $this->Database->query('SELECT * FROM `CzWoWPackageVersion` ORDER BY `Date` DESC');
    $Line = $DbResult->fetch_assoc();

    $Buffer = '
 Čeština pro klienty:
  Vytvořeno v projektu http://wowpreklad.zdechov.net/
  Obsahuje Fonty pro správné zobrazování českých znaků, WoW addon překládající
texty

 Instalace:
  Soubory rozbalte/zkopírujte do kořenové složky s hrou. Obvikle bývá
"C:/Program Files/World of Warcraft/".

 Verze:
  Verze Addonu: '.$Line['Version'].'
  Tato verze je pro verzi hry '.$this->ClientVersion['Version'].'

 Změny ve verzích:

    ';
    $DbResult = $System->Database->query('SELECT * FROM `CzWoWPackageVersion` ORDER BY `Date` DESC');
    while($Line = $DbResult->fetch_assoc())
    {
      $Buffer .='
  Verze: '.$Line['Version'].'
  =============
  '.$Line['text'].'

  ';
    }
    file_put_contents($this->TempDir.'CZWOW-Readme.txt', $Buffer);
  }
}
