/*******************************************************************************
 * Copyright (c) 2008, 2009 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 - Initial API and implementation
 *******************************************************************************/
package org.eclipse.ptp.rdt.server.dstore.core;

import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.Path;
import org.eclipse.ptp.internal.rdt.core.callhierarchy.ICallHierarchyService;
import org.eclipse.ptp.internal.rdt.core.callhierarchy.RemoteCallHierarchyService;
import org.eclipse.ptp.internal.rdt.core.includebrowser.IIncludeBrowserService;
import org.eclipse.ptp.internal.rdt.core.includebrowser.RemoteIncludeBrowserService;
import org.eclipse.ptp.internal.rdt.core.index.IIndexLifecycleService;
import org.eclipse.ptp.internal.rdt.core.index.RemoteIndexLifecycleService;
import org.eclipse.ptp.internal.rdt.core.model.IModelBuilderService;
import org.eclipse.ptp.internal.rdt.core.model.RemoteModelBuilderService;
import org.eclipse.ptp.internal.rdt.core.navigation.INavigationService;
import org.eclipse.ptp.internal.rdt.core.navigation.RemoteNavigationService;
import org.eclipse.ptp.internal.rdt.core.typehierarchy.ITypeHierarchyService;
import org.eclipse.ptp.internal.rdt.core.typehierarchy.RemoteTypeHierarchyService;
import org.eclipse.ptp.internal.rdt.ui.contentassist.IContentAssistService;
import org.eclipse.ptp.internal.rdt.ui.contentassist.RemoteContentAssistService;
import org.eclipse.ptp.internal.rdt.ui.search.ISearchService;
import org.eclipse.ptp.internal.rdt.ui.search.RemoteSearchService;
import org.eclipse.ptp.rdt.server.dstore.messages.Messages;
import org.eclipse.ptp.rdt.ui.serviceproviders.IRemoteToolsIndexServiceProvider;
import org.eclipse.ptp.remote.core.IRemoteConnection;
import org.eclipse.ptp.remote.core.IRemoteServices;
import org.eclipse.ptp.remote.core.PTPRemoteCorePlugin;
import org.eclipse.ptp.services.core.IServiceProvider;
import org.eclipse.ptp.services.core.IServiceProviderWorkingCopy;
import org.eclipse.ptp.services.core.ServiceProvider;

public class RemoteToolsCIndexServiceProvider extends ServiceProvider implements IRemoteToolsIndexServiceProvider,
		IServiceProviderWorkingCopy {

	protected IIndexLifecycleService fIndexLifecycleService = null;
	protected INavigationService fNavigationService = null;
	protected ICallHierarchyService fCallHierarchyService = null;
	protected ITypeHierarchyService fTypeHierarchyService = null;
	protected IIncludeBrowserService fIncludeBrowserService = null;
	protected IModelBuilderService fModelBuilderService = null;
	protected RemoteSearchService fSearchService = null;
	protected IContentAssistService fContentAssistService = null;
	protected RemoteToolsCIndexSubsystem fSubsystem = null;
	protected boolean fIsDirty = false;
	protected RemoteToolsCIndexServiceProvider fProvider = null;
	protected boolean fIsConfigured = false;

	public static final String NAME = Messages.RemoteToolsCIndexServiceProvider_0;
	public static final String SERVICE_ID = "org.eclipse.ptp.rdt.core.CIndexingService"; //$NON-NLS-1$

	private static final String SERVICE_ID_KEY = "service-name"; //$NON-NLS-1$
	private static final String CONNECTION_NAME_KEY = "connection-name"; //$NON-NLS-1$
	private static final String INDEX_LOCATION_KEY = "index-location"; //$NON-NLS-1$

	public RemoteToolsCIndexServiceProvider() {
	}

	public RemoteToolsCIndexServiceProvider(RemoteToolsCIndexServiceProvider provider) {
		fProvider = provider;
		setProperties(provider.getProperties());
		setDescriptor(provider.getDescriptor());
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.ptp.services.core.ServiceProvider#copy()
	 */
	@Override
	public IServiceProviderWorkingCopy copy() {
		return new RemoteToolsCIndexServiceProvider(this);
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.ptp.rdt.core.serviceproviders.IIndexServiceProvider#
	 * getCallHierarchyService()
	 */
	public synchronized ICallHierarchyService getCallHierarchyService() {
		if (!isConfigured())
			return null;

		if (fCallHierarchyService == null)
			fCallHierarchyService = new RemoteCallHierarchyService(fSubsystem);

		return fCallHierarchyService;
	}

	/**
	 * Get the host name for this connection.
	 * 
	 * @return host name
	 */
	public String getConnectionName() {
		return getString(CONNECTION_NAME_KEY, null);
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.ptp.rdt.ui.serviceproviders.IIndexServiceProvider2#
	 * getContentAssistService()
	 */
	public IContentAssistService getContentAssistService() {
		if (!isConfigured())
			return null;

		if (fContentAssistService == null)
			fContentAssistService = new RemoteContentAssistService(fSubsystem);

		return fContentAssistService;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.ptp.rdt.core.serviceproviders.IIndexServiceProvider#
	 * getIncludeBrowserService()
	 */
	public synchronized IIncludeBrowserService getIncludeBrowserService() {
		if (!isConfigured())
			return null;

		if (fIncludeBrowserService == null)
			fIncludeBrowserService = new RemoteIncludeBrowserService(fSubsystem);

		return fIncludeBrowserService;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.ptp.rdt.core.serviceproviders.IIndexServiceProvider#
	 * getIndexLifeCycleService()
	 */
	public synchronized IIndexLifecycleService getIndexLifeCycleService() {
		if (!isConfigured())
			return null;

		if (fIndexLifecycleService == null)
			fIndexLifecycleService = new RemoteIndexLifecycleService(fSubsystem);

		return fIndexLifecycleService;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.ptp.rdt.core.serviceproviders.IIndexServiceProvider#
	 * getIndexLocation()
	 */
	public String getIndexLocation() {
		initialize();
		return getString(INDEX_LOCATION_KEY, ""); //$NON-NLS-1$
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.ptp.rdt.core.serviceproviders.IIndexServiceProvider#
	 * getModelBuilderService()
	 */
	public synchronized IModelBuilderService getModelBuilderService() {
		if (!isConfigured())
			return null;

		if (fModelBuilderService == null)
			fModelBuilderService = new RemoteModelBuilderService(fSubsystem);

		return fModelBuilderService;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.ptp.rdt.core.serviceproviders.IIndexServiceProvider#
	 * getNavigationService()
	 */
	public synchronized INavigationService getNavigationService() {
		if (!isConfigured())
			return null;

		if (fNavigationService == null)
			fNavigationService = new RemoteNavigationService(fSubsystem);

		return fNavigationService;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see
	 * org.eclipse.ptp.services.core.IServiceProviderWorkingCopy#getOriginal()
	 */
	public IServiceProvider getOriginal() {
		return fProvider;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see
	 * org.eclipse.ptp.rdt.ui.serviceproviders.IRemoteToolsIndexServiceProvider#
	 * getConnection()
	 */
	public IRemoteConnection getConnection() {
		if (!isConfigured()) {
			return null;
		}
		return getRemoteServices().getConnectionManager().getConnection(getConnectionName());
	}

	private IRemoteServices getRemoteServices() {
		if (!isConfigured()) {
			return null;
		}
		return PTPRemoteCorePlugin.getDefault().getRemoteServices(getServiceId());
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.ptp.rdt.ui.serviceproviders.IIndexServiceProvider2#
	 * getSearchService()
	 */
	public ISearchService getSearchService() {
		if (!isConfigured())
			return null;

		if (fSearchService == null)
			fSearchService = new RemoteSearchService(fSubsystem);

		return fSearchService;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.ptp.services.core.ServiceProvider#getServiceId()
	 */
	@Override
	public String getServiceId() {
		return getString(SERVICE_ID_KEY, null);
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.ptp.rdt.core.serviceproviders.IIndexServiceProvider#
	 * getTypeHierarchyService()
	 */
	public synchronized ITypeHierarchyService getTypeHierarchyService() {
		if (!isConfigured())
			return null;

		if (fTypeHierarchyService == null)
			fTypeHierarchyService = new RemoteTypeHierarchyService(fSubsystem);

		return fTypeHierarchyService;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.ptp.services.core.IServiceProvider#isConfigured()
	 */
	public boolean isConfigured() {
		initialize();
		return fIsConfigured;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.ptp.services.core.IServiceProviderWorkingCopy#isDirty()
	 */
	public boolean isDirty() {
		return fIsDirty;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see
	 * org.eclipse.ptp.services.core.ServiceProvider#putString(java.lang.String,
	 * java.lang.String)
	 */
	@Override
	public void putString(String key, String value) {
		fIsDirty = true;
		super.putString(key, value);
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.ptp.services.core.IServiceProviderWorkingCopy#save()
	 */
	public void save() {
		if (fProvider != null) {
			fProvider.setProperties(getProperties());
			fIsDirty = false;
		}
	}

	/**
	 * @param isConfigured
	 */
	public void setConfigured(boolean isConfigured) {
		fIsConfigured = isConfigured;
	}

	/**
	 * Set a new connection for this service provider. This will reset the index
	 * and DStore server locations to their default values.
	 * 
	 * @param connection
	 *            new connection
	 */
	public void setConnection(IRemoteConnection connection) {
		setConnection(connection, true);
	}

	/**
	 * Set the host name for this connection
	 * 
	 * @param hostName
	 */
	public void setConnectionName(String connectionName) {
		putString(CONNECTION_NAME_KEY, connectionName);
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.ptp.rdt.core.serviceproviders.IIndexServiceProvider#
	 * setIndexLocation(java.lang.String)
	 */
	public void setIndexLocation(String path) {
		putString(INDEX_LOCATION_KEY, path);
	}

	/**
	 * @param serviceId
	 */
	public void setServiceId(String serviceId) {
		putString(SERVICE_ID_KEY, serviceId);
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see java.lang.Object#toString()
	 */
	@Override
	public String toString() {
		return "RemoteToolsCIndexServiceProvider(" + getIndexLocation() + ")"; //$NON-NLS-1$ //$NON-NLS-2$
	}

	private void initialize() {
		if (fSubsystem == null && getServiceId() != null) {
			IRemoteServices services = PTPRemoteCorePlugin.getDefault().getRemoteServices(getServiceId());
			if (services != null && getConnectionName() != null) {
				IRemoteConnection connection = services.getConnectionManager().getConnection(getConnectionName());
				setConnection(connection, false);
			}
		}
	}

	/**
	 * Set a new connection for this service provider. If reset is true the
	 * index and DStore server locations will be reset to their default values.
	 * 
	 * @param connection
	 *            new connection
	 * @param reset
	 *            reset locations to defaults
	 */
	private void setConnection(IRemoteConnection connection, boolean reset) {
		setServiceId(connection.getRemoteServices().getId());
		setConnectionName(connection.getName());
		if (reset) {
			IPath workingDir = new Path(connection.getWorkingDirectory());
			setIndexLocation(workingDir.append(".eclipsesettings").toString()); //$NON-NLS-1$
		}
		if (fSubsystem != null) {
			fSubsystem.dispose();
		}
		fSubsystem = new RemoteToolsCIndexSubsystem(this);
		setConfigured(true);
	}

}
