<?php 
class TransferBase {
  /**
   * @var int $id
   */
  public $id;
  /**
   * @var ApplicationCore $app
   */
  public $app;
  /** @var array */
  protected $transferdata;
  /** @var array */
  protected $stucture;
  /** @var array */
  protected $settings;
  /** @var Uebertragungen|null */
  protected $transferModule;

  /**
   * TransferBase constructor.
   *
   * @param Application $app
   * @param int         $id
   */
  public function __construct($app, $id)
  {
    $this->app = $app;
    $this->id = $id;
    $this->getSettings();
  }

  /**
   * @param array $settings
   */
  public function setSettings($settings)
  {
    $this->settings = $settings;
  }

  /**
   * @return array
   */
  public function capability()
  {
    return [
      'functions' => [
        'file_transfer'         => true,
        'send_documents'        => true,
        'send_articles'         => true,
        'send_storage'          => true,
        'send_tracking'         => true,
        'send_sales_report'     => true,
        'receive_documents'     => true,
        'receive_articles'      => true,
        'receive_storage'       => true,
        'receive_tracking'      => true,
        'receive_sales_report'  => true,
      ],
    ];
  }

  /**
   * @param null|Uebertragungen $transferModul
   *
   * @return Uebertragungen|null
   */
  public function getTransferModul($transferModul = null)
  {
    if($transferModul !== null && $transferModul instanceof Uebertragungen) {
      $this->transferModule = $transferModul;
      return $this->transferModule;
    }
    if($this->transferModule === null) {
      $this->transferModule = $this->app->erp->LoadModul('uebertragungen');
    }

    return $this->transferModule;
  }

  /**
   * @param int    $requestId
   * @param string $status
   * @param string $message
   * @param string $doctype
   * @param int    $doctypeId
   * @param int    $fileId
   * @param int    $monitorId
   *
   * @return int
   */
  public function setRequestItemStatus(
    $requestId, $status, $message = '', $doctype = '', $doctypeId = 0, $fileId = 0, $monitorId = 0
  )
  {
    $requestItem = $this->app->DB->SelectRow(
      sprintf(
        'SELECT * FROM api_request WHERE id = %d',
        $requestId
      )
    );
    if(empty($requestItem)) {
      return 0;
    }
    $requestStatus = stripos($status, 'error')!==false?'error':$status;
    $this->app->DB->Update(
      sprintf(
        "UPDATE api_request SET status = '%s' WHERE id = %d",
        $this->app->DB->real_escape_string($requestStatus),
        $requestId
      )
    );
    $transferModule = $this->getTransferModul();
    if($transferModule === null) {
      return 0;
    }

    return $transferModule->AddUbertragungMonitorLog(
      $this->id,
      $fileId,
      $requestId,
      $status,
      $message,
      '',
      '',
      '',
      $doctype,
      $doctypeId,
      $monitorId
    );
  }

  /**
   * @param string $name
   * @param mixed  $value
   *
   * @return mixed|null
   */
  public function setSetting($name, $value) {
    $this->getSettings();
    $this->settings[$name] = $value;
    $oldSettingsString = $this->app->DB->Select(
      sprintf(
        'SELECT `einstellungen_json` FROM `uebertragungen_account` WHERE `id` = %d LIMIT 1',
        $this->id
      )
    );
    $isOldSettingValid = false;
    if(!empty($oldSettingsString)) {
      $oldSettings = json_decode($oldSettingsString, true);
      if(is_array($oldSettings)) {
        $isOldSettingValid = true;
      }
    }
    $this->app->erp->StartChangeLog('uebertragungen_account', $this->id);
    $this->app->DB->Update(
      sprintf(
        "UPDATE `uebertragungen_account` SET `einstellungen_json` = '%s' WHERE `id` = %d LIMIT 1",
        $this->app->DB->real_escape_string(json_encode($this->settings)), $this->id
      )
    );
    $this->app->erp->WriteChangeLog();
    if(!$isOldSettingValid) {
      return $this->getSettings();
    }

    $newSettings = $this->app->DB->Select(
      sprintf(
        'SELECT `einstellungen_json` FROM `uebertragungen_account` WHERE `id` = %d LIMIT 1',
        $this->id
      )
    );

    if(!empty($newSettings)) {
      $newSettings = json_decode($newSettings, true);
      if(is_array($newSettings)) {
        return $this->getSettings();
      }
    }
    $this->app->erp->StartChangeLog('uebertragungen_account', $this->id);
    $this->app->DB->Update(
      sprintf(
        "UPDATE `uebertragungen_account` SET `einstellungen_json` = '%s' WHERE `id` = %d LIMIT 1",
        $this->app->DB->real_escape_string($oldSettingsString), $this->id
      )
    );
    $this->app->erp->WriteChangeLog();

    return $this->getSettings();
  }

  /**
   * @return mixed|null
   */
  public function getSettings()
  {
    if($this->id <= 0)
    {
      return null;
    }
    $this->transferdata = $this->app->DB->SelectRow(
      'SELECT a.*, o.uebertragungen_account_id, o.client_id, o.client_secret, o.expiration_date, o.url, o.access_token 
      FROM `uebertragungen_account` AS `a` 
      LEFT JOIN `uebertragungen_account_oauth` AS `o` ON o.uebertragungen_account_id = a.id 
      WHERE a.id = ' . $this->id
    );
    if(!empty($this->app->DB->error())) {
      $this->transferdata = $this->app->DB->SelectRow(
        'SELECT a.*
        FROM `uebertragungen_account` AS `a`
        WHERE a.id = ' . $this->id
      );
    }
    if(!empty($this->transferdata['einstellungen_json']))
    {
      $this->settings = @json_decode($this->transferdata['einstellungen_json'], true);
    }elseif(!empty($this->stucture)){
      foreach($this->stucture as $name => $val)
      {
        if(isset($val['default']))
        {
          $this->settings[$name] = $val['default'];
        }
      }
    }
    if(empty($this->settings))
    {
      $this->settings = null;
    }

    return $this->settings;
  }

  /**
   * @return array
   */
  public function getTransferData()
  {
    if(empty($this->transferdata)) {
      $this->getSettings();
    }

    return $this->transferdata;
  }

  /**
   * @return null
   */
  public function SettingsStructure()
  {
    return null;
  }

  /**
   * @return array|null
   */
  public function getStructure()
  {
    $this->stucture = $this->SettingsStructure();
    if($this->app->erp->ModulVorhanden('TransferSmarty')) {
      $this->stucture = array_merge($this->stucture, [
        'useincommingconverter' => [
          'typ' => 'checkbox',
          'bezeichnung' => 'Eingangskonverter verwenden',
        ],
        'incommingtemplate' => [
          'typ' => 'textarea',
          'size'=> 40,
          'rows'=> 6,
          'bezeichnung'=>'Eingang Template:',
          'tag' => 'disabled="disabled" style="background-color:#ccc; " ',
          'info' => '<input style="vertical-align: top" type="button" value="bearbeiten" id="editincommingtemplate" />',
        ],
        'incommingdata' => [
          'typ' => 'hidden',
        ],
      ]);
    }

    return $this->stucture;
  }

  /**
   * @param string         $file
   * @param Uebertragungen $transferModul
   *
   * @return string
   */
  public function convertIncomming($file, $transferModul)
  {
    if(!empty($this->settings['useincommingconverter']) && !empty($this->settings['incommingtemplate'])) {
      $obj = $this->app->loadModule('TranferSmarty');
      if(empty($obj) || !method_exists($obj, 'convertIncomingFile')) {
        return $file;
      }
      $obj->setSettings($this->settings);
      try {
        $file = $this->convertIncomingFile($file);
      }
      catch(Exception $e) {
        $fileId = $transferModul->GetFileId($this->id, $file, false);
        $transferModul->AddUbertragungMonitorLog($this->id, $fileId,0,'xml_parseerror', '');
      }
    }

    return $file;
  }

  /**
   * @param string     $target
   * @param null|array $struktur
   *
   * @return string|null
   */
  public function Settings($target = 'return', $struktur = null)
  {
    if(!$this->id)
    {
      return null;
    }
    if($struktur === null){
      $struktur = $this->getStructure();
    } else {
      $this->stucture = $struktur;
    }
    $this->getSettings();
    if($this->app->Secure->GetPOST('speichern'))
    {
      $uebertragungen_account = $this->transferdata;
      $json = $this->settings;
      $modul = $uebertragungen_account['xml_pdf'];
      if(!empty($struktur)){
        foreach ($struktur as $name => $val) {
          if($modul === $this->app->Secure->GetPOST('xml_pdf')){
            $json[$name] = $this->app->Secure->GetPOST($name, '', '', 1);
          }

          if(isset($val['replace'])){
            switch ($val['replace']) {
              case 'lieferantennummer':
                $json[$name] = $this->app->erp->ReplaceLieferantennummer(1, $json[$name], 1);
                break;
              case 'shop':
                $json[$name] = explode(' ', $json[$name]);
                $json[$name] = reset($json[$name]);
                break;
              case 'lagerplatz':
                $json[$name] = $this->app->erp->ReplaceLagerPlatz(1, $json[$name], 1);
                break;
              case 'Layoutvorlage':
                $json[$name] = explode(' ', $json[$name]);
                $json[$name] = (int)reset($json[$name]);
                break;
              case 'artikelnummer':
                $tmp = trim($json[$name]);
                $rest = explode(' ',$tmp);
                $rest = $rest[0];
                $json[$name] =  $this->app->DB->Select(
                  sprintf(
                    "SELECT id 
                    FROM artikel 
                    WHERE nummer='%s' AND nummer!='' AND geloescht=0
                    ORDER BY projekt = %d DESC
                    LIMIT 1",
                    $rest, $this->transferdata['projekt']
                  )
                );
                break;
            }
          }
        }
      }
      $json_str = $this->app->DB->real_escape_string(json_encode($json));
      $this->app->erp->StartChangeLog('uebertragungen_account', $this->id);
      $this->app->DB->Update("UPDATE `uebertragungen_account` SET `einstellungen_json` = '$json_str' WHERE `id` = '".$this->id."' LIMIT 1");
      $this->app->erp->WriteChangeLog();
    }
    $id = $this->id;

    $json = $this->app->DB->Select("SELECT einstellungen_json FROM uebertragungen_account WHERE id = '$id' LIMIT 1");
    if(!empty($json))
    {
      $json = json_decode($json, true);
    }else{
      $json = null;
    }
    
    foreach($struktur as $name => $val) {
      $changed = false;
      if(isset($val['default']) && !isset($json[$name])) {
        $changed = true;
        $json[$name] = $val['default'];
      }
    }
    if(!empty($changed)) {
      $json_str = $this->app->DB->real_escape_string(json_encode($json));
      $this->app->erp->StartChangeLog('uebertragungen_account', $this->id);
      $this->app->DB->Update("UPDATE `uebertragungen_account` SET `einstellungen_json` = '$json_str' WHERE `id` = '".$this->id."' LIMIT 1");
      $this->app->erp->WriteChangeLog();
    }

    if(!empty($struktur)) {
      $html = '</table>
  </fieldset><fieldset class="modulespecific"><legend>{|&Uuml;bertragungenspezifische Einstellungen|}</legend>
    ';
      foreach($struktur as $name => $val) {
        if(empty($val['typ']) || $val['typ'] !== 'hidden') {
          continue;
        }

        $html .= '<input type="hidden" name="'.$name.'" id="'.$name.'" value="'
          .(!isset($json[$name])?'':htmlspecialchars($json[$name], ENT_QUOTES | ENT_HTML5)).'" />';

      }
      $html .= '<table width="100%">
      <tr><td width="300">';
    }
    else{
      $html = '';
    }

    $first = true;
    foreach($struktur as $name => $val) {
      $tdtag = !empty($val['tdtag'])?$val['tdtag']:'';
      $oneCol = !empty($val['onecol']);
      $typ = 'text';
      if(!empty($val['typ'])) {
        $typ = $val['typ'];
        if($typ === 'hidden') {
          continue;
        }
      }
      if(isset($val['heading'])) {
        $html .= '<tr><td colspan="2"><b>'.html_entity_decode($val['heading']).'</b></td></tr>';
      }
      if($oneCol) {
        $html .= '<tr><td valign="top" colspan="2"'.(!empty($tdtag)?' '.$tdtag.' ':'').'>' . ($first ? '<input type="hidden" name="modul_name" value="' . $this->app->DB->Select("SELECT modul FROM versandarten WHERE id = '$id' LIMIT 1") . '" />' : '') . (empty($val['bezeichnung']) ? $name : $val['bezeichnung']) . '<br />';
      }
      else{
        $html .= '<tr><td valign="top">' . ($first ? '<input type="hidden" name="modul_name" value="' . $this->app->DB->Select("SELECT modul FROM versandarten WHERE id = '$id' LIMIT 1") . '" />' : '') . (empty($val['bezeichnung']) ? $name : $val['bezeichnung']) . '</td><td'.(!empty($tdtag)?' '.$tdtag.' ':'').'>';
      }

      $tag = !empty($val['tag'])?$val['tag']:'';

      $placeholder = !empty($val['placeholder'])?$val['placeholder']:'';
      $size = !empty($val['size'])?$val['size']:'';
      $rows = !empty($val['rows'])?$val['rows']:'';

      if(isset($val['replace'])) {
        switch($val['replace']) {
          case 'lieferantennummer':
            $json[$name] = $this->app->erp->ReplaceLieferantennummer(0,$json[$name],0);
            if($target !== 'return')
            {
              $this->app->YUI->AutoComplete($name, 'lieferant', 1);
            }
          break;
          case 'lagerplatz':
            $json[$name] = $this->app->erp->ReplaceLagerPlatz(0, $json[$name], 0);
            if($target !== 'return') {
              $this->app->YUI->AutoComplete($name, 'lagerplatz', 0);
            }
            break;
          case 'artikelnummer':
            $json[$name] = $this->app->erp->ReplaceArtikel(0,$json[$name],0);
            if($target !== 'return') {
              $this->app->YUI->AutoComplete($name, 'artikelnummer', 1);
            }
            break;
          case 'shop':
            $json[$name] .= ($json[$name]?' '.$this->app->DB->Select("SELECT bezeichnung FROM shopexport WHERE id = '".(int)$json[$name]."'"):'');
            if($target !== 'return') {
              $this->app->YUI->AutoComplete($name, 'shopnameid');
            }
          break;
          case 'Layoutvorlage':
            $json[$name] = (int)$json[$name];
            if($json[$name] <= 0) {
              $json[$name] = '';
            }
            else {
              $json[$name] = (string)$this->app->DB->Select(
                sprintf(
                  "SELECT CONCAT(`id`,' ', `name`) FROM `layoutvorlagen` WHERE `id` = %d ",
                  $json[$name]
                )
              );
            }
            if($target !== 'return') {
              $this->app->YUI->AutoComplete($name, 'layoutvorlage');
            }
            break;
          case 'etiketten':
            if($target !== 'return') {
              $this->app->YUI->AutoComplete($name, 'etiketten');
            }
          break;
        }
      }

      switch($typ) {
        case 'textarea':
          $html .= '<textarea '.(!empty($tag)?' '.$tag.' ':'').(!empty($size)?' cols="'.$size.'" ':'').' '.(!empty($rows)?' rows="'.$rows.'" ':'').' '.(!empty($placeholder)?' placeholder="'.$placeholder.'" ':'').' name="'.$name.'" id="'.$name.'">'.(!isset($json[$name])?'':$json[$name]).'</textarea>';
        break;
        case 'checkbox':
          $html .= '<input type="checkbox" name="'.$name.'" id="'.$name.'" value="1" '.((isset($json[$name]) && $json[$name])?' checked="checked" ':'').' />';
        break;
        case 'select':
          $html .= '<select name="'.$name.'">';
          if(isset($val['optionen']) && is_array($val['optionen'])) {
            foreach($val['optionen'] as $k => $v) {
              $html .= '<option value="'.$k.'"'.($k == (isset($json[$name])?$json[$name]:'')?' selected="selected" ':'').'>'.$v.'</option>';
            }
          }
          $html .= '</select>';
        break;
        case 'submit':
          if(isset($val['text'])) {
            $html .= '<form method="POST"><input type="submit" name="'.$name.'" value="'.$val['text'].'"></form>';
          }
        break;
        case 'custom':
          if(isset($val['function'])) {
            $tmpfunction = $val['function'];
            if(method_exists($this, $tmpfunction)) {
              $html .= $this->$tmpfunction();
            }
          }
        break;
        default:
          if($typ === 'time' || $typ === 'zeit') {
            $this->app->YUI->TimePicker($name);
          }elseif($typ === 'date' || $typ === 'datum') {
            $this->app->YUI->DatePicker($name);
          }
          $html .= '<input '.(!empty($placeholder)?' placeholder="'.$placeholder.'" ':'').' type="text" '.(!empty($val['size'])?' size="'.$val['size'].'" ':'').' name="'.$name.'" id="'.$name.'" value="'.(!isset($json[$name])?'':$json[$name]).'" />';
        break;
      }
      if(isset($val['info']) && $val['info'])
      {
        $html .= ' <i>'.$val['info'].'</i>';
      }
      
      $html .= '</td></tr>';
      $first = false;
    }
    
    if($target !== 'return'){
      $this->app->Tpl->Add($target, $html);
    }
    return $html;
  }
}