/*******************************************************************************
 * Copyright (c) 2007 Exadel, Inc. and 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:
 *     Exadel, Inc. and Red Hat, Inc. - initial API and implementation
 ******************************************************************************/ 
package org.jboss.tools.jsf.model.handlers.tile;

import java.util.Properties;
import org.jboss.tools.common.meta.action.SpecialWizard;
import org.jboss.tools.common.meta.action.XActionInvoker;
import org.jboss.tools.common.model.XModel;
import org.jboss.tools.common.model.XModelException;
import org.jboss.tools.common.model.XModelObject;
import org.jboss.tools.common.model.plugin.ModelPlugin;
import org.jboss.tools.jsf.model.pv.JSFProjectTiles;
import org.jboss.tools.jst.web.model.helpers.WebAppHelper;

public class TilesFileRegistration implements SpecialWizard {
	Properties p;
	XModel model;
	XModelObject webxml;
	String oldPath;
	String path;
	boolean test;

	public void setObject(Object object) {
		p = (Properties)object;
		model = (XModel)p.get("model"); //$NON-NLS-1$
		webxml = WebAppHelper.getWebApp(model);
		path = p.getProperty("path"); //$NON-NLS-1$
		oldPath = p.getProperty("oldPath"); //$NON-NLS-1$
		test = "true".equals(p.getProperty("test")); //$NON-NLS-1$ //$NON-NLS-2$
	}

	public int execute() {
		if(webxml == null) return 1;
		try {
			return doExecute();
		} catch (XModelException e) {
			ModelPlugin.getPluginLog().logError(e);
			if(p != null) p.put("exception", e); //$NON-NLS-1$
			return 1;
		}
	}
	
	private int doExecute() throws XModelException {
		if(test) {
			return test();
		} else if(path == null && oldPath != null) {
			remove();
		} else if(path == null) {
			return 1;
		} else if(oldPath != null) {
			replace(); 
		} else {
			append();
		}
		XActionInvoker.invoke("SaveActions.Save", webxml, null); //$NON-NLS-1$
		return 0;
	}
	
	void append() throws XModelException {
		XModelObject context = WebAppHelper.findWebAppContextParam(webxml, JSFProjectTiles.TILES_DEFINITIONS_2);
		if(context != null) {
			WebAppHelper.appendToWebAppContextParam(webxml, JSFProjectTiles.TILES_DEFINITIONS_2, path);
		} else {
			XModelObject servlet = WebAppHelper.findOrCreateServlet(webxml, JSFProjectTiles.TILES_SERVLET_CLASS, JSFProjectTiles.TILES_SERVLET_DEFAULT_NAME, 2);
			WebAppHelper.appendToWebAppInitParam(servlet, JSFProjectTiles.TILES_DEFINITIONS, path);
		}
	}
	
	void replace() throws XModelException {
		XModelObject context = WebAppHelper.findWebAppContextParam(webxml, JSFProjectTiles.TILES_DEFINITIONS_2);
		String[] s = null;
		XModelObject servlet = null;
		if(context != null) {
			s = WebAppHelper.getWebAppContextParamValueList(webxml, JSFProjectTiles.TILES_DEFINITIONS_2);
		} else {
			servlet = WebAppHelper.findOrCreateServlet(webxml, JSFProjectTiles.TILES_SERVLET_CLASS, JSFProjectTiles.TILES_SERVLET_DEFAULT_NAME, 2);
			s = WebAppHelper.getWebAppInitParamValueList(servlet, JSFProjectTiles.TILES_DEFINITIONS);
		}
		StringBuilder sb = new StringBuilder();
		boolean replaced = false;
		for (int i = 0; i < s.length; i++) {
			String add = null;
			if(s[i].equals(oldPath)) {
				add = path;
				replaced = true;
			} else {
				add = s[i];
			}
			if(add != null) {
				if(sb.length() > 0) sb.append(","); //$NON-NLS-1$
				sb.append(add);
			}
		}
		if(!replaced && path != null) {
			if(sb.length() > 0) sb.append(","); //$NON-NLS-1$
			sb.append(path);
		}
		if(context != null) {
			WebAppHelper.setWebAppContextParam(webxml, JSFProjectTiles.TILES_DEFINITIONS_2, sb.toString());
		} else {
			WebAppHelper.setWebAppInitParam(servlet, JSFProjectTiles.TILES_DEFINITIONS, sb.toString());
		}
		p.setProperty("success", "true"); //$NON-NLS-1$ //$NON-NLS-2$
	}
	
	int test() throws XModelException {
		if(path == null) return 1;
		XModelObject context = WebAppHelper.findWebAppContextParam(webxml, JSFProjectTiles.TILES_DEFINITIONS_2);
		String[] s = null;
		XModelObject servlet = null;
		if(context != null) {
			s = WebAppHelper.getWebAppContextParamValueList(webxml, JSFProjectTiles.TILES_DEFINITIONS_2);
		} else {
			servlet = WebAppHelper.findOrCreateServlet(webxml, JSFProjectTiles.TILES_SERVLET_CLASS, JSFProjectTiles.TILES_SERVLET_DEFAULT_NAME, 2);
			s = WebAppHelper.getWebAppInitParamValueList(servlet, JSFProjectTiles.TILES_DEFINITIONS);
		}
		for (int i = 0; i < s.length; i++) {
			if(s[i].equals(path)) {
				return 0;
			}
		}
		return 1;
	}
	
	void remove() throws XModelException {
		replace();
	}
	
}
