using System.Collections.Generic;
using UnityEngine;

[CreateAssetMenu(menuName = "Gather And Defend/Spawner Tile")]
public class SpawnerTile : LevelTile
{
    [SerializeField]
    private GameObject _prefab;
    [SerializeField]
    private bool _spawnOnStart;
    private float _lifetime;
    [SerializeField]
    private float _spawnSpeed = 0;
    [SerializeField, Range(0, 1.001f)]
    private float _spawnCounter = 0;


    public override void LevelStart()
    {
        if (_spawnOnStart && _lifetime <= 0)
        {
            _prefab.Create(Position, parent: LevelManager.Instance.LevelTransform);
        }
    }

    public override void LevelUpdate()
    {
        _lifetime += Time.deltaTime;
        _spawnCounter += Time.deltaTime * _spawnSpeed;
        if (_spawnCounter < 1) return;

        _spawnCounter = 0;
        _prefab.Create(Position, parent: LevelManager.Instance.LevelTransform);
    }
    public override bool Equals(ILevelObject other)
    {
        return other is SpawnerTile spawner
            && base.Equals(spawner)
            && spawner._prefab == _prefab
            && spawner._spawnSpeed == _spawnSpeed;
    }
    public override Dictionary<string, object> ToDictionary()
    {
        var dict = base.ToDictionary();

        dict[nameof(_prefab)] = _prefab.name;
        dict[nameof(_spawnSpeed)] = _spawnSpeed;
        dict[nameof(_spawnCounter)] = _spawnCounter;
        dict[nameof(_lifetime)] = _lifetime;
        dict[nameof(_spawnOnStart)] = _spawnOnStart;
        return dict;
    }
    public override void LoadDictionary(Dictionary<string, object> dict)
    {
        base.LoadDictionary(dict);

        var prefabName = dict[nameof(_prefab)].ToString();
        _prefab = Database.Instance.Prefabs[prefabName];
        _spawnSpeed = dict[nameof(_spawnSpeed)].ToFloat();
        _spawnCounter = dict[nameof(_spawnCounter)].ToFloat();
        _lifetime = dict[nameof(_lifetime)].ToFloat();
        _spawnOnStart = dict[nameof(_spawnOnStart)].ToBool();
    }
}