/*
<copyright file="BGUNGetValue.cs" company="BansheeGz">
    Copyright (c) 2018-2021 All Rights Reserved
</copyright>
*/

using System;
using MaxyGames.uNode;

namespace BansheeGz.BGDatabase
{
    public abstract class BGUNGetValue<T> : BGUNCellA, IDataNode<T> 
    {
        object IDataNode.GetValue(object graph)
        {
            return GetValue(graph);
        }

        public Type ReturnType()
        {
            return typeof(T);
        }

        public T GetValue(object graph)
        {
            var field = Field;
            if (!(typeof(T).IsAssignableFrom(field.ValueType)))
                throw new Exception($"Can not read value from the database: " +
                                    $"field '{field.FullName}' values (type={field.ValueType.FullName}) can not be cast to {typeof(T).FullName} type!");
            var entity = Entity;
            T value;
            if (field is BGField<T>)
            {
                value = ((BGField<T>) field)[entity.Index];
            }
            else
            {
                value = (T) field.GetValue(entity.Index);
            }
            return value;
        }
    }
}