using Microsoft.Xna.Framework;
using ProjectZ.InGame.GameObjects.Base;
using ProjectZ.InGame.GameObjects.Base.CObjects;
using ProjectZ.InGame.GameObjects.Base.Components;
using ProjectZ.InGame.Map;

namespace ProjectZ.InGame.GameObjects.Enemies
{
    class EnemyTorchTrap : GameObject
    {
        private readonly Rectangle _fieldRectangle;
        private readonly string _key;

        private float _fireballCounter;
        private const int FireballTime = 3000;
        private bool _isActive;

        public EnemyTorchTrap() : base("torch trap") { }

        public EnemyTorchTrap(Map.Map map, int posX, int posY, string key) : base(map)
        {
            EntityPosition = new CPosition(posX + 8, posY + 8, 0);
            EntitySize = new Rectangle(-8, -8, 16, 16);

            _fieldRectangle = map.GetField(posX, posY, 16);

            _key = key;

            if (!string.IsNullOrEmpty(_key))
                AddComponent(KeyChangeListenerComponent.Index, new KeyChangeListenerComponent(OnKeyChanged));
            else
                _isActive = true;

            AddComponent(UpdateComponent.Index, new UpdateComponent(Update));
        }

        private void OnKeyChanged()
        {
            _isActive = Game1.GameManager.SaveManager.GetString(_key) != "1";
        }

        private void Update()
        {
            if (!_isActive || !_fieldRectangle.Contains(MapManager.ObjLink.EntityPosition.Position))
                return;

            _fireballCounter += Game1.DeltaTime;
            if (_fireballCounter < FireballTime)
                return;
            
            _fireballCounter -= FireballTime;

            // spawn a fireball?
            var distance = EntityPosition.Position - MapManager.ObjLink.EntityPosition.Position;
            if (distance.Length() < 106)
                Map.Objects.SpawnObject(new EnemyFireball(Map, (int)EntityPosition.X, (int)EntityPosition.Y, 1.25f));
        }
    }
}