using System;
using VOID.Generic.Dict;

namespace VOID.Generic.Objects.Abstract.Data
{
    [Serializable]
    public record Resistances
    {
        public float physicalResistance = 0f;
        public float magicalResistance = 0f;
        public float fireResistance = 0f;
        public float waterResistance = 0f;
        public float earthResistance = 0f;
        public float airResistance = 0f;
        public float poisonResistance = 0f;
        public float lightResistance = 0f;
        public float darkResistance = 0f;
        public float healResistance = 2f;
        
        public float Get(DamageType type)
        {
            return type switch
            {
                DamageType.Physical => physicalResistance,
                DamageType.Magical => magicalResistance,
                DamageType.Fire => fireResistance,
                DamageType.Water => waterResistance,
                DamageType.Earth => earthResistance,
                DamageType.Air => airResistance,
                DamageType.Poison => poisonResistance,
                DamageType.Light => lightResistance,
                DamageType.Dark => darkResistance,
                DamageType.Heal => healResistance,
                _ => throw new ArgumentOutOfRangeException(nameof(type), type, null)
            };
        }
        
        public void Set(DamageType type, float value)
        {
            switch(type)
            {
                case DamageType.Physical: physicalResistance = value; return;
                case DamageType.Magical: magicalResistance = value; return;
                case DamageType.Fire: fireResistance = value; return;
                case DamageType.Water: waterResistance = value; return;
                case DamageType.Earth: earthResistance = value; return;
                case DamageType.Air: airResistance = value; return;
                case DamageType.Poison: poisonResistance = value; return;
                case DamageType.Light: lightResistance = value; return;
                case DamageType.Dark: darkResistance = value; return;
                case DamageType.Heal: healResistance = value; return;
                default: throw new ArgumentOutOfRangeException(nameof(type), type, null);
            };
        }
    }
}