/*
 *                 Sun Public License Notice
 *
 * The contents of this file are subject to the Sun Public License
 * Version 1.0 (the "License"). You may not use this file except in
 * compliance with the License. A copy of the License is available at
 * http://www.sun.com/
 *
 * The Original Code is NetBeans. The Initial Developer of the Original
 * Code is Sun Microsystems, Inc. Portions Copyright 1997-2000 Sun
 * Microsystems, Inc. All Rights Reserved.
 */
package org.netbeans.lib.cvsclient.file;

import org.netbeans.lib.cvsclient.util.BugLog;

/**
 * Thiz represents a relative file name relative to an root entry (normally directory).
 *
 * @author  Thomas Singer
 */
public abstract class AbstractFileObject {

	// Abstract ===============================================================

	public abstract boolean isDirectory();

	// Fields =================================================================

	private final String path;

	// Setup ==================================================================

	protected AbstractFileObject(String path) {
		BugLog.getInstance().assertNotNull(path);
		BugLog.getInstance().assertTrue(path.startsWith("/"), "'" + path + "' must start with a /");
		BugLog.getInstance().assertTrue(path.length() == 1 || !path.endsWith("/"), "'" + path + "' must end with a /");

		this.path = path;
	}

	// Implemented ============================================================

	public final String toString() {
		return path;
	}

	public final int hashCode() {
		return path.hashCode();
	}

	public final boolean equals(Object obj) {
		if (obj == null || obj.getClass() != getClass()) {
			return false;
		}

		final AbstractFileObject abstractFileObject = (AbstractFileObject)obj;
		return path.equals(abstractFileObject.path);
	}

	// Accessing ==============================================================

	public final String getName() {
		final int lastSlashIndex = path.lastIndexOf('/');
		if (lastSlashIndex < 0) {
			return path;
		}
		return path.substring(lastSlashIndex + 1);
	}

	public final String getPath() {
		return path;
	}

	public final DirectoryObject getParent() {
		if (isRoot()) {
			return null;
		}

		final int lastSlashIndex = path.lastIndexOf('/');
		if (lastSlashIndex == 0) {
			return DirectoryObject.getRoot();
		}

		return DirectoryObject.createInstance(path.substring(0, lastSlashIndex));
	}

	public final String getParentPath() {
		if (isRoot()) {
			return null;
		}

		final int lastSlashIndex = path.lastIndexOf('/');
		if (lastSlashIndex == 0) {
			return "/";
		}

		return path.substring(0, lastSlashIndex);
	}

	public final String toUnixPath() {
		final String pathWithoutLeadingSlash = getPath().substring(1);
		if (pathWithoutLeadingSlash.length() == 0) {
			return ".";
		}
		return pathWithoutLeadingSlash;
	}

	public final boolean isRoot() {
		return path.equals("/");
	}

	public static DirectoryObject getCommonDirectory(AbstractFileObject abstractFileObject1, AbstractFileObject abstractFileObject2) {
		final String parentPath1 = getDirectory(abstractFileObject1).getPath();
		final String parentPath2 = getDirectory(abstractFileObject2).getPath();

		final int parentPathLength1 = parentPath1.length();
		final int parentPathLength2 = parentPath2.length();
		final int length = Math.min(parentPathLength1, parentPathLength2);
		int lastSlashIndex = 1;
		for (int i = 1; i < length; i++) {
			final char chr1 = parentPath1.charAt(i);
			final char chr2 = parentPath2.charAt(i);
			if (chr1 != chr2) {
				return DirectoryObject.createInstance(parentPath1.substring(0, lastSlashIndex));
			}

			if (chr1 == '/') {
				lastSlashIndex = i;
			}
		}

		if (parentPathLength1 == parentPathLength2) {
			return DirectoryObject.createInstance(parentPath1);
		}

		if (parentPathLength1 > parentPathLength2) {
            if (parentPath1.charAt(parentPathLength2) == '/') {
                return DirectoryObject.createInstance(parentPath2);
            }
			return DirectoryObject.createInstance(parentPath1.substring(0, lastSlashIndex));
		}
		else {
			if (parentPath2.charAt(parentPathLength1) == '/') {
			    return DirectoryObject.createInstance(parentPath1);
			}
			return DirectoryObject.createInstance(parentPath1.substring(0, lastSlashIndex));
		}
	}

	private static DirectoryObject getDirectory(AbstractFileObject abstractFileObject) {
		if (abstractFileObject.isDirectory()) {
			return (DirectoryObject)abstractFileObject;
		}
		return abstractFileObject.getParent();
	}
}
