using Godot;
using System;

public partial class Laser : Area2D
{
	[Export]
	public int Speed { get; set;} = 2000;

	public ship Shooter;

	private Vector2 MovementVector { get; set; } = new Vector2(0, -1);

	
	private void _on_visible_on_screen_notifier_2d_screen_exited()
	{
		QueueFree();
	}

	public override void _Ready()
	{
		Connect("body_entered", new Callable(this, nameof(OnBodyEntered)));
	}
	public override void _PhysicsProcess(double delta)
	{
		GlobalPosition += MovementVector.Rotated(Rotation) * Speed * (float)delta;
	}
	private void OnAreaEntered(Area2D area)
	{
		if (area is asteroid asteroid)
		{
			asteroid.Explode(Shooter);
			QueueFree();
		}
	}

	private bool ValidTargetFaction(ship body)
	{
		return Shooter.Faction switch
		{
			ship.ShipFaction.PLAYER => body.Faction is ship.ShipFaction.ENEMY or ship.ShipFaction.ACE,
			ship.ShipFaction.ENEMY => body.Faction is ship.ShipFaction.FRIENDLY or ship.ShipFaction.PLAYER,
			ship.ShipFaction.FRIENDLY => body.Faction is ship.ShipFaction.ENEMY or ship.ShipFaction.ACE,
			ship.ShipFaction.ACE => body.Faction is ship.ShipFaction.FRIENDLY or ship.ShipFaction.PLAYER,
		};
	}
	
	private void OnBodyEntered(Node body)
	{

		if (body is ship target)
		{
			if (Shooter != null && !ValidTargetFaction(target))
			{
				QueueFree();
			}
			else
			{
				target.ShipDamage(Shooter.Damage);
				QueueFree();
			}
		}

		else if (body is StaticBody2D) // border detection
		{
			QueueFree();
		}
	}
}
