﻿using UnityEngine;

namespace JLGames.RocketDriver.Actions.Localx
{
    public static class LocalStore
    {
        public static void SetBool(string key, bool value)
        {
            SetBool(key, value, LocalDomain.CurrentDomain, null);
        }

        public static void SetBool(string key, bool value, string domain, string version)
        {
            var v = value ? 1 : 0;
            PlayerPrefs.SetInt(Internel.InnerMergeKey(key, domain, version), v);
        }

        public static void SetBoolArray(string key, bool[] value)
        {
            SetBoolArray(key, value, LocalDomain.CurrentDomain, null);
        }

        public static void SetBoolArray(string key, bool[] value, string domain, string version)
        {
            var str = Internel.ArrayToString(value);
            SetString(key, str, domain, version);
        }

        public static bool GetBool(string key)
        {
            return GetBool(key, LocalDomain.CurrentDomain, null);
        }

        public static bool GetBool(string key, string domain, string version)
        {
            var value = PlayerPrefs.GetInt(Internel.InnerMergeKey(key, domain, version), 0);
            return value == 1;
        }

        public static bool[] GetBoolArray(string key)
        {
            return GetBoolArray(key, LocalDomain.CurrentDomain, null);
        }

        public static bool[] GetBoolArray(string key, string domain, string version)
        {
            var str = PlayerPrefs.GetString(Internel.InnerMergeKey(key, domain, version), null);
            return Internel.BoolArrayFromString(str);
        }

        public static void SetInt(string key, int value)
        {
            SetInt(key, value, LocalDomain.CurrentDomain, null);
        }

        public static void SetInt(string key, int value, string domain, string version)
        {
            PlayerPrefs.SetInt(Internel.InnerMergeKey(key, domain, version), value);
        }

        public static void SetIntArray(string key, int[] value)
        {
            SetIntArray(key, value, LocalDomain.CurrentDomain, null);
        }

        public static void SetIntArray(string key, int[] value, string domain, string version)
        {
            var str = Internel.ArrayToString(value);
            PlayerPrefs.SetString(Internel.InnerMergeKey(key, domain, version), str);
        }

        public static int GetInt(string key)
        {
            return GetInt(key, LocalDomain.CurrentDomain, null);
        }

        public static int GetInt(string key, string domain, string version)
        {
            return PlayerPrefs.GetInt(Internel.InnerMergeKey(key, domain, version), 0);
        }

        public static int[] GetIntArray(string key)
        {
            return GetIntArray(key, LocalDomain.CurrentDomain, null);
        }

        public static int[] GetIntArray(string key, string domain, string version)
        {
            var str = PlayerPrefs.GetString(Internel.InnerMergeKey(key, domain, version), null);
            return Internel.IntArrayFromString(str);
        }

        public static void SetFloat(string key, float value)
        {
            SetFloat(key, value, LocalDomain.CurrentDomain, null);
        }

        public static void SetFloat(string key, float value, string domain, string version)
        {
            PlayerPrefs.SetFloat(Internel.InnerMergeKey(key, domain, version), value);
        }

        public static void SetFloatArray(string key, float[] value)
        {
            SetFloatArray(key, value, LocalDomain.CurrentDomain, null);
        }

        public static void SetFloatArray(string key, float[] value, string domain, string version)
        {
            var str = Internel.ArrayToString(value);
            PlayerPrefs.SetString(Internel.InnerMergeKey(key, domain, version), str);
        }

        public static float GetFloat(string key)
        {
            return GetFloat(key, LocalDomain.CurrentDomain, null);
        }

        public static float GetFloat(string key, string domain, string version)
        {
            return PlayerPrefs.GetFloat(Internel.InnerMergeKey(key, domain, version), 0);
        }

        public static float[] GetFloatArray(string key)
        {
            return GetFloatArray(key, LocalDomain.CurrentDomain, null);
        }

        public static float[] GetFloatArray(string key, string domain, string version)
        {
            var str = PlayerPrefs.GetString(Internel.InnerMergeKey(key, domain, version), null);
            return Internel.FloatArrayFromString(str);
        }

        public static void SetString(string key, string value)
        {
            SetString(key, value, LocalDomain.CurrentDomain, null);
        }

        public static void SetString(string key, string value, string domain, string version)
        {
            PlayerPrefs.SetString(Internel.InnerMergeKey(key, domain, version), value);
        }

        public static string GetString(string key)
        {
            return GetString(key, LocalDomain.CurrentDomain, null);
        }

        public static string GetString(string key, string domain, string version)
        {
            return PlayerPrefs.GetString(Internel.InnerMergeKey(key, domain, version), "");
        }

        public static void SetJsonObject(string key, object value)
        {
            var str = JsonUtility.ToJson(value);
            SetString(key, str);
        }

        public static void SetJsonObject(string key, object value, string domain, string version)
        {
            var str = JsonUtility.ToJson(value);
            SetString(key, str, domain, version);
        }

        public static T GetJsonObject<T>(string key)
        {
            var str = GetString(key);
            var rs = JsonUtility.FromJson<T>(str);
            return rs;
        }

        public static T GetJsonObject<T>(string key, string domain, string version)
        {
            var str = GetString(key, domain, version);
            var rs = JsonUtility.FromJson<T>(str);
            return rs;
        }

        public static void SaveLocal()
        {
            PlayerPrefs.Save();
        }

        public static void DeleteAll()
        {
            PlayerPrefs.DeleteAll();
        }
    }
}