using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using static Extensions;

public class Entity : LevelObject
{
    //Attribut
    [SerializeField]
    private int _hp;
    [SerializeField]
    private float _speed;
    [SerializeField]
    private int _attack_damage;
    [SerializeField]
    private float _attack_speed;
    private float _attack_speed_wait = 0f;

    //Enemy Spotted
    private bool _isEnemyDetected = false;
    private Entity _enemy;

    //GETTERS AND SETTERS
    
    public int Hp
    {
        get { return _hp; }
        set { _hp = value; }
    }

    public float Speed
    {
        get { return _speed; }
        set { _speed = value; }
    }

    public int AttackDamage
    {
        get { return _attack_damage; }
        set { _attack_damage = value; }
    }

    public float AttackSpeed
    {
        get { return _attack_speed; }
        set { _attack_speed = value; }
    }

    public float AttackSpeedWait
{
    get { return _attack_speed_wait; }
    set { _attack_speed_wait = value; }
}

    public bool IsEnemyDetected
    {
        get { return _isEnemyDetected; }
        set { _isEnemyDetected = value; }
    }

    public Entity Enemy
    {
        get { return _enemy; }
        set { _enemy = value; }
    }

    #region [LevelManager code]
    public override bool Equals(ILevelObject other)
    {
        return other is Entity otherEntity
            && base.Equals(otherEntity)
            && otherEntity._hp == _hp
            && otherEntity._speed == _speed
            && otherEntity._attack_speed == _attack_speed
            && otherEntity._attack_damage == _attack_damage;
    }

    public override Dictionary<string, object> ToDictionary()
    {
        var dict = base.ToDictionary();

        dict[nameof(_hp)] = _hp;
        dict[nameof(_speed)] = _speed;
        dict[nameof(_attack_speed)] = _attack_speed;
        dict[nameof(_attack_damage)] = _attack_damage;
        dict[nameof(_attack_speed_wait)] = _attack_speed_wait;

        return dict;
    }
    public override void LoadDictionary(Dictionary<string, object> dict)
    {
        base.LoadDictionary(dict);

        _hp = dict[nameof(_hp)].ToInt();
        _speed = dict[nameof(_speed)].ToFloat();
        _attack_speed = dict[nameof(_attack_speed)].ToFloat();
        _attack_damage = dict[nameof(_attack_damage)].ToInt();
        _attack_speed_wait = dict[nameof(_attack_speed_wait)].ToFloat();
    }
    #endregion
}
