﻿using JLGames.RocketDriver.Actions.Animatorx;
using JLGames.RocketDriver.Actions.Utils;
using JLGames.RocketDriver.CSharp;
using UnityEngine;
using UnityEngine.UI;

namespace JLGames.RocketDriver.Samples.Animation
{
    public class AnimDemo : MonoBehaviour
    {
        [SerializeField] private AnimationEventInvoker m_Invoker;
        [SerializeField] private AnimationEventProxy m_Proxy;

        [SerializeField] private InputField m_InputClipName;
        [SerializeField] private InputField m_InputTime;
        [SerializeField] private InputField m_InputEventName;

        private int m_EventNameIndex = 1;

        private string ClipName => m_InputClipName.text.Trim();
        private string EventName => m_InputEventName.text.Trim();
        private float Time => float.Parse(m_InputTime.text.Trim());

        private void Start()
        {
            InitInvokerDefault();
        }

        private void InitInvokerDefault()
        {
            m_Invoker.AddEventCall("invoker_1", InvokerDefault1);
            m_Invoker.AddEventCall("invoker_2", new Callback(InvokerDefault2, "666"));
        }

        private void InvokerDefault1(object[] args)
        {
            DebugUtil.Log("AnimDemo.InvokerDefault1");
        }

        private void InvokerDefault2(object[] args)
        {
            DebugUtil.Log("AnimDemo.InvokerDefault2:", args[0]);
        }

        //-------------------

        public void OnNextEventName()
        {
            m_EventNameIndex += 1;
            m_InputEventName.text = $"Event{m_EventNameIndex}";
        }

        public void AdddEndEvent()
        {
            m_Proxy.AddInvokerEvent(ClipName, Time, EventName, InvokeEventTime1);
        }

        public void RemoveEndEvent()
        {
            m_Proxy.RemoveInvokerEvent(ClipName, EventName);
        }

        public void OnceEventEnd()
        {
            m_Proxy.OnceInvokerEventEnd(ClipName, EventName, OnceInvokeEventEnd1);
        }

        private void InvokeEventEnd1(object[] args)
        {
            DebugUtil.Log("AnimDemo.InvokeEventEnd1");
        }

        private void InvokeEventTime1(object[] args)
        {
            DebugUtil.Log("AnimDemo.InvokeEventTime1");
        }

        private void OnceInvokeEventEnd1(object[] args)
        {
            DebugUtil.Log("AnimDemo.OnceInvokeEventEnd1");
        }
    }
}