/*=============================================================================#
 # Copyright (c) 2000, 2021 IBM Corporation and others.
 # 
 # This program and the accompanying materials are made available under the
 # terms of the Eclipse Public License 2.0 which is available at
 # https://www.eclipse.org/legal/epl-2.0.
 # 
 # SPDX-License-Identifier: EPL-2.0
 # 
 # Contributors:
 #     IBM Corporation - org.eclipse.jdt: initial API and implementation
 #     Stephan Wahlbrink <sw@wahlbrink.eu> - initial API and implementation
 #=============================================================================*/

// ORG: org.eclipse.jdt.internal.ui.viewsupport.ProjectTemplateStore

package org.eclipse.statet.internal.ide.ui.preferences;

import java.io.IOException;
import java.io.Reader;
import java.io.StringReader;
import java.io.StringWriter;
import java.util.HashSet;
import java.util.Set;

import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.ProjectScope;
import org.eclipse.jface.text.templates.Template;
import org.eclipse.jface.text.templates.persistence.TemplatePersistenceData;
import org.eclipse.jface.text.templates.persistence.TemplateReaderWriter;
import org.eclipse.jface.text.templates.persistence.TemplateStore;

import org.eclipse.statet.ecommons.preferences.ui.ScopedPreferenceStore;

import org.eclipse.statet.internal.ide.ui.StatetUIPlugin;


public final class CodeGenerationTemplatesStore {
	
	
	public static final String KEY = "org.eclipse.statet.base.ui.text.custom_code_templates"; //$NON-NLS-1$
	
	public static boolean hasProjectSpecificTempates(final IProject project) {
		final String pref = new ProjectScope(project).getNode(StatetUIPlugin.BUNDLE_ID).get(KEY, null);
		if (pref != null && pref.trim().length() > 0) {
			final Reader input = new StringReader(pref);
			final TemplateReaderWriter reader= new TemplateReaderWriter();
			TemplatePersistenceData[] datas;
			try {
				datas = reader.read(input);
				return datas.length > 0;
			}
			catch (final IOException e) {
				// ignore
			}
		}
		return false;
	}
	
	
	private final TemplateStore[] fInstanceStores;
	private final TemplateStore fProjectStore;
	private boolean fDisableProjectSettings;
	
	private final String fPreferenceQualifier;
	private final String fPreferenceKey;
	
	
	public CodeGenerationTemplatesStore(final IProject project, final TemplateStore[] pluginStores) {
		this.fPreferenceQualifier = StatetUIPlugin.BUNDLE_ID;
		this.fPreferenceKey = KEY;
		
		this.fInstanceStores = pluginStores;
		
		if (project == null) {
			this.fProjectStore = null;
		} else {
			final ScopedPreferenceStore projectSettings = new ScopedPreferenceStore(new ProjectScope(project), this.fPreferenceQualifier);
			this.fProjectStore = new TemplateStore(projectSettings, this.fPreferenceKey) {
				/*
				 * Make sure we keep the id of added code templates - add removes
				 * it in the usual add() method
				 */
				@Override
				public void add(final TemplatePersistenceData data) {
					internalAdd(data);
				}
				
				@Override
				public void save() throws IOException {
					if (CodeGenerationTemplatesStore.this.fDisableProjectSettings) {
						projectSettings.setValue(CodeGenerationTemplatesStore.this.fPreferenceKey, null);
					}
					else {
						final StringWriter output = new StringWriter();
						final TemplateReaderWriter writer = new TemplateReaderWriter();
						writer.save(getTemplateData(false), output);
						
						projectSettings.setValue(CodeGenerationTemplatesStore.this.fPreferenceKey, output.toString());
					}
					if (projectSettings.needsSaving()) {
						projectSettings.save();
					}
				}
			};
		}
	}
	
	
	public TemplatePersistenceData[] getAllTemplateData() {
		if (this.fProjectStore != null) {
			return this.fProjectStore.getTemplateData(true);
		} else {
			int length = 0;
			final TemplatePersistenceData[][] datas = new TemplatePersistenceData[this.fInstanceStores.length][];
			for (int i = 0; i < this.fInstanceStores.length; i++) {
				datas[i] = this.fInstanceStores[i].getTemplateData(true);
				length += datas[i].length;
			}
			final TemplatePersistenceData[] allData = new TemplatePersistenceData[length];
			
			for (int i = 0, k = 0; i < datas.length; k += datas[i].length, i++) {
				System.arraycopy(datas[i], 0, allData, k, datas[i].length);
			}
			
			return allData;
		}
	}
	
	public TemplatePersistenceData[] getTemplateData(final int categoryIndex) {
		if (this.fProjectStore != null) {
			final TemplatePersistenceData[] data = this.fInstanceStores[categoryIndex].getTemplateData(true);
			final TemplatePersistenceData[] allProjectData = this.fProjectStore.getTemplateData(true);
			
			for (int i = 0; i < data.length; i++) {
				SEARCH_IN_PROJECT: for (int j = 0; j < allProjectData.length; j++) {
					if (data[i].getId().equals(allProjectData[j].getId() )) {
						data[i] = allProjectData[j];
						break SEARCH_IN_PROJECT;
					}
				}
			}
			return data;
		} else {
			return this.fInstanceStores[categoryIndex].getTemplateData(true);
		}
	}
	
	public Template findTemplateById(final String id) {
		Template template = null;
		if (this.fProjectStore != null) {
			template = this.fProjectStore.findTemplateById(id);
		}
		for (int i = 0; template == null && i < this.fInstanceStores.length; i++) {
			template = this.fInstanceStores[i].findTemplateById(id);
		}
		return template;
	}
	
	public TemplatePersistenceData getTemplateData(final String id) {
		TemplatePersistenceData data = null;
		if (this.fProjectStore != null) {
			data = this.fProjectStore.getTemplateData(id);
		}
		for (int i = 0; data == null && i < this.fInstanceStores.length; i++) {
			data = this.fInstanceStores[i].getTemplateData(id);
		}
		return data;
	}
	
	public TemplatePersistenceData getTemplateData(final int categoryIndex, final String id) {
		TemplatePersistenceData data = null;
		if (this.fProjectStore != null) {
			data = this.fProjectStore.getTemplateData(id);
		}
		if (data == null) {
			data = this.fInstanceStores[categoryIndex].getTemplateData(id);
		}
		return data;
	}
	
	public void load() throws IOException {
		if (this.fProjectStore != null) {
			this.fProjectStore.load();
			
			final Set<String> collectedDatas= new HashSet<>();
			TemplatePersistenceData[] datas = this.fProjectStore.getTemplateData(false);
			for (int i = 0; i < datas.length; i++) {
				collectedDatas.add(datas[i].getId());
			}
			
			for (int i = 0; i < this.fInstanceStores.length; i++) {
				datas = this.fInstanceStores[i].getTemplateData(false);
				
				for (int j = 0; j < datas.length; j++) {
					final TemplatePersistenceData orig = datas[j];
					if (!collectedDatas.contains(orig.getId())) {
						final TemplatePersistenceData copy = new TemplatePersistenceData(new Template(orig.getTemplate()), orig.isEnabled(), orig.getId());
						this.fProjectStore.add(copy);
						copy.setDeleted(true);
					}
				}
			}
		}
	}
	
	public boolean isProjectSpecific(final String id) {
		if (id == null) {
			return false;
		}
		
		if (this.fProjectStore == null) {
			return false;
		}
		else {
			final TemplatePersistenceData data = this.fProjectStore.getTemplateData(id);
			return (data != null && !data.isDeleted());
		}
	}
	
	/**
	 * Setting to globally enable/disable project settings.
	 * If enabled, template based settings are still required.
	 */
	public void setProjectSpecific(final boolean projectSpecific) {
		assert (this.fProjectStore != null);
		
		this.fDisableProjectSettings = !projectSpecific;
	}
	
	public void setProjectSpecific(final String id, final boolean projectSpecific) {
		assert (this.fProjectStore != null);
		
		final TemplatePersistenceData data = this.fProjectStore.getTemplateData(id);
		if (data != null) {
			data.setDeleted(!projectSpecific);
		}
	}
	
	public void restoreDefaults() {
		if (this.fProjectStore == null) {
			for (int i = 0; i < this.fInstanceStores.length; i++) {
				this.fInstanceStores[i].restoreDefaults();
			}
		}
		else {
			try {
				load();
			}
			catch (final IOException e) {
				StatetUIPlugin.logUnexpectedError(e);
			}
		}
	}
	
	public void save() throws IOException {
		if (this.fProjectStore == null) {
			for (int i = 0; i < this.fInstanceStores.length; i++) {
				this.fInstanceStores[i].save();
			}
		}
		else {
			this.fProjectStore.save();
		}
	}
	
	public void revertChanges() throws IOException {
		if (this.fProjectStore == null) {
			for (int i = 0; i < this.fInstanceStores.length; i++) {
				this.fInstanceStores[i].load();
			}
		}
		else {
			// nothing to do
		}
	}
	
}
