/*******************************************************************************
 * Copyright (c) 2011 SAP AG, Walldorf
 * 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:
 *    SAP AG - initial API and implementation
 *******************************************************************************/
package org.eclipse.platform.discovery.compatibility.internal.contributors.impl;

import org.eclipse.platform.discovery.compatibility.internal.readers.ISearchPageDescription;
import org.eclipse.platform.discovery.runtime.internal.model.descriptions.ISearchProviderDescription;

import static org.eclipse.platform.discovery.util.internal.ContractChecker.nullCheckParam;

public class IdCalculator {
	
	private static final String SEARCHPROVIDER = "searchprovider";
	private static final String OBJECTTYPE = "objecttype";
	private static final String DOT = "."; //$NON-NLS-1$
	private static final String COMPATIBILITY = "compatibility";
	private static final String SEARCHPARAMSUI = "searchparamsui";
	private static final String SEARCHRESULTUI  = "searchresultui";

	public String calculateObjectTypeId(ISearchPageDescription description) {
		return calculateObjectTypeId(description.getId());
	}
	
	public String calculateObjectTypeId(String searchPageId) {
		nullCheckParam(searchPageId);
		return searchPageId + DOT + COMPATIBILITY + DOT + OBJECTTYPE; //$NON-NLS-1$
	}
	
	public String calculateSearchProviderId(ISearchPageDescription description) {
		return calculateSearchProviderId(description.getId());
	}

	public String calculateSearchProviderId(String searchPageId) {
		nullCheckParam(searchPageId);
		return searchPageId + DOT + COMPATIBILITY + DOT + SEARCHPROVIDER; //$NON-NLS-1$
	}
	
	public String calculateSearchParametersUiId(ISearchPageDescription description) {
		return calculateSearchParametersUiId(description.getId());
	}
	
	public String calculateSearchParametersUiId(String searhpageId) {
		nullCheckParam(searhpageId);
		return searhpageId + DOT + COMPATIBILITY + DOT + SEARCHPARAMSUI;
	}
	
	public String calculateSearchPageId(String searchProviderId) {
		return searchProviderId.replace(DOT+COMPATIBILITY+DOT+SEARCHPROVIDER, "");
	}
	
	public String calculateResultUiId(ISearchPageDescription desc) {
		return calculateSearchResultUiId(desc.getId());
	}
	
	public String calculateSearchResultUiId(String searchPageId) {
		return searchPageId + DOT + COMPATIBILITY + DOT + SEARCHRESULTUI;
	}
	
	public boolean isCompatibilitySearchProvider(ISearchProviderDescription providerDescription) {
		return providerDescription.getId().endsWith(DOT + COMPATIBILITY + DOT + SEARCHPROVIDER);
	}
}
