extends CharacterBody2D


const SPEED = 200.0
const JUMP_VELOCITY = -300.0
const PUSH_FORCE = 80.0
const BLAST_SPEED = 750

var pushLeftEnabled = false
var pushRightEnabled = false
var pushTarget
var faceLeft = false

# Get the gravity from the project settings to be synced with RigidBody nodes.
var gravity = ProjectSettings.get_setting("physics/2d/default_gravity")
@onready var animated_sprite = $AnimatedSprite2D
@onready var rightRay = $RightRaycast
@onready var leftRay = $LeftRaycast
@onready var label = $Label
@onready var markerRight = $MarkerRight
@onready var markerLeft = $MarkerLeft

var bullet = preload("res://scenes/bullet.tscn")

func _physics_process(delta):
	# Add the gravity.
	if not is_on_floor():
		velocity.y += gravity * delta

	# Handle jump.
	if Input.is_action_just_pressed("jump") and is_on_floor():
		velocity.y = JUMP_VELOCITY

	# Get the input direction and handle the movement/deceleration.
	# As good practice, you should replace UI actions with custom gameplay actions.
	var direction = Input.get_axis("runleft", "runright")
	
	if Input.is_action_just_pressed("push") && pushRightEnabled && faceLeft == false:
		label.text="shove"
		pushTarget.apply_central_impulse(Vector2(1,0) * PUSH_FORCE * 20)
		pushRightEnabled = false
		
	if Input.is_action_just_pressed("push") && pushLeftEnabled :
		label.text="shove"
		pushTarget.apply_central_impulse(Vector2(-1,0) * PUSH_FORCE * 20)
		pushLeftEnabled = false
	
	if Input.is_action_just_pressed("blast"):
		var mybullet = bullet.instantiate()
		mybullet.setSpeed(-BLAST_SPEED if faceLeft else BLAST_SPEED)
		owner.add_child(mybullet)
		mybullet.transform = markerLeft.global_transform if faceLeft else markerRight.global_transform

	if direction:
		velocity.x = direction * SPEED
		faceLeft = true if direction<0 else false
		animated_sprite.flip_h = true if direction < 0 else false
	else:
		# slow the character to a stop
		velocity.x = move_toward(velocity.x, 0, SPEED)
	if is_on_floor():
		if direction==0:
			label.text="idle"
			animated_sprite.play("idle")
		else:
			label.text="run"
			animated_sprite.play("run")
	else:
		label.text="jump"
		animated_sprite.play("jump")
		

	move_and_slide()
	# Detect colliders in the ray
	if rightRay.is_colliding():
		var collider = rightRay.get_collider()
		if collider is Node:
			if collider.is_in_group("boxes"):
				pushRightEnabled = true
				pushTarget = collider
	else:
		pushRightEnabled = false
	if leftRay.is_colliding():
		var collider = leftRay.get_collider()
		if collider is Node:
			if collider.is_in_group("boxes"):
				pushLeftEnabled = true
				pushTarget = collider
	else:
		pushLeftEnabled = false

	# This represents the player's inertia
	# after calling move_and_slide()
	for i in get_slide_collision_count():
		var c = get_slide_collision(i)
		if c.get_collider() is RigidBody2D:
			c.get_collider().apply_central_impulse(-c.get_normal() * PUSH_FORCE)
