class_name Monster
extends CharacterBody3D

@export var data: MonsterData = MonsterData.new()

var spawn_point: Vector3 = Vector3(0, 0, 0)

# DEBUG MOVEMENT
@onready var time: float = 16.0
@onready var frequency: float = 1.0
@onready var amplitude: float = 0.5
var in_battle: bool = false
var idle: bool = false

# Called when the node enters the scene tree for the first time.
func _ready() -> void:
	var model_instance = data.model.instantiate()
	frequency = randf_range(1.0, 4.0)
	amplitude = randf_range(1.0, 6.0)
	spawn_point = position
	add_child(model_instance)

func _physics_process(delta: float) -> void:
	if in_battle:
		velocity = Vector3.ZERO
		return

	time += delta
	var x_movement = sin(time * frequency) * amplitude
	var y_movement = sin(time * 25) * 4.0
	var z_movement = cos(time * frequency) * amplitude
	
	if not idle:
		velocity = Vector3(x_movement, y_movement, z_movement)
	else:
		velocity = Vector3(0, y_movement, 0)
	
	# if move_and_slide reports collisions
	if move_and_slide():
		var collision = get_slide_collision(0)
		var collider = collision.get_collider()
		
		# if the monster collided with the player...
		if collider.name == "Player":
			velocity = Vector3.ZERO
			in_battle = true
			collider.start_battle(self)

func faint() -> void:
	self.queue_free()

func attack_enemy(enemy: Monster) -> int:
	var damage = data.attack_enemy(enemy.data)
	return damage

func take_damage(amount: int) -> void:
	data.take_damage(amount)
