/*******************************************************************************
 * Copyright (c) 2000, 2011 IBM Corporation and others.
 * All rights reserved. This program and the accompanying materials
 * are 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:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.jdt.internal.ui;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;

import org.eclipse.jface.preference.IPreferenceStore;

import org.eclipse.jface.text.templates.ContextTypeRegistry;
import org.eclipse.jface.text.templates.Template;
import org.eclipse.jface.text.templates.persistence.TemplatePersistenceData;
import org.eclipse.jface.text.templates.persistence.TemplateStore;

import org.eclipse.ui.editors.text.templates.ContributionTemplateStore;


/**
 * for compatibility only - don't use
 */
public final class CompatibilityTemplateStore extends ContributionTemplateStore {


	private org.eclipse.jdt.internal.corext.template.java.TemplateSet fLegacySet;

	public CompatibilityTemplateStore(ContextTypeRegistry registry, IPreferenceStore store, String key, org.eclipse.jdt.internal.corext.template.java.TemplateSet legacySet) {
		super(registry, store, key);
		fLegacySet= legacySet;
	}

	@Override
	public void load() throws IOException {
		super.load();

		if (fLegacySet != null) {

			List<Template> legacyTemplates= new ArrayList<Template>(Arrays.asList(fLegacySet.getTemplates()));
			fLegacySet.clear();

			TemplatePersistenceData[] datas= getTemplateData(true);
			for (Iterator<Template> it= legacyTemplates.listIterator(); it.hasNext();) {
				Template t= it.next();
				TemplatePersistenceData orig= findSimilarTemplate(datas, t, isCodeTemplates());
				if (orig == null) { // no contributed match for the old template found
					if (!isCodeTemplates())
						add(new TemplatePersistenceData(t, true));
				} else { // a contributed template seems to be the descendant of the non-id template t
					if (!orig.getTemplate().getPattern().equals(t.getPattern()))
						// add as modified contributed template if changed compared to the original
						orig.setTemplate(t);
				}
			}

			save();
			fLegacySet= null;
		}
	}

	private static TemplatePersistenceData findSimilarTemplate(TemplatePersistenceData[] datas, Template template, boolean isCodeTemplates) {
		 for (int i= 0; i < datas.length; i++) {
			TemplatePersistenceData data= datas[i];
			Template orig= data.getTemplate();
			if (isSimilar(template, orig, isCodeTemplates))
				return data;
		 }

		 return null;
	}

	private static boolean isSimilar(Template t, Template orig, boolean isCodeTemplates) {
		return orig.getName().equals(t.getName()) && orig.getContextTypeId().equals(t.getContextTypeId())
				&& (isCodeTemplates || orig.getDescription().equals(t.getDescription())); // only use description for templates (for, while...)
	}

	private boolean isCodeTemplates() {
		return fLegacySet instanceof org.eclipse.jdt.internal.corext.template.java.CodeTemplates;
	}

	/**
	 * Removes any duplicates from a template store. Duplicate user added templates
	 * are copied over their contributed siblings. If isCodeTemplates is true,
	 * any user added templates are then removed.
	 *
	 * @param store
	 * @param isCodeTemplates
	 */
	public static void pruneDuplicates(TemplateStore store, boolean isCodeTemplates) {
		TemplatePersistenceData[] datas= store.getTemplateData(true);
		for (int i= datas.length - 1; i >= 0; i--) {
			TemplatePersistenceData data= datas[i];
			if (data.isUserAdded()) {
				// find a contributed template that is similar and check it
				TemplatePersistenceData similar= findSimilarTemplate(datas, data.getTemplate(), isCodeTemplates);
				if (similar != data && !similar.isUserAdded()) {
					similar.setTemplate(data.getTemplate());
					store.delete(data);
				}
			}
		}

		if (isCodeTemplates) {
			datas= store.getTemplateData(true);
			for (int i= datas.length - 1; i >= 0; i--) {
				if (datas[i].isUserAdded())
					store.delete(datas[i]);
			}
		}
	}
}
