/*=============================================================================#
 # Copyright (c) 2012, 2021 Original NatTable authors 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:
 #     Original NatTable authors and others - initial API and implementation
 #=============================================================================*/

package org.eclipse.statet.ecommons.waltable.layer;

import static org.eclipse.statet.ecommons.waltable.coordinate.Orientation.HORIZONTAL;
import static org.eclipse.statet.ecommons.waltable.coordinate.Orientation.VERTICAL;

import org.eclipse.statet.ecommons.waltable.coordinate.PositionOutOfBoundsException;


public class LayerUtil {
	
	
	/**
	 * Convert column/row position from the source layer to the target layer
	 * @param sourceLayer source layer
	 * @param sourceColumnPosition column position in the source layer
	 * @param targetLayer layer to convert the from position to 
	 * @return converted position, or ILayerDim.POSITION_NA if conversion not possible
	 */
	public static final long convertPosition(final ILayerDim sourceDim,
			final long sourceRefPosition, final long sourcePosition,
			final ILayerDim targetDim) {
		if (targetDim == sourceDim) {
			return sourcePosition;
		}
		
		try {
			final long id= sourceDim.getPositionId(sourceRefPosition, sourcePosition);
			return targetDim.getPositionById(id);
		}
		catch (final PositionOutOfBoundsException e) {
			return ILayerDim.POSITION_NA;
		}
	}
	
	/**
	 * Convert column position from the source layer to the target layer
	 * @param sourceLayer source layer
	 * @param sourceColumnPosition column position in the source layer
	 * @param targetLayer layer to convert the from position to 
	 * @return converted column position, or -1 if conversion not possible
	 */
	public static final long convertColumnPosition(final ILayer sourceLayer,
			final long sourceColumnPosition, final ILayer targetLayer) {
		return convertPosition(sourceLayer.getDim(HORIZONTAL),
				sourceColumnPosition, sourceColumnPosition,
				targetLayer.getDim(HORIZONTAL) );
	}
	
	/**
	 * Convert row position from the source layer to the target layer
	 * @param sourceLayer source layer
	 * @param sourceRowPosition position in the source layer
	 * @param targetLayer layer to convert the from position to 
	 * @return converted row position, or -1 if conversion not possible
	 */
	public static final long convertRowPosition(final ILayer sourceLayer,
			final long sourceRowPosition, final ILayer targetLayer) {
		return convertPosition(sourceLayer.getDim(VERTICAL),
				sourceRowPosition, sourceRowPosition,
				targetLayer.getDim(VERTICAL) );
	}
	
}
