/*******************************************************************************
 * Copyright (c) 2009, 2016 xored software, Inc.  
 *
 * 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:
 *     xored software, Inc. - initial API and Implementation (Alex Panchenko)
 *******************************************************************************/
package org.eclipse.dltk.core.internal.environment;

import java.net.URI;

import org.eclipse.core.runtime.IPath;
import org.eclipse.dltk.core.environment.IEnvironment;
import org.eclipse.dltk.core.environment.IFileHandle;

/**
 * @since 2.0
 */
public abstract class LazyEnvironment implements IEnvironment {

	private static final boolean DEBUG = false;

	private final String environmentId;
	private IEnvironment environment;

	public LazyEnvironment(String environmentId) {
		this.environmentId = environmentId;
		if (DEBUG)
			System.out.println(getClass().getName() + " - created for " //$NON-NLS-1$
					+ environmentId);
	}

	private void initialize() {
		if (environment == null) {
			environment = resolveEnvironment(environmentId);
			if (DEBUG)
				if (environment != null)
					System.out
							.println(getClass().getName()
									+ " - resolved " + environmentId + " to " + environment.getClass().getSimpleName()); //$NON-NLS-1$ //$NON-NLS-2$
		}
	}

	protected abstract IEnvironment resolveEnvironment(String envId);

	@Override
	public boolean connect() {
		initialize();
		return environment != null && environment.connect();
	}

	@Override
	public String convertPathToString(IPath path) {
		initialize();
		return environment != null ? environment.convertPathToString(path)
				: path.toString();
	}

	@Override
	public String getCanonicalPath(IPath path) {
		initialize();
		return environment != null ? environment.getCanonicalPath(path) : path
				.toString();
	}

	@Override
	public IFileHandle getFile(IPath path) {
		return new LazyFileHandle(environmentId, path);
	}

	@Override
	public IFileHandle getFile(URI locationURI) {
		initialize();
		return environment != null ? environment.getFile(locationURI) : null;
	}

	@Override
	public String getId() {
		return environmentId;
	}

	@Override
	public String getName() {
		initialize();
		return environment != null ? environment.getName() : generateName();
	}

	private String generateName() {
		return getClass().getSimpleName() + '[' + environmentId + ']';
	}

	@Override
	public String getPathsSeparator() {
		initialize();
		return environment != null ? environment.getPathsSeparator() : ":"; //$NON-NLS-1$
	}

	@Override
	public char getPathsSeparatorChar() {
		initialize();
		return environment != null ? environment.getPathsSeparatorChar() : ':';
	}

	@Override
	public String getSeparator() {
		initialize();
		return environment != null ? environment.getSeparator() : "/"; //$NON-NLS-1$
	}

	@Override
	public char getSeparatorChar() {
		initialize();
		return environment != null ? environment.getSeparatorChar() : '/';
	}

	@Override
	public URI getURI(IPath location) {
		initialize();
		return environment != null ? environment.getURI(location) : null;
	}

	@Override
	public boolean isConnected() {
		initialize();
		return environment != null ? environment.isConnected() : false;
	}

	@Override
	public boolean isLocal() {
		initialize();
		return environment != null ? environment.isLocal() : false;
	}

	@Override
	public <T> T getAdapter(Class<T> adapter) {
		initialize();
		return environment != null ? environment.getAdapter(adapter) : null;
	}

	@Override
	public int hashCode() {
		return environmentId.hashCode();
	}

	@Override
	public boolean equals(Object obj) {
		if (obj instanceof IEnvironment) {
			IEnvironment other = (IEnvironment) obj;
			return environmentId.equals(other.getId());
		}
		return false;
	}

}
