﻿using System.Text;
using JLGames.RocketDriver.Actions.Languages.Lua;
using JLGames.RocketDriver.Actions.Utils;
using JLGames.RocketDriver.CSharp.Languages.Lua;
using UnityEngine;
using UnityEngine.UI;

namespace JLGames.RocketDriver.Samples.LuaDemo
{
    public class LuaDemo : MonoBehaviour
    {
        [SerializeField] private InputField m_LuaCode;
        [SerializeField] private InputField m_LuaCondition;
        [SerializeField] private InputField m_LuaResult;

        private readonly StringBuilder m_SbResult = new StringBuilder();

        private void Awake()
        {
            Lua.Environment.Register("print", DemoDebug);
            Lua.RegisterFunction("SayHello", this, LuaValueUtils.GetMethodInfo(() => SayHello()));
            Lua.RegisterFunction("SayHello2", this, LuaValueUtils.GetMethodInfo(() => SayHello(string.Empty)));
            Lua.RegisterFunction("ReturnString", this, LuaValueUtils.GetMethodInfo(() => ReturnString()));
            Lua.RegisterFunction("ReturnDouble", this, LuaValueUtils.GetMethodInfo(() => ReturnDouble(0)));
            Lua.RegisterFunction("ReturnBool", this, LuaValueUtils.GetMethodInfo(() => ReturnBool(string.Empty)));
        }

        private LuaValue DemoDebug(LuaValue[] values)
        {
            var info = string.Join<LuaValue>("  ", values);
            Debug.Log(info);
            m_SbResult.AppendLine(info);
            m_LuaResult.text = m_SbResult.ToString();
            return null;
        }

        public void SayHello()
        {
            DebugUtil.Log("Hello Lua!");
        }

        public void SayHello(string words)
        {
            DebugUtil.Log($"Hello {words}!");
        }

        public string ReturnString()
        {
            return "string:666";
        }

        public double ReturnDouble(double result)
        {
            return (int) result + 1;
        }

        public bool ReturnBool(string str)
        {
            return "666" == str;
        }

        public void OnClickReset()
        {
            Lua.Restart();
            m_SbResult.Clear();
            m_LuaCode.text = "";
            m_LuaCondition.text = "";
            m_LuaResult.text = "";
        }

        public void OnClickCodeRun()
        {
            var luaCode = m_LuaCode.text;
            if (string.IsNullOrEmpty(luaCode) || string.IsNullOrWhiteSpace(luaCode)) return;
            var result = Lua.RunLua(luaCode);
            m_SbResult.AppendLine(result.ToString());
            m_LuaResult.text = m_SbResult.ToString();
            m_LuaCode.text = "";
        }

        public void OnClickCodeClear()
        {
            m_LuaCode.text = "";
        }

        public void OnClickConditionCheck()
        {
            var luaCondition = m_LuaCondition.text;
            if (string.IsNullOrEmpty(luaCondition) || string.IsNullOrWhiteSpace(luaCondition)) return;
            var result = Lua.IsTrue(luaCondition);
            m_SbResult.AppendLine(result.ToString());
            m_LuaResult.text = m_SbResult.ToString();
            m_LuaCondition.text = "";
        }

        public void OnClickResultClear()
        {
            m_SbResult.Clear();
            m_LuaResult.text = "";
        }
    }
}