package org.eclipse.nebula.widgets.nattable.core.layer.impl.composite

import java.io.Serializable
import java.math.BigDecimal
import org.eclipse.nebula.widgets.nattable.core.layer.axis.impl.AbstractAxis

import static extension org.eclipse.nebula.widgets.nattable.core.layer.axis.AxisInvariants.*

/**
 * Represents the axis of a CompositeLayer, which is composed of an amalgamation of the axes of the CompsiteLayer's sublayers.
 */
class CompositeAxis extends AbstractAxis {
	
	val SubLayerAccessor subLayerAccessor
	val extension AxisAccessor axisAccessor
	
	new(SubLayerAccessor subLayerAccessor, AxisAccessor axisAccessor) {
		this.subLayerAccessor = subLayerAccessor
		this.axisAccessor = axisAccessor
	}
	
	def getAxisAccessor() { axisAccessor }
	
	def getSubLayers() {
		subLayerAccessor.subLayers
	}
	
	// Axis interface
	
	override getSegmentCount() {
		subLayers.fold(0L, [ acc, layer | acc + layer.axis.segmentCount ])
	}
	
	override getStartPixelOfSegmentPosition(long segmentPosition) {
		var segmentOffset = 0L
		var pixelOffset = BigDecimal::ZERO
		
		for (subLayer : subLayers) {
			val subAxis = subLayer.axis
			val subSegmentPosition = segmentPosition - segmentOffset
			
			if (subSegmentPosition < subAxis.segmentCount)
				return pixelOffset + subAxis.getStartPixelOfSegmentPosition(subSegmentPosition)
			
			segmentOffset = segmentOffset + subAxis.segmentCount
			pixelOffset = pixelOffset + subAxis.pixelSize
		}
		
		pixelOffset
	}
	
	override getSegmentPositionOfPixelLocation(BigDecimal pixelLocation) {
		if (pixelLocation < BigDecimal::ZERO) return -1
		if (pixelLocation >= pixelSize) return segmentCount
		
		var segmentOffset = 0L
		var pixelOffset = BigDecimal::ZERO
		
		for (subLayer : subLayers) {
			val subAxis = subLayer.axis
			val subPixelLocation = pixelLocation - pixelOffset
			
			if (subPixelLocation < subAxis.pixelSize)
				return segmentOffset + subAxis.getSegmentPositionOfPixelLocation(subPixelLocation)
			
			segmentOffset = segmentOffset + subAxis.segmentCount
			pixelOffset = pixelOffset + subAxis.pixelSize
		}
		
		segmentOffset
	}
	
	override getIdOfSegmentPosition(long segmentPosition) {
		var segmentOffset = 0L
		
		for (subLayer : subLayers) {
			val subAxis = subLayer.axis
			val subSegmentPosition = segmentPosition - segmentOffset
			
			if (subSegmentPosition < subAxis.segmentCount)
				return subAxis.getIdOfSegmentPosition(subSegmentPosition)
			
			segmentOffset = segmentOffset + subAxis.segmentCount
		}
		
		null
	}
	
	override getSegmentPositionOfId(Serializable segmentId) {
		var segmentOffset = 0L
		
		for (subLayer : subLayers) {
			val subAxis = subLayer.axis
			val subSegmentPosition = subAxis.getSegmentPositionOfId(segmentId)
			
			if (subAxis.containsSegmentPosition(subSegmentPosition) && subSegmentPosition >= 0)
				return segmentOffset + subSegmentPosition
			
			segmentOffset = segmentOffset + subAxis.segmentCount
		}
		
		return -1
	}
	
}