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

using System;
using Bolt;
using Ludiq;
using UnityEngine;
using Object = UnityEngine.Object;

namespace BansheeGz.BGDatabase
{
    /// <summary>Called when an asset was loaded from addressables system.</summary>
    [UnitCategory("Events/BansheeGz")]
    public class BGAssetLoadedEvent : GameObjectEventUnit<BGAssetLoadedEventArgs>
    {
        protected override string hookName => nameof(BGAssetLoadedEvent);

        [DoNotSerialize]
        public ValueInput eventName { get; private set; }
        

        [DoNotSerialize]
        public ValueOutput asset { get; private set; }

        [DoNotSerialize]
        public ValueOutput eventData { get; private set; }

        [DoNotSerialize]
        public ValueOutput metaName { get; private set; }

        [DoNotSerialize]
        public ValueOutput fieldName { get; private set; }

        [DoNotSerialize]
        public ValueOutput entityIndex { get; private set; }

        public override Type MessageListenerType => null;

        protected override void Definition()
        {
            base.Definition();
            eventName = ValueInput("eventName", "");

            asset = ValueOutput<Object>("asset");
            eventData = ValueOutput<object>("eventData");
            metaName = ValueOutput<string>("metaName");
            fieldName = ValueOutput<string>("fieldName");
            entityIndex = ValueOutput<int>("entityIndex");
        }

        protected override bool ShouldTrigger(Flow flow, BGAssetLoadedEventArgs args)
        {
            var eventNameValue = flow.GetValue<string>(eventName);
            var eventNameEmpty = string.IsNullOrEmpty(eventNameValue);
            var argsEventNameEmpty = string.IsNullOrEmpty(args.eventName);
            if (eventNameEmpty && argsEventNameEmpty) return true;
            if (eventNameEmpty || argsEventNameEmpty) return false;
            return string.Equals(eventNameValue, args.eventName);
        }

        protected override void AssignArguments(Flow flow, BGAssetLoadedEventArgs data)
        {
            flow.SetValue(this.asset, data.asset);
            flow.SetValue(this.metaName, data.metaName);
            flow.SetValue(this.fieldName, data.fieldName);
            flow.SetValue(this.entityIndex, data.entityIndex);
            flow.SetValue(this.eventData, data.eventData);
        }

        public static void Trigger(GameObject target, BGAssetLoadedEventArgs data) => EventBus.Trigger(nameof(BGAssetLoadedEvent), target, data);
    }
}