package com.airlock.iam.plugin.configeditor.field;

import com.airlock.iam.elog.api.ELogger;
import com.airlock.iam.elog.api.ELoggerFactory;
import com.airlock.iam.elog.api.LogTypes;
import com.airlock.iam.plugin.api.exception.InitializeException;
import com.airlock.iam.plugin.configeditor.ConfigEditorApplication;
import com.airlock.iam.plugin.configeditor.data.PluginConfigurationFormItem;
import com.airlock.iam.plugin.configeditor.util.PluginDocumentation;
import com.airlock.iam.plugin.framework.application.configuration.MutablePluginConfiguration;
import com.vaadin.server.Sizeable.Unit;
import com.vaadin.v7.data.fieldgroup.DefaultFieldGroupFieldFactory;
import com.vaadin.v7.ui.DefaultFieldFactory;
import com.vaadin.v7.ui.Field;
import com.vaadin.v7.ui.TextArea;

public class PluginConfigurationFieldFactory extends DefaultFieldGroupFieldFactory {
   private static final ELogger LOG = ELoggerFactory.getLogger(PluginConfigurationFieldFactory.class);
   static final int FIELD_WIDTH_WIDE = 360;
   private final ConfigEditorApplication app;

   public PluginConfigurationFieldFactory(ConfigEditorApplication app) {
      this.app = app;
   }

   public Field<?> createField(PluginConfigurationFormItem pcfItem, Object propertyId) {
      Field<?> field = null;
      pcfItem.getItemProperty(propertyId).setReadOnly(false);
      if (propertyId.equals("parentConfiguration")) {
         MutablePluginConfiguration child = (MutablePluginConfiguration)pcfItem.getBean();
         ParentConfigurationField pcf = new ParentConfigurationField(child, this.app);

         try {
            pcf.getInnerField().initSelectablePlugins(child, child.getPluginClass(), this.app.getSelectedConfigurationEnvironment());
            pcf.getInnerField().removePluginsWithoutDisplayName();
         } catch (InitializeException e) {
            LOG.error(LogTypes.CONFIGURATION_ERROR, "Initialize Exception: " + e.getMessage(), e);
         }

         pcf.setCaption(null);
         field = pcf;
      } else if (propertyId.equals("displayName")) {
         PluginNameField pcf = new PluginNameField();
         this.createPluginDocumentation(pcfItem, pcf);
         pcf.setWidth(360.0F, Unit.PIXELS);
         pcf.setCaption(null);
         field = pcf;
      } else if (propertyId.equals("comment")) {
         TextArea rta = new TextArea();
         rta.setWidth("100%");
         rta.setHeight(124.0F, Unit.PIXELS);
         rta.setCaption(null);
         rta.setDescription(DefaultFieldFactory.createCaptionByPropertyId(propertyId));
         rta.setNullRepresentation("");
         rta.setWordwrap(true);
         field = rta;
      } else if (propertyId.equals("identifier")) {
         field = new PluginDisplayNameField(pcfItem, propertyId).getField();
      } else if (propertyId.equals("uuid")) {
         field = new PluginIdentifierField(pcfItem).getField();
      }

      return field;
   }

   private void createPluginDocumentation(PluginConfigurationFormItem pcfItem, PluginNameField pcf) {
      try {
         String documentation = PluginDocumentation.buildDocumentation(((MutablePluginConfiguration)pcfItem.getBean()).getPluginClass());
         pcf.setInfo(documentation);
      } catch (InitializeException e) {
         LOG.error(LogTypes.CONFIGURATION_ERROR, "Initialize Exception: " + e.getMessage(), e);
      }
   }
}
