package org.eclipse.nebula.widgets.nattable.renderer.swt.layer.viewport

import java.math.BigDecimal
import org.eclipse.nebula.widgets.nattable.core.layer.impl.viewport.ViewportAxis
import org.eclipse.swt.widgets.Event
import org.eclipse.swt.widgets.Listener
import org.eclipse.swt.widgets.ScrollBar

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

class ScrollBarHandler implements Listener {
	
	val static MAXINT = new BigDecimal(Integer::MAX_VALUE)
	
	//
	
	val ScrollBar scrollBar
	val ViewportAxis viewportAxis
	
	val BigDecimal minThumbSize
	val int minIncrement
	val int minPageIncrement

	new(ScrollBar scrollBar, ViewportAxis viewportAxis) {
		this.scrollBar = scrollBar
		this.viewportAxis = viewportAxis
		
		scrollBar.thumb = 0
		scrollBar.increment = 0
		scrollBar.pageIncrement = 0
		
		minThumbSize = new BigDecimal(1.max(scrollBar.thumb))
		minIncrement = 1.max(scrollBar.increment)
		minPageIncrement = 1.max(scrollBar.pageIncrement)
	}
	
	def getMinThumbSize() { minThumbSize }
	def getMinIncrement() { minIncrement }
	def getMinPageIncrement() { minPageIncrement }

	override handleEvent(Event event) {
		updateViewportOrigin
	}
	
	def void updateViewportOrigin() {
		recalculateScrollBarSize(true)
	}
	
	def void recalculateScrollBarSize() {
		recalculateScrollBarSize(false)
	}
	
	/**
	 * Recalculate scrollbar values from viewport axis values. Optionally update the viewport origin from the scrollbar selection first.
	 * @param updateViewportOrigin Indicates whether or not to update the viewport origin.
	 */
	def private void recalculateScrollBarSize(boolean updateViewportOrigin) {
		val visiblePixelSize = viewportAxis.visiblePixelSize
		val maxPixelSize = viewportAxis.underlyingAxis.pixelSize
		val maxScrollSize = maxPixelSize.min(MAXINT)
		val thumbSize = minThumbSize.max((visiblePixelSize / maxPixelSize) * maxScrollSize)
		
		val intPerPixelRatio = 
			if (thumbSize / maxScrollSize < visiblePixelSize / maxPixelSize)
				thumbSize / visiblePixelSize
			else
				if (maxScrollSize + thumbSize < MAXINT)
					maxScrollSize / maxPixelSize
				else
					(maxScrollSize - thumbSize) / (maxPixelSize - visiblePixelSize)
		
		if (updateViewportOrigin) {
			println(scrollBar.selection)
			viewportAxis.pixelOrigin = new BigDecimal(scrollBar.selection) / intPerPixelRatio
		}
		
		val viewportOrigin = viewportAxis.pixelOrigin
		
		if (visiblePixelSize > BigDecimal::ZERO && viewportOrigin < maxPixelSize) {
			scrollBar.maximum = maxScrollSize.intValue
			scrollBar.thumb = thumbSize.intValue
			scrollBar.pageIncrement = Math::max(minPageIncrement, thumbSize.intValue)
			
			// Increment by size of segment 0 or 1/4 of visible pixel size, whichever is smaller
			val pixelIncrement = viewportAxis.getPixelSizeOfSegmentPosition(0).min(visiblePixelSize / new BigDecimal(4))
			scrollBar.increment = minIncrement.max((pixelIncrement * intPerPixelRatio).intValue)
			
			scrollBar.selection = (viewportOrigin * intPerPixelRatio).intValue
			println('''«scrollBar.selection» = («viewportOrigin» * «intPerPixelRatio»).intValue''')
			
			scrollBar.enabled = true
			scrollBar.visible = true
		} else {
			scrollBar.enabled = false
			scrollBar.visible = false
		}
	}
	
//	def operator_divide(BigDecimal a, BigDecimal b) {
//		a.divide(b, new MathContext(a.precision.max(b.precision), RoundingMode::CEILING))
//	}
	
}