/*******************************************************************************
 * Copyright (c) 2008 Red Hat, Inc.
 * Distributed under license by Red Hat, Inc. All rights reserved.
 * This program is made available under the terms of the
 * Eclipse Public License v1.0 which accompanies this distribution,
 * and is available at http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *     Red Hat, Inc. - initial API and implementation
 ******************************************************************************/
package org.jboss.tools.smooks.graphical.editors.template;

import java.util.Collection;
import java.util.Iterator;
import java.util.List;

import org.eclipse.emf.common.command.Command;
import org.eclipse.emf.edit.domain.AdapterFactoryEditingDomain;
import org.eclipse.gef.EditPartFactory;
import org.jboss.tools.smooks.SmooksModelUtils;
import org.jboss.tools.smooks.editor.ISmooksModelProvider;
import org.jboss.tools.smooks.gef.model.AbstractSmooksGraphicalModel;
import org.jboss.tools.smooks.gef.tree.model.TreeNodeConnection;
import org.jboss.tools.smooks.graphical.editors.Messages;
import org.jboss.tools.smooks.graphical.editors.autolayout.IAutoLayout;
import org.jboss.tools.smooks.graphical.editors.editparts.freemarker.FreemarkerAutoLayout;
import org.jboss.tools.smooks.graphical.editors.model.freemarker.FreemarkerActionCreator;
import org.jboss.tools.smooks.graphical.editors.process.TaskType;
import org.jboss.tools.smooks.model.freemarker.Freemarker;
import org.jboss.tools.smooks.model.smooks.ParamType;

/**
 * @author Dart
 * 
 */
public class SmooksFreemarkerCSVTemplateGraphicalEditor extends SmooksFreemarkerTemplateGraphicalEditor {

	public static final String ID = "__smooks_freemarker_csv_template_graphical_editpart"; //$NON-NLS-1$

	private IAutoLayout autoLayout = null;

	public SmooksFreemarkerCSVTemplateGraphicalEditor(ISmooksModelProvider provider) {
		super(provider);
		// TODO Auto-generated constructor stub
	}

	protected void autoLayoutWhenCommandChange(Command command) {
		Collection<?> affectedObjects = command.getAffectedObjects();
		for (Iterator<?> iterator2 = affectedObjects.iterator(); iterator2.hasNext();) {
			Object object = (Object) iterator2.next();
			if (object instanceof ParamType) {
				Object parent = ((ParamType) object).eContainer();
				if (SmooksModelUtils.KEY_CSV_FIELDS.equals(((ParamType) object).getName())) {
					if (parent instanceof Freemarker) {
						TaskType task = this.getTaskType();
						if (task != null && task.inTheTask((Freemarker)parent)) {
							autoLayout(true);
							break;
						}
					}
				}
			}
		}
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @seeorg.jboss.tools.smooks.graphical.editors.SmooksGraphicalEditorPart#
	 * createEdtiPartFactory()
	 */
	@Override
	protected EditPartFactory createEdtiPartFactory() {
		return super.createEdtiPartFactory();
	}


	/* (non-Javadoc)
	 * @see org.jboss.tools.smooks.graphical.editors.SmooksFreemarkerTemplateGraphicalEditor#validateTemplate(java.lang.String, org.jboss.tools.smooks.gef.model.AbstractSmooksGraphicalModel)
	 */
	@Override
	protected void validateTemplate(String type, AbstractSmooksGraphicalModel templateGraphModel) {
		if (SmooksModelUtils.FREEMARKER_TEMPLATE_TYPE_CSV.equals(type)) {
			validateCSVTemplate(templateGraphModel);
		}
//		super.validateTemplate(type, templateGraphModel);
	}

	protected void validateCSVTemplate(AbstractSmooksGraphicalModel templateGraphModel) {
		int s = AbstractSmooksGraphicalModel.NONE;
		Object data = templateGraphModel.getData();
		data = AdapterFactoryEditingDomain.unwrap(data);

		char seperator = SmooksModelUtils.getFreemarkerCSVSeperator((Freemarker) data);

		if (seperator == 0) {
			templateGraphModel.getMessage().add(Messages.SmooksFreemarkerTemplateGraphicalEditor_Warning_Separator_Empty);
			s = AbstractSmooksGraphicalModel.WARNING;
		}

		char quote = SmooksModelUtils.getFreemarkerCSVQuote((Freemarker) data);
		if (quote == 0) {
			templateGraphModel.getMessage().add(Messages.SmooksFreemarkerTemplateGraphicalEditor_Warning_Quote_Empty);
			s = AbstractSmooksGraphicalModel.WARNING;
		}

		String[] fields = SmooksModelUtils.getFreemarkerCSVFileds((Freemarker) data);
		boolean missFields = false;
		if (fields == null) {
			missFields = true;
		}

		if (s != AbstractSmooksGraphicalModel.NONE) {
			templateGraphModel.setSeverity(s);
		}

		List<AbstractSmooksGraphicalModel> csvRecordNode = templateGraphModel.getChildren();
		for (Iterator<?> iterator = csvRecordNode.iterator(); iterator.hasNext();) {
			AbstractSmooksGraphicalModel csvRecordGraphModel = (AbstractSmooksGraphicalModel) iterator.next();
			if (missFields) {
				csvRecordGraphModel.getMessage().add(Messages.SmooksFreemarkerTemplateGraphicalEditor_Warning_CSV_Fields_Empty);
				csvRecordGraphModel.setSeverity(AbstractSmooksGraphicalModel.WARNING);
			}
			List<TreeNodeConnection> collectionConnections = csvRecordGraphModel.getTargetConnections();
			if (collectionConnections.isEmpty()) {
				csvRecordGraphModel.addMessage(Messages.SmooksFreemarkerTemplateGraphicalEditor_Warning_Must_Link_to_Collection);
				csvRecordGraphModel.setSeverity(AbstractSmooksGraphicalModel.WARNING);
				List<AbstractSmooksGraphicalModel> csvFields = csvRecordGraphModel.getChildren();
				for (Iterator<?> iterator2 = csvFields.iterator(); iterator2.hasNext();) {
					AbstractSmooksGraphicalModel csvFieldsGModel = (AbstractSmooksGraphicalModel) iterator2.next();
					csvFieldsGModel
							.addMessage(Messages.SmooksFreemarkerTemplateGraphicalEditor_Warning_Must_Link_CSV_Record);
					csvFieldsGModel.setSeverity(AbstractSmooksGraphicalModel.ERROR);
				}
			}
		}
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @seeorg.jboss.tools.smooks.graphical.editors.SmooksGraphicalEditorPart#
	 * getAutoLayout()
	 */
	@Override
	public IAutoLayout getAutoLayout() {
		if (autoLayout == null) {
			autoLayout = new FreemarkerAutoLayout();
		}
		return autoLayout;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @seeorg.jboss.tools.smooks.graphical.editors.SmooksGraphicalEditorPart#
	 * createActions()
	 */
	@Override
	protected void createActions() {
		super.createActions();
		FreemarkerActionCreator creator = new FreemarkerActionCreator();
		creator.registActions(getActionRegistry(), getSelectionActions(), this, this.smooksModelProvider);
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see
	 * org.jboss.tools.smooks.graphical.editors.SmooksGraphicalEditorPart#getID
	 * ()
	 */
	@Override
	public String getID() {
		return SmooksFreemarkerTemplateGraphicalEditor.ID;
	}
}
