using Newtonsoft.Json;
using System.Collections;
using UnityEngine;

namespace UVC.Json
{
    /// <summary>
    /// Json 직렬화/역직렬화 시 사용해야 함.
    /// 배열과 컬렉션은 Best.HTTP.JSON.LitJson, 일반 객체는 Unity의 JsonUtility를 사용합니다.
    /// Newtonsoft.Json을 사용한 역직렬화를 지원합니다.
    /// </summary>
    public static class JsonHelper
    {
        /// <summary>
        /// 객체를 JSON 문자열로 직렬화합니다.
        /// </summary>
        /// <param name="obj">직렬화할 객체</param>
        /// <returns>JSON 형식의 문자열</returns>
        /// <remarks>
        /// 객체가 배열이나 컬렉션인 경우 Best.HTTP.JSON.LitJson을 사용하고,
        /// 그 외의 경우엔 Unity의 JsonUtility를 사용합니다.
        /// </remarks>
        /// <example>
        /// <code>
        /// // 단일 객체 직렬화
        /// var user = new User { Id = 1, Name = "홍길동" };
        /// string userJson = JsonHelper.ToJson(user);
        /// 
        /// // 배열 직렬화
        /// var users = new User[] { 
        ///     new User { Id = 1, Name = "홍길동" },
        ///     new User { Id = 2, Name = "김철수" }
        /// };
        /// string arrayJson = JsonHelper.ToJson(users);
        /// </code>
        /// </example>
        public static string ToJson(object obj)
        {
            if (obj.GetType().IsArray || obj is ICollection)
            {
                return Best.HTTP.JSON.LitJson.JsonMapper.ToJson(obj);
            }
            else
            {
                return JsonUtility.ToJson(obj);
            }
        }

        /// <summary>
        /// JSON 문자열을 지정된 타입의 객체로 역직렬화합니다.
        /// </summary>
        /// <typeparam name="T">변환할 대상 객체 타입</typeparam>
        /// <param name="json">역직렬화할 JSON 문자열</param>
        /// <returns>역직렬화된 T 타입의 객체</returns>
        /// <remarks>
        /// JsonProperty 속성을 지원하기 위해 Newtonsoft.Json 라이브러리를 사용합니다.
        /// 이전에 사용하던 LitJson은 JsonProperty 지원이 제한적이었습니다.
        /// </remarks>
        /// <example>
        /// <code>
        /// // 단일 객체 역직렬화
        /// string userJson = "{\"Id\":1,\"Name\":\"홍길동\"}";
        /// User user = JsonHelper.FromJson<User>(userJson);
        /// Debug.Log($"사용자 정보: {user.Id}, {user.Name}");
        /// 
        /// // 컬렉션 역직렬화
        /// string arrayJson = "[{\"Id\":1,\"Name\":\"홍길동\"},{\"Id\":2,\"Name\":\"김철수\"}]";
        /// List<User> users = JsonHelper.FromJson<List<User>>(arrayJson);
        /// foreach(var u in users) {
        ///     Debug.Log($"사용자 정보: {u.Id}, {u.Name}");
        /// }
        /// </code>
        /// </example>
        public static T FromJson<T>(string json)
        {
            //JsonProperty 지원안해서 newtonsoft로 변경
            //return Best.HTTP.JSON.LitJson.JsonMapper.ToObject<T>(json);
            return JsonConvert.DeserializeObject<T>(json);
        }


    }
}
