using System.Collections;
using System.Collections.Generic;
using UnityEngine;

/// <summary>
/// can be inherited by MonoBehaviours in order to be added to the level manager
/// </summary>
public abstract class LevelObject : MonoBehaviour, ILevelObject
{
    public Vector3 Position { get => transform.position; protected set => transform.position = value; }
    public string Name { get => name; protected set => name = value; }

    public bool IsCollidable
    {
        get
        {
            var collider = GetComponent<Collider2D>();
            return collider && !collider.isTrigger;
        }
    }

    void Awake()
    {
        if (LevelManager.Instance.Has<LevelObject>(obj => obj.Equals(this))) return;
        LevelManager.Instance.Add(this);
    }
    void OnDestroy()
    {
        LevelManager.Instance.Remove(this);
    }
    public virtual void LevelStart()
    { 
    }
    public virtual void LevelDestroy()
    {
    }
    public virtual void LevelUpdate()
    {
    }

    public virtual bool Equals(ILevelObject other)
    {
        return other is LevelObject otherObject
            && otherObject.Name == Name
            && otherObject.Position == Position;
    }
    public virtual Dictionary<string, object> ToDictionary()
    {
        return new Dictionary<string, object>()
        {
            {nameof(Name), Name },
            {nameof(Position), new float[]{Position.x, Position.y, Position.z } },
            {nameof(ILevelObject.ObjectType), nameof(ILevelObject.ObjectType.Prefab) }
        };
    }
    public virtual void LoadDictionary(Dictionary<string, object> dict)
    {
        Name = dict[nameof(Name)].ToString();
        Position = dict[nameof(Position)].ToVector3();
    }

    public void RemoveFromLevel()
    {
		//checks if go is still in scene before removing it
        if (!this) return;
        Destroy(gameObject);
    }
}