using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using LitJson;
using System.IO;

/// <summary>
/// 使用类型
/// </summary>
public enum JsonType
{
    /// <summary>
    /// 第三方
    /// </summary>
    LitJson,
    /// <summary>
    /// 系统自带
    /// </summary>
    JsonUtility,
}


/// <summary>
/// Json数据处理 类 用于处理Json数据
/// Unity有自带的json处理类JsonUtility 
///     不支持字典
///     自定义类需要加特性[System.Serializable]
///     private protected 类需要序列化 需要加特性[SerializeField]
///     不能直接读取数组数据
/// 我们常用LitJson
///     不支持私有变量
///     JsonData可以用来获取 字段内容
///     字典需要使用 键string类型
///     自定义类需要使用 无参构造函数
///     文本编码格式UTF-8
/// </summary>
public class JsonManager : BaseManager<JsonManager>
{
    private JsonManager() { }

    /// <summary>
    /// 保存数据 PC端
    /// </summary>
    /// <param name="data">需要存储的数据对象</param>
    /// <param name="fileName">存储为的文件名</param>
    /// <param name="type">存储方式,默认LitJson</param>
    public void SaveData(object data ,string fileName,JsonType type = JsonType.LitJson)
    {
        //存储路径
        string path = Application.persistentDataPath + "/" + fileName + ".json";
        //序列化 得到json字符串
        string json = "";
        switch (type)
        {
            case JsonType.LitJson:
                json = JsonMapper.ToJson(data);
                break;
            case JsonType.JsonUtility:
                json = JsonUtility.ToJson(data);
                break;
        }
        //把json字符串保存成文件
        File.WriteAllText(path, json);
    }

    /// <summary>
    /// 读取数据 PC端
    /// </summary>
    /// <typeparam name="T">类型</typeparam>
    /// <param name="path"></param>
    /// <returns></returns>
    public T LoadData<T>(string fileName,JsonType type = JsonType.LitJson) where T : new()
    {
        //路径
        string path = Application.streamingAssetsPath + "/" + fileName + ".json";
        if (!File.Exists(path))
        {
            path = Application.persistentDataPath + "/" + fileName + ".json";
        }
        if (!File.Exists(path))
        {
            return new T();
        }
        //获取json字符串
        string jsonStr = File.ReadAllText(path);

        //
        T data = new T();
        //反序列
        switch (type)
        {
            case JsonType.LitJson:
                data = JsonMapper.ToObject<T>(jsonStr);
                break;
            case JsonType.JsonUtility:
                data = JsonUtility.FromJson<T>(jsonStr);
                break;
        }
        return data;
    }
}