using System;
using D2D.Common;
using D2D.Utilities;
using D2D.Core;
using D2D.Gameplay;
using NaughtyAttributes;
using UnityEngine;
using static D2D.Utilities.SettingsFacade;
using static D2D.Utilities.CommonLazyFacade;
using static D2D.Utilities.CommonGameplayFacade;
using System.Collections.Generic;

namespace D2D.Databases
{
    public class GameProgressionDatabase : GameStateMachineUser, ILazy
    {
        #region For analytics

        public readonly DataContainer<int> Reloads = 
            new DataContainer<int>("ReloadsCount", 0);
        
        public readonly DataContainer<int> CompletedLevelsPerSession = 
            new DataContainer<int>("CompletedLevelsPerSession", 0);

        #endregion

        // Stickman Squad Specified Vars
        public readonly DataContainer<float> PowerIncreasePercent =
            new DataContainer<float>("PowerIncreasePercent", 0);

        public readonly DataContainer<float> FireRateDecreasePercent =
            new DataContainer<float>("FireRateDecreasePercent", 0);

        public readonly DataContainer<float> PowerIncreaseLevel =
            new DataContainer<float>("PowerIncreaseLevel", 0);

        public readonly DataContainer<float> FireRateDecreaseLevel =
            new DataContainer<float>("FireRateDecreaseLevel", 0);

        public readonly DataContainer<string> UnlockableItem =
            new DataContainer<string>("UnlockableItem", "");

        public readonly DataContainer<float> UnlockableItemProgress =
            new DataContainer<float>("UnlockableItemProgress", 0f);

        public readonly DataContainer<string> LastUnlockedMember =
            new DataContainer<string>("LastUnlockedMember", "");

        public List<string> UnlockedMembers
        {
            get
            {
                if (ES3.KeyExists(UnlockedMembersKey))
                {
                    _UnlockedMembers = ES3.Load<List<string>>(UnlockedMembersKey);
                }
                else
                {
                    _UnlockedMembers = new List<string>();

                    ES3.Save(UnlockedMembersKey, _UnlockedMembers);
                }

                return _UnlockedMembers;
            }
        }

        private List<string> _UnlockedMembers;

        public void SaveMembers() => ES3.Save(UnlockedMembersKey, _UnlockedMembers);

        private const string UnlockedMembersKey = "UnlockedMembers";

        // Common Vars
        public readonly DataContainer<int> PassedLevels = 
            new DataContainer<int>("PassedLevels", 0);
        
        public readonly TrackableValue<float> Money =
            new TrackableValue<float>(value: 0, firstGet: () => PlayerPrefs.GetInt("Money"));
        
        public readonly DataContainer<int> LastSceneNumber 
            = new DataContainer<int>("LastSceneNumber", 1);


        public float TimeOfSceneLoad { get; private set; }

        public float TimeElapsedFromSceneLoad => Time.time - TimeOfSceneLoad;

        [RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.AfterSceneLoad)]
        private static void ResetLevelsPerSession()
        {
            LazySugar.FindLazy<GameProgressionDatabase>().CompletedLevelsPerSession.Value = 0;
        }

        protected override void OnEnable()
        {
            base.OnEnable();
            
            Money.Changed += SaveMoney;
            TimeOfSceneLoad = Time.time;
        }

        protected override void OnDisable()
        {
            base.OnDisable();
            
            Money.Changed -= SaveMoney;
        }

        private void SaveMoney(float val)
        {
            PlayerPrefs.SetInt("Money", Money.Value.Round());
        }

        private void OnApplicationQuit()
        {
            SaveMoney(Money.Value.Round());
        }

        private void Start()
        {
            var level = this.Find<Level>();
            if (level != null)
                LastSceneNumber.Value = level.SceneNumber;
        }
        
        protected override void OnGameWin()
        {
            Debug.Log("PassedLevels: " + PassedLevels.Value);
            CompletedLevelsPerSession.Value++;
            PassedLevels.Value++;
        }
        
        
        public static void Clear()
        {
            ES3.Save("ReloadsCount", 0);
            ES3.Save("CompletedLevelsPerSession", 0);
            ES3.Save("PassedLevels", 0);
            ES3.Save("LastSceneNumber", 1);
            ES3.Save("PassedLevels", 0);
            ES3.Save("LastSceneNumber", 1);
            ES3.Save("PowerIncreaseLevel", 0f);
            ES3.Save("FireRateDecreaseLevel", 0f);
            ES3.Save("UnlockableItemProgress", 0f);
            ES3.Save("UnlockableItem", "");
            ES3.Save("LastUnlockedMember", "");
            ES3.Save(UnlockedMembersKey, new List<string>());

            PlayerPrefs.SetInt("Money", 0);
        }
    }
}