extends Unit
class_name Citizen

@onready var body: Sprite3D = $Body
@onready var hands: Sprite3D = $Body/Hands

var task: Task = null
var working: bool = false

func _ready() -> void:
	held_item_meshinstance = $"Body/Hands/Held Item"

func _process(delta: float) -> void:
	super(delta)
	var camera: Camera3D
	if Engine.is_editor_hint():
		camera = EditorInterface.get_editor_viewport_3d(0).get_camera_3d()
	else:
		camera = get_viewport().get_camera_3d()
	var facing_direction: Vector3 = -global_basis.z
	var camera_local_facing: Vector3 = facing_direction * camera.global_basis
	
	var facing_away: bool = camera_local_facing.z < 0
	var facing_right: bool = camera_local_facing.x > 0
	
	body.frame = 1 if facing_away else 0
	#hands.frame = 1 if facing_away else 0
	body.flip_h = facing_right
	hands.flip_h = facing_right
	
	if !working and task != null:
		working = true
		var ok: bool = await task.execute(self)
		if !ok:
			CitizenManager._instance.add_task(task)
		task = null
		working = false
	
func assign_task(t: Task) -> void:
	task = t
	
func is_idle() -> bool:
	return task == null
	
func put_item_in_building_materials(building: Building) -> bool:
	building._add_build_material(held_item)
	held_item = null
	return true
	
func put_item_in_building_storage(building: Building) -> bool:
	if building.consumer == null:
		return false
	if !building.consumer.offer_item(held_item):
		return false
	held_item = null
	return true

func build_building(building: Building) -> bool:
	var build_action: UnitAction.BuildAction = UnitAction.BuildAction.new()
	build_action.building = building
	action = build_action
	var ok: bool = await wait_for_task_update() == TaskStatus.DONE
	return ok