using IRaCIS.Core.Domain.Share;
using Microsoft.Extensions.Localization;
using Microsoft.Extensions.Logging;
using Newtonsoft.Json;
using static System.Runtime.InteropServices.JavaScript.JSType;

namespace IRaCIS.Core.Infrastructure.Extention
{
    /// <summary>
    /// 响应数据输出  泛型
    /// </summary>
    public class ResponseOutput<T> : IResponseOutput<T>
    {
        /// <summary>
        /// 是否成功标记
        /// </summary>
        public bool IsSuccess { get; private set; }


        public ApiResponseCodeEnum Code { get; set; } = ApiResponseCodeEnum.OK;


        /// <summary>
        /// 消息
        /// </summary>
        public string ErrorMessage { get; private set; }

        /// <summary>
        /// 数据  兼顾以前 Json序列化的时候返回属性名为“Result”
        /// </summary>
        [JsonProperty("Result")]
        public T Data { get; set; }


        [JsonProperty("OtherInfo")]
        public object OtherData { get; set; }

        public string LocalizedInfo { get; set; }

        public ResponseOutput<T> Ok(T data, object otherData, string msg = "", ApiResponseCodeEnum code = ApiResponseCodeEnum.OK)
        {
            IsSuccess = true;
            Code = code;
            Data = data;
            OtherData = otherData;
            ErrorMessage = msg;

            return this;
        }

        /// <summary>
        /// 失败
        /// </summary>
        /// <param name="msg">提示消息</param>
        /// <param name="data">数据</param>
        /// <returns></returns>
        public ResponseOutput<T> NotOk(string msg = "", T data = default, ApiResponseCodeEnum code = ApiResponseCodeEnum.OK, string localizedInfo = "")
        {
            IsSuccess = false;
            Code = code;
            ErrorMessage = msg;
            Data = data;
            LocalizedInfo = localizedInfo;
            return this;
        }


    }


    /// <summary>
    /// 响应数据静态输出  为了代码简洁  不用每处都New  
    /// </summary>
    public static class ResponseOutput
    {


        public static IResponseOutput<T> Ok<T>(T data = default, object otherData = default, string msg = "", ApiResponseCodeEnum code = ApiResponseCodeEnum.OK)
        {
            return new ResponseOutput<T>().Ok(data, otherData, msg, code);
        }
        /// <summary>
        /// 成功
        /// </summary>
        /// <returns></returns>
        public static IResponseOutput Ok()
        {
            return Ok<string>();
        }

        /// <summary>
        /// 失败
        /// </summary>
        /// <param name="msg">消息</param>
        /// <param name="data">数据</param>
        /// <returns></returns>
        public static IResponseOutput<T> NotOk<T>(string msg = "", T data = default, ApiResponseCodeEnum code = ApiResponseCodeEnum.BusinessValidationFailed, string localizedInfo = "")
        {
            return new ResponseOutput<T>().NotOk(msg, data, code, localizedInfo);
        }


        /// <summary>
        /// 失败
        /// </summary>
        /// <param name="msg">消息</param>
        /// <returns></returns>
        public static IResponseOutput<string> NotOk(string msg = "", ApiResponseCodeEnum code = ApiResponseCodeEnum.BusinessValidationFailed)
        {
            return new ResponseOutput<string>().NotOk(msg, code: code);
        }

        public static IResponseOutput<string> NotOk(LocalizedString msg, ApiResponseCodeEnum code = ApiResponseCodeEnum.BusinessValidationFailed)
        {

            var key = msg.Name;

            var info = string.Empty;

            if (!string.IsNullOrWhiteSpace(key) && StaticData.Log_Locoalize_Dic.ContainsKey(key))
            {
                info = $"[{key}]:{StaticData.Log_Locoalize_Dic[key]}";
            }

            return new ResponseOutput<string>().NotOk(msg, code: code, localizedInfo: info);
        }

        public static IResponseOutput<string> DBNotExistIfNUll(object businessObject)
        {
            return new ResponseOutput<string>().NotOk($"The business object{businessObject.GetType().Name} does not exist in the database, or was deleted by someone else, or an incorrect parameter query caused");
        }


        /// <summary>
        /// 根据布尔值返回结果        --适合删除
        /// </summary>
        /// <param name="success"></param>
        /// <returns></returns>
        public static IResponseOutput Result(bool success)
        {
            return success ? Ok() : NotOk("Expect a change, but the database data has not changed");
        }

        /// <summary>
        /// 根据布尔值返回结果        --适合添加和更新一起
        /// </summary>
        /// <param name="success"></param>
        /// <returns></returns>
        public static IResponseOutput<T> Result<T>(bool success, T data = default)
        {
            return success ? Ok<T>(data) : NotOk<T>("Saved failed", data);
        }

        ///// <summary>
        ///// 根据布尔值返回结果
        ///// </summary>
        ///// <param name="success"></param>
        ///// <returns></returns>
        //public static IResponseOutput Result<T>(bool success)
        //{
        //    return success ? Ok<T>() : NotOk<T>();
        //}
    }
}