/**
  * Funkce pro validaci vstupních hodnot pro vytvoření nového atributu
  * @throws \Drahak\Restful\Application\BadRequestException
  */
 public function validateCreate()
 {
     /** @noinspection PhpMethodParametersCountMismatchInspection */
     $this->input->field('miner')->addRule(IValidator::REQUIRED, 'You have to select miner ID!');
     /** @noinspection PhpMethodParametersCountMismatchInspection */
     $this->input->field('columnName')->addRule(IValidator::CALLBACK, 'You have to input column name or ID!', function () {
         $inputData = $this->input->getData();
         return @$inputData['columnName'] != "" || $inputData['column'] > 0;
     });
     /** @noinspection PhpMethodParametersCountMismatchInspection */
     $this->input->field('name')->addRule(IValidator::REQUIRED, 'You have to input attribute name!');
     /** @noinspection PhpMethodParametersCountMismatchInspection */
     $this->input->field('preprocessing')->addRule(IValidator::CALLBACK, 'Requested preprocessing was not found!', function ($value) {
         if ($value > 0) {
             try {
                 $this->preprocessingsFacade->findPreprocessing($value);
                 //TODO doplnění kontroly, jestli preprocessing patří k danému metaatributu
             } catch (\Exception $e) {
                 return false;
             }
         }
         return true;
     });
     /** @noinspection PhpMethodParametersCountMismatchInspection */
     $this->input->field('specialPreprocessing')->addRule(IValidator::CALLBACK, 'Requested special preprocessing does not exist!', function ($value) {
         return $value == "" || in_array($value, Preprocessing::getSpecialTypes());
     });
     $inputData = $this->input->getData();
     if (empty($inputData['specialPreprocessing'])) {
         /** @noinspection PhpMethodParametersCountMismatchInspection */
         $this->input->field('preprocessing')->addRule(IValidator::REQUIRED, 'You have to select a preprocessing type or ID!');
     }
 }
 /**
  * Formulář pro zadání preprocessingu pomocí nominal enumeration
  * @return Form
  */
 protected function createComponentNewNominalEnumerationForm()
 {
     $form = new Form();
     $form->setTranslator($this->translator);
     $form->addText('preprocessingName', 'Preprocessing name:')->setRequired(false)->setAttribute('placeholder', $this->translate('Nominal bins'))->setAttribute('title', $this->translate('You can left this field blank, it will be filled in automatically.'))->addRule(function (TextInput $textInput) {
         $form = $textInput->getForm(true);
         $formValues = $form->getValues(true);
         $textInputValue = $textInput->value;
         //nalezení aktuálního formátu
         $miner = $this->findMinerWithCheckAccess($formValues['miner']);
         $datasourceColumn = $this->findDatasourceColumn($miner->datasource, $formValues['column']);
         $format = $datasourceColumn->format;
         $textInput->setAttribute('placeholder', $this->prepareNominalEnumerationPreprocessingName($format, $formValues));
         if ($textInputValue != '') {
             //check preprocessings
             $existingPreprocessings = $format->preprocessings;
             if (!empty($existingPreprocessings)) {
                 foreach ($existingPreprocessings as $existingPreprocessing) {
                     if ($existingPreprocessing->name == $textInput) {
                         return false;
                     }
                 }
             }
         }
         return true;
     }, 'This preprocessing name already exists. Please select a new one...')->addRule(function (TextInput $input) {
         $values = $input->getForm(true)->getValues(true);
         return count($values['valuesBins']) > 0;
     }, 'You have to input at least one bin!');
     $form->addText('attributeName', 'Create attribute with name:')->setRequired('Input attribute name!')->addRule(Form::PATTERN, 'Attribute name can contain only letters, numbers and _ and has start with a letter.', '[a-zA-Z]{1}\\w*')->addRule(function (TextInput $input) {
         //kontrola, jestli již existuje atribtu se zadaným názvem
         $values = $input->getForm(true)->getValues();
         $miner = $this->findMinerWithCheckAccess($values->miner);
         $attributes = $miner->metasource->attributes;
         if (!empty($attributes)) {
             foreach ($attributes as $attribute) {
                 if ($attribute->name == $input->value) {
                     return false;
                 }
             }
         }
         return true;
     }, 'Attribute with this name already exists!');
     $form->addHidden('column');
     $form->addHidden('miner');
     $form->addHidden('formatType');
     $form->addHidden('formatId');
     /** @var Container $valuesBins */
     $valuesBins = $form->addDynamic('valuesBins', function (Container $valuesBin) {
         $valuesBin->addText('name', 'Bin name:')->setRequired(true)->setRequired('Input bin name!')->addRule(function (TextInput $input) {
             $values = $input->parent->getValues(true);
             return count($values['values']) > 0;
         }, 'Add at least one value!')->addRule(function (TextInput $input) {
             //kontrola, jestli má každý BIN jiný název
             $values = $input->getParent()->getParent()->getValues(true);
             $inputValue = $input->getValue();
             $usesCount = 0;
             if (!empty($values)) {
                 foreach ($values as $value) {
                     if ($value['name'] == $inputValue) {
                         $usesCount++;
                     }
                 }
             }
             return $usesCount <= 1;
         }, 'This name is used for other bin!');
         /** @var Container $intervals */
         $intervals = $valuesBin->addDynamic('values', function (Container $interval) {
             $interval->addText('value')->setAttribute('readonly');
             $interval->addSubmit('remove', 'x')->setAttribute('class', 'removeValue')->setValidationScope([])->onClick[] = function (SubmitButton $submitButton) {
                 $intervals = $submitButton->parent->parent;
                 $intervals->remove($submitButton->parent, TRUE);
             };
         });
         $addValueSubmit = $valuesBin->addSubmit('addValue', 'Add value');
         $value = $valuesBin->addText('value', null, '');
         //TODO dodělat select...
         $value->addConditionOn($addValueSubmit, Form::SUBMITTED)->setRequired('Input value!')->addConditionOn($valuesBin->getForm(true)->getComponent('formatType'), Form::EQUAL, Format::DATATYPE_VALUES)->addRule(function (TextInput $input) {
             $inputValue = $input->getValue();
             $values = $input->getForm(true)->getValues(true);
             $format = $this->metaAttributesFacade->findFormat($values['formatId']);
             $values = $format->values;
             if (!empty($values)) {
                 foreach ($values as $value) {
                     if ($value->value == $inputValue) {
                         return true;
                     }
                 }
             }
             return false;
         }, 'You have to input existing value!')->elseCondition()->addRule(Form::FLOAT, 'You have to input number!')->endCondition();
         $value->addRule(function (TextInput $input) {
             $values = $input->getForm(true)->getValues(true);
             $usedValuesArr = [];
             if (!empty($values['valuesBins'])) {
                 foreach ($values['valuesBins'] as $valuesBin) {
                     if (!empty($valuesBin['values'])) {
                         foreach ($valuesBin['values'] as $value) {
                             $usedValuesArr[] = $value['value'];
                         }
                     }
                 }
             }
             return !in_array($input->value, $usedValuesArr);
         }, 'This value is already used!');
         $addValueSubmit->setValidationScope([$value])->onClick[] = function (SubmitButton $submitButton) use($intervals) {
             $values = $submitButton->getParent()->getValues(true);
             $valueItem = $submitButton->getParent()['values']->createOne();
             $valueItem->setValues(['value' => $values['value']]);
             $submitButton->getParent()->setValues(['value' => '']);
         };
         $valuesBin->addSubmit('remove', 'Remove bin')->setAttribute('class', 'removeBin')->setValidationScope([])->onClick[] = function (SubmitButton $submitButton) {
             $submitButton->getParent()->getParent()->remove($submitButton->getParent(), true);
         };
     }, 0);
     $valuesBins->addSubmit('addBin', 'Add bin')->setValidationScope([])->onClick[] = function (SubmitButton $submitButton) {
         $submitButton->getParent()->createOne();
     };
     $form->addSubmit('submitAll', 'Save preprocessing & create attribute')->onClick[] = function (SubmitButton $submitButton) {
         #region vytvoření preprocessingu
         $values = $submitButton->getForm(true)->getValues(true);
         $miner = $this->findMinerWithCheckAccess($values['miner']);
         $this->minersFacade->checkMinerMetasource($miner);
         //vytvoření preprocessingu
         $datasourceColumn = $this->findDatasourceColumn($miner->datasource, $values['column']);
         $format = $datasourceColumn->format;
         $preprocessing = new Preprocessing();
         $preprocessing->name = $values['preprocessingName'] != '' ? $values['preprocessingName'] : $this->prepareNominalEnumerationPreprocessingName($format, $values);
         $preprocessing->format = $format;
         $preprocessing->user = $this->getCurrentUser();
         $this->preprocessingsFacade->savePreprocessing($preprocessing);
         foreach ($values['valuesBins'] as $valuesBinValues) {
             $valuesBin = new ValuesBin();
             $valuesBin->format = $format;
             $valuesBin->name = $valuesBinValues['name'];
             $this->metaAttributesFacade->saveValuesBin($valuesBin);
             foreach ($valuesBinValues['values'] as $valuesValues) {
                 try {
                     $value = $this->metaAttributesFacade->findValue($format, $valuesValues['value']);
                 } catch (\Exception $e) {
                     $value = new Value();
                     $value->value = $valuesValues['value'];
                     $this->metaAttributesFacade->saveValue($value);
                 }
                 $valuesBin->addToValues($value);
             }
             $this->metaAttributesFacade->saveValuesBin($valuesBin);
             $preprocessing->addToValuesBins($valuesBin);
         }
         $this->preprocessingsFacade->savePreprocessing($preprocessing);
         //vytvoření atributu
         $attribute = new Attribute();
         $attribute->metasource = $miner->metasource;
         $attribute->datasourceColumn = $datasourceColumn;
         $attribute->name = $values['attributeName'];
         $attribute->type = $attribute->datasourceColumn->type;
         $attribute->preprocessing = $preprocessing;
         $this->minersFacade->prepareAttribute($miner, $attribute);
         $this->metasourcesFacade->saveAttribute($attribute);
         $this->minersFacade->checkMinerState($miner, $this->getCurrentUser());
         $this->redirect('reloadUI');
         #endregion vytvoření preprocessingu
     };
     $presenter = $this;
     $form->addSubmit('storno', 'storno')->setValidationScope([])->onClick[] = function (SubmitButton $submitButton) use($presenter) {
         $values = $submitButton->getForm()->getValues();
         $presenter->redirect('addAttribute', array('column' => $values->column, 'miner' => $values->miner));
     };
     return $form;
 }