namespace BP
{
	namespace Controller
	{
		class Flare : ScriptObject
		{
			kActor@ self;
			kParticle@ flareParticle;
			kParticle@ damageParticle;
			kParticle@ damageSpriteParticle;
			//------------------------------------------------------------------------------------------------------------------------
			Flare(kActor@ actor)
			{
				@self = actor;
			}
			//------------------------------------------------------------------------------------------------------------------------
			void Dispose()
			{
				if (@flareParticle != null && !flareParticle.IsStale())
				{
					flareParticle.Remove();
				}
				// if (@damageParticle != null && !damageParticle.IsStale())
				// {
					// damageParticle.Remove();
				// }
				// if (@damageSpriteParticle != null && !damageSpriteParticle.IsStale())
				// {
					// damageSpriteParticle.Remove();
				// }
				if (!self.IsStale())
				{
					self.Remove();
				}
			}
			//------------------------------------------------------------------------------------------------------------------------
			void OnTick(void)
			{
				if (self.GetTarget() is null)
				{
					Dispose();
					return;
				}
				
				@flareParticle = self.GetTarget().CastToParticle();
				
				if (flareParticle.IsStale())
				{
					Dispose();
					return;
				}
				
				if (flareParticle.IsSticking())
				{
					if (@damageParticle == null)
					{
						@damageParticle = ParticleFactory.Spawn("particles/BP/Flare_Damage.particle", self, kQuat(0.0f, 0.0f, 0.0f), Math::vecZero);
						DebugAssert(@damageParticle != null, "[BP::Controller::Flare::OnTick] damageParticle is null");
						// damageParticle.SetTarget(@self);
					}
					if (@damageSpriteParticle == null)
					{
						@damageSpriteParticle = ParticleFactory.Spawn("particles/BP/Flare_Sprite.particle", BP::LocalPlayer::Actor, kQuat(0.0f, 0.0f, 0.0f), Math::vecZero);
						DebugAssert(@damageSpriteParticle != null, "[BP::Controller::Flare::OnTick] damageSpriteParticle is null");
					}
				}

				self.Origin() = flareParticle.Origin(); //for the looping sound to play where the flare is
				
				if (@damageParticle != null)
				{
					damageParticle.Origin() = flareParticle.Origin();
					if (@damageSpriteParticle != null)
					{
						damageSpriteParticle.Origin() = flareParticle.Origin();
					}
					
					if (damageParticle.IsStale())
					{
						Dispose();
						return;
					}
				}
			}
			//------------------------------------------------------------------------------------------------------------------------
		};
	}
}
