<?php namespace Eae\Backoffice\Generic\Fields;

use Eae\Support\Contracts\ListableFieldInterface;
use Eae\Support\Contracts\SearchableFieldInterface;
use Illuminate\Database\Eloquent\Builder;
use LaravelLocalization;
use View;

class TextBoxField extends BaseField implements ListableFieldInterface, SearchableFieldInterface
{
  private $maxLength = NULL;
  private $woMultilang = FALSE;

  public function __construct($config)
  {

    parent::__construct($config);

    if (!empty($config["maxLength"])) {
      $this->maxLength = $config["maxLength"];
    }

    if (!empty($config["woMultilang"])) {
      $this->woMultilang = $config["woMultilang"];
    }
  }

  public function getMaxLength()
  {
    return $this->maxLength;
  }

  public function setMaxLength($maxLength = NULL)
  {
    $this->maxLength = $maxLength;
  }

  public function buildSelect(Builder $query)
  {
    if ($this->isMultiLanguage()) {
      if ($this->woMultilang) {
        //Not very nice hardcode, but...
        $tablePrefix = 'website_objects_lang';
      } else {
        $tablePrefix = $query->getModel()->languages()->getRelated()->getTable();
      }
    } else {
      $tablePrefix = $query->getModel()->getTable();
    }

    $query->addSelect("{$tablePrefix}.{$this->name}");

    return $query;
  }

  public function buildWhere(Builder $query, $searchPhrase)
  {
    if (empty($searchPhrase) || !$this->isSearchable()) {
      return $query;
    }

    if ($this->isMultiLanguage()) {
      $tablePrefix = $query->getModel()->languages()->getRelated()->getTable();
    } else {
      $tablePrefix = $query->getModel()->getTable();
    }

    $query->orWhere("{$tablePrefix}.{$this->name}", 'like', "%{$searchPhrase}%");

    return $query;
  }

  public function buildOrder(Builder $query, $sortOrder = "asc")
  {
    if ($this->isMultiLanguage()) {
      $tablePrefix = $query->getModel()->languages()->getRelated()->getTable();
    } else {
      $tablePrefix = $query->getModel()->getTable();
    }

    $query->orderBy("{$tablePrefix}.{$this->getName()}", $sortOrder);

    return $query;
  }

  public function toArray()
  {
    $array = parent::toArray();
    $array["maxLength"] = $this->maxLength;

    return $array;
  }

  public function toGridHeader()
  {
    return '<th data-column-id="' . $this->getName() . '">' . ucfirst($this->getLabel()) . '</th>';
  }

  public function toForm($model, $enabled = TRUE, $hidden = FALSE)
  {
    $html = "";
    if ($this->isMultiLanguage()) {
      $locales = LaravelLocalization::getSupportedLocales();
      $defaultLocale = LaravelLocalization::getDefaultLocale();

      foreach ($locales as $locale => $localeData) {
        $fieldName = $this->getName();
        $name = $fieldName . "[{$locale}]";
        $id = $fieldName . "_{$locale}";
        $errorKey = $fieldName . "." . $locale;
        $value = NULL;

        if ($model->exists) {
          if ($this->woMultilang) {
            $wo = \WebsiteObject::find($model->website_object_id);
            $languageModel = $wo->languages->findByLocale($locale);
          } else {
            $languageModel = $model->languages->findByLocale($locale);
          }
          if (!empty($languageModel)) {
            $value = $languageModel->$fieldName;
          }
        }

        if ($this->isDisabled()) {
          $enabled = FALSE;
        }

        $html .= View::make(
          "admin.generic.components.forms.textbox",
          [
            "id"           => $id,
            "errorKey"     => $errorKey,
            "name"         => $name,
            "label"        => $this->getLabel(),
            "value"        => $value,
            "maxLength"    => $this->getMaxLength(),
            "language"     => $locale,
            "defaultLang"  => $defaultLocale,
            "hide"         => ($hidden || $locale != $defaultLocale),
            "enabled"      => $enabled,
            "parentHidden" => ($hidden && !empty($this->parent)),
            "parent"       => $this->parent,
            "info"         => $this->getInfo()
          ]);
      }
    } else {
      $fieldName = $this->getName();
      $value = NULL;

      if ($model->exists) {
        $value = $model->$fieldName;
      }

      if ($this->isDisabled()) {
        $enabled = FALSE;
      }

      $html .= View::make(
        "admin.generic.components.forms.textbox",
        [
          "id"           => $this->getName(),
          "errorKey"     => $this->getName(),
          "name"         => $this->getName(),
          "label"        => $this->getLabel(),
          "value"        => $value,
          "maxLength"    => $this->getMaxLength(),
          "hide"         => $hidden,
          "enabled"      => $enabled,
          "parentHidden" => ($hidden && !empty($this->parent)),
          "parent"       => $this->parent,
          "info"         => $this->getInfo()
        ]);
    }

    return $html;
  }

  public function getSearchStructure($model, $view = FALSE)
  {
    $searchData = [];
    $fieldName = $this->getName();
    if ($this->isMultiLanguage()) {
      foreach ($model->languages as $languageModel) {
        if (!empty($languageModel->$fieldName)) {
          $value = $languageModel->$fieldName;
          $searchData[ $languageModel->language_id ] = $languageModel->$fieldName;
        }
      }
    } else {
      if (!empty($model->$fieldName)) {
        $languages = LaravelLocalization::getSupportedLocales();
        foreach ($languages as $locale => $localeData) {
          $searchData[ $locale ] = $model->$fieldName;
        }
      }
    }

    return $searchData;
  }
}


