using NLua;
using System;

namespace PSO2SERVER.LuaScriptEngine
{
    public class LuaEngine
    {
        private Lua lua;

        public LuaEngine()
        {
            // 初始化 LuaEngine 解释器
            lua = new Lua();
        }

        // 执行 LuaEngine 脚本
        public void ExecuteScript(string script)
        {
            try
            {
                // 执行传入的 LuaEngine 脚本
                lua.DoString(script);
            }
            catch (Exception ex)
            {
                Console.WriteLine("Error executing LuaEngine script: " + ex.Message);
            }
        }

        // 执行并获取 LuaEngine 脚本结果
        public object ExecuteScriptWithResult(string script)
        {
            try
            {
                // 执行 LuaEngine 脚本并返回结果
                return lua.DoString(script)[0];
            }
            catch (Exception ex)
            {
                Console.WriteLine("Error executing LuaEngine script: " + ex.Message);
                return null;
            }
        }

        // 将 C# 对象传递给 LuaEngine 环境
        public void SetGlobalVariable(string name, object value)
        {
            lua[name] = value;
        }

        // 获取 LuaEngine 环境中的全局变量
        public object GetGlobalVariable(string name)
        {
            return lua[name];
        }

        // 使用 MethodBase 注册方法
        public void RegisterFunction(object obj, string luaFunctionName, string methodName)
        {
            var methodInfo = obj.GetType().GetMethod(methodName);
            lua.RegisterFunction(luaFunctionName, obj, methodInfo);
        }

        // 注册委托函数到 Lua
        public void RegisterFunction(string luaFunctionName, Delegate function)
        {
            // 使用反射将委托作为方法注册
            var method = function.Method;
            lua.RegisterFunction(luaFunctionName, null, method);
        }

        // 清理 Lua 环境
        public void Close()
        {
            lua.Close();
        }

        // 清理 LuaEngine 解释器
        public void Dispose()
        {
            lua.Dispose();
        }

        // 示例方法
        public int AddNumbers(int a, int b)
        {
            return a + b;
        }

        // 示例方法
        public void print(string text, params object[] args)
        {
            Logger.Write(text, args);
        }

        public void printobj(object obj)
        {
            Logger.WriteObj(obj);
        }

        // 注册函数
        public void RegisterExampleFunction()
        {
            // 使用反射将方法注册到 Lua
            RegisterFunction(this, "AddNumbers", "AddNumbers");
        }

        public void RegisterLogger()
        {
            // 使用反射将方法注册到 Lua
            RegisterFunction(this, "print", "print");
            RegisterFunction(this, "printobj", "printobj");
        }

        public void LusTest()
        {
            var engine = new LuaEngine();
            engine.RegisterLogger();
            // 注册 C# 函数到 Lua
            engine.RegisterExampleFunction();

            // Lua 脚本
            string luaScript = @"
                -- 调用 C# 注册的函数
                result = AddNumbers(10, 20)
                print('Result from C#: ' .. result)
                printobj(result)
            ";

            // 执行 Lua 脚本
            engine.ExecuteScript(luaScript);

            // 关闭 Lua 环境
            engine.Close();
        }
    }
}
