﻿#if !OVERRIDE_LUA
using System;
using JLGames.RocketDriver.CSharp.Languages.Lua;

namespace JLGames.RocketDriver.Actions.Languages.Lua
{
    /// <summary>
    /// Lua script returns, providing some common value functions
    /// Lua脚本返回，提供一些常用取值功能
    /// </summary>
    public struct LuaResult
    {
        public static readonly LuaResult NoResult = new LuaResult(null);

        private readonly LuaValue m_LuaValue;
        private LuaTableWrapper m_LuaTableWrapper;

        /// <summary>
        /// Check if there is a return value
        /// 检查是否有返回值
        /// </summary>
        public bool HasReturnValue => m_LuaValue != null;

        /// <summary>
        /// Check if the return value is a string type
        /// 检查返回值是否为字符串类型
        /// </summary>
        public bool IsString => HasReturnValue && m_LuaValue is LuaString;
        
        /// <summary>
        /// Check if the return value is boolean
        /// 检查返回值是否为布尔类型
        /// </summary>
        public bool IsBool => HasReturnValue && m_LuaValue is LuaBoolean;
        
        /// <summary>
        /// Check if the return value is a numeric type
        /// 检查返回值是否为数字类型
        /// </summary>
        public bool IsNumber => HasReturnValue && m_LuaValue is LuaNumber;
        
        /// <summary>
        /// Check if the return value is a table type
        /// 检查返回值是否为表类型
        /// </summary>
        public bool IsTable => HasReturnValue && m_LuaValue is LuaTable;

        /// <summary>
        /// Convert the return value to character
        /// 把返回值转化为字符器
        /// </summary>
        public string AsString => IsString ? m_LuaValue.ToString() : string.Empty;

        public bool AsBool => IsBool
            ? m_LuaValue.GetBooleanValue()
            : string.Compare(AsString, "true", StringComparison.OrdinalIgnoreCase) == 0;

        /// <summary>
        /// Convert the return value to a float number
        /// 把返回值转化为float浮点数
        /// </summary>
        public float AsFloat
        {
            get
            {
                if (!HasReturnValue) return 0f;
                if (m_LuaValue is LuaNumber) return (float) ((LuaNumber) m_LuaValue).Number;
                if (m_LuaValue is LuaString)
                {
                    return
                        LuaValueUtils.StringToFloat(m_LuaValue.ToString());
                }

                return 0f;
            }
        }

        /// <summary>
        /// Convert the return value to a double number
        /// 把返回值转化为double浮点数
        /// </summary>
        public int AsInt
        {
            get
            {
                if (!HasReturnValue) return 0;
                if (m_LuaValue is LuaNumber) return (int) ((LuaNumber) m_LuaValue).Number;
                if (m_LuaValue is LuaString)
                {
                    return LuaValueUtils.StringToInt(m_LuaValue.ToString());
                }

                return 0;
            }
        }

        /// <summary>
        /// Convert the return value to a wrapper class object of table type
        /// 把返回值转化为表类型的包装类对象
        /// </summary>
        public LuaTableWrapper AsTable => m_LuaTableWrapper ?? (m_LuaTableWrapper = new LuaTableWrapper(m_LuaValue as LuaTable));

        public override string ToString()
        {
            return HasReturnValue ? m_LuaValue.ToString() : "LuaResult[null]";
        }

        public LuaResult(LuaValue luaValue)
        {
            m_LuaValue = luaValue;
            m_LuaTableWrapper = null;
        }
    }
}

#endif