tool

extends StaticBody2D

class_name GameObjectEngine

const LIGHT_STRENGTH_MULT = 0.002

const MAX_ENERGY = 2
const MAX_USAGE = 0.5

enum Direction { LEFT, RIGHT, UP, DOWN }

export(Direction) var direction = Direction.DOWN setget set_direction

onready var activationRange = $ActivationRange as ActivationRange
onready var manager = $PowerManager as PowerManager

export var strength = 1.0 setget set_strength 
export var max_force = 0.05

var force = 0

func _ready() -> void:
	if not Engine.editor_hint:
		activationRange.visible = true
		$Light2D.visible = true

func set_direction(dir) -> void:
	direction = dir
	refresh_sprite()

func set_strength(val: float) -> void:
	strength = val
	$Light2D.energy = val * LIGHT_STRENGTH_MULT

func refresh_sprite() -> void:
	var rot = 0
	match direction:
		Direction.DOWN:
			$engine.region_rect.position = Vector2(0, 0)
			rot = 0
		Direction.UP:
			$engine.region_rect.position = Vector2(0, 96)
			rot = PI
		Direction.LEFT:
			$engine.region_rect.position = Vector2(96, 96)
			rot = PI/2
		Direction.RIGHT:
			$engine.region_rect.position = Vector2(96, 0)
			rot = -PI/2
	$Light2D.rotation = rot
	$ActivationRange.rotation = rot

func _physics_process(_delta: float) -> void:
	if Engine.editor_hint:
		return
	manager.power_usage = max(1e-3, MAX_USAGE * strength)

func _input_event(_viewport, event, _shape_idx):
	if Engine.editor_hint:
		return
	if event is InputEventMouseButton and event.pressed:
		if activationRange.in_range():
			# TODO
			pass

func serialize():
	return {
		"direction": direction,
		"strength": strength
	}

func deserialize(data):
	set_direction(data["direction"])
	set_strength(data["strength"])

func _power_status_changed(powered):
	if powered:
		force = max_force
		$Light2D.enabled = true
	else:
		force = 0
		$Light2D.enabled = false
