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

namespace Adplay.Behaviours
{
    public static class AdPlayCacheService
    {

        private const string PlayerPrefsSaveKey = "AdPlayCacheSaveKey";
        private static List<CacheDetail> cacheDetails = new();

        public static void Initialize()
        {
            if (PlayerPrefs.HasKey(PlayerPrefsSaveKey))
            {
                cacheDetails = LoadCache();
            }
            else
            {
                cacheDetails = new();
                SaveCache();
            }
        }

        private static List<CacheDetail> LoadCache()
        {
            var json = PlayerPrefs.GetString(PlayerPrefsSaveKey);
            var cacheDetails = JsonConvert.DeserializeObject<List<CacheDetail>>(json);
            if (cacheDetails == null)
                return new();
            foreach (var cacheDetail in cacheDetails)
            {
                var texture = new Texture2D(1, 1);
                texture.LoadImage(cacheDetail.textureRawData);
                cacheDetail.texture = texture;
            }
            return cacheDetails;
        }

        private static void SaveCache()
        {
            var json = JsonConvert.SerializeObject(cacheDetails);
            PlayerPrefs.SetString(PlayerPrefsSaveKey, json);
        }

        public static void RemoveCahce()
        {
            PlayerPrefs.DeleteKey(PlayerPrefsSaveKey);
        }

        public static void LoadJsonCache()
        {
            var urls = LoadCache().Select(l => l.url);
            foreach (var url in urls)
                Debug.Log(url);
        }


        public static bool GetTexture(string url, out Texture2D texture)
        {
            var cache = cacheDetails.FirstOrDefault(c => c.url == url);
            texture = cache?.texture;
            return cache != null;
        }

        public static void RemoveOldCache(List<string> urls)
        {
            var oldCacheDetails = cacheDetails
                .Where(x => !urls.Contains(x.url))
                .ToList();
            foreach (var old in oldCacheDetails)
            {
                var oldCache = cacheDetails.FirstOrDefault(c => c.url == old.url);
                cacheDetails.Remove(old);
            }
            SaveCache();
        }

        public static void AddTexture(string url, Texture2D texture)
        {
            if (texture == null)
            {
#if UNITY_EDITOR
                Debug.LogError("Try to save null texture");
#endif
                return;
            }
            var cacheDetail = new CacheDetail()
            {
                url = url,
                texture = texture,
                textureRawData = texture.EncodeToPNG(),
            };
            cacheDetails.Add(cacheDetail);

            SaveCache();
        }

    }

    [System.Serializable]
    public class CacheDetail
    {
        public string url;
        public byte[] textureRawData;
        [JsonIgnore] public Texture2D texture;
    }


}
