extends Node2D

# constants for colors and stuff
var gridColor = Color(0.3, 0.3, 0.3, 0.2)
var pointColor = Color(1,1,1)
var axisColor = Color(0.6,0.6,0.6)
var lineColor = Color(0.2, 0.6, 1.0)
var lineWidth = 3.0
var padding = Vector2(20, 10)
var gridLines = 5

# actually draw the stuff. is called "automatically" and by me
func _draw():
	var dataSet = get_parent().get_parent().get_parent().activeInfo
	if dataSet == null:
		return
	
	var data = dataSet["data"]
	if data == null:
		return

	# get the container rect
	var colorRect = get_parent()
	var viewSize: Vector2 = colorRect.size

	var chartSize = Vector2(
		viewSize.x - padding.x * 2.0,
		viewSize.y - padding.y * 2.0
	)
	if chartSize.x <= 0 or chartSize.y <= 0:
		return

	# get min and max of data values
	var rawVals: Array = []
	for v in data.queue:
		rawVals.append(float(v))

	if rawVals.size() == 0:
		return

	var rawMin = rawVals.min()
	var rawMax = rawVals.max()

	# Make the range bigger so it isnt just on one side of the graph window
	var range = rawMax - rawMin
	if range == 0:
		range = 1   # so it doesnt get fucked up by /0 error

	var pad = range * 0.10
	rawMin -= pad
	rawMax += pad
	range = rawMax - rawMin

	# vertically fill grid area
	var scaledPoints = []
	var n = rawVals.size()

	for i in range(n):
		var t = (float(i) / float(n - 1)) if n > 1 else 0.5
		var x = padding.x + t * chartSize.x

		var normalized = (rawVals[i] - rawMin) / range
		var y = padding.y + chartSize.y - (normalized * chartSize.y)

		scaledPoints.append(Vector2(x, y))

	# draw grid and axes these have an underscore bc it was upset at using them otherwise
	_drawGrid(viewSize, chartSize)
	_drawAxes(viewSize, chartSize)

	# draw lines
	if scaledPoints.size() >= 2:
		for i in range(scaledPoints.size() - 1):
			draw_line(scaledPoints[i], scaledPoints[i+1], lineColor, lineWidth)

	for pt in scaledPoints:
		draw_circle(pt, 5, pointColor)
		draw_circle(pt, 4, lineColor)

func _drawAxes(viewSize: Vector2, chartSize: Vector2) -> void:
	var left = padding.x
	var right = viewSize.x - padding.x
	var top = padding.y
	var bottom = viewSize.y - padding.y
	var midY = padding.y + chartSize.y * 0.5

	draw_line(Vector2(left, midY), Vector2(right, midY), axisColor, 2)
	draw_line(Vector2(left, bottom), Vector2(left, top), axisColor, 2)

func _drawGrid(viewSize: Vector2, chartSize: Vector2) -> void:
	var left = padding.x
	var right = viewSize.x - padding.x
	var top = padding.y
	var bottom = viewSize.y - padding.y

	var xSpacing = chartSize.x / float(gridLines)
	var ySpacing = chartSize.y / float(gridLines)

	for i in range(gridLines + 1):
		var x = left + i * xSpacing
		draw_line(Vector2(x, bottom), Vector2(x, top), gridColor, 1)

	for i in range(gridLines + 1):
		var y = bottom - i * ySpacing
		draw_line(Vector2(left, y), Vector2(right, y), gridColor, 1)
