namespace SRDebugger.UI.Controls
{
    using System;
    using SRF;
    using UnityEngine;
    using UnityEngine.UI;
#if UNITY_5_5_OR_NEWER
    using UnityEngine.Profiling;
#endif
    public class ProfilerMonoBlock : SRMonoBehaviourEx
    {
        private float _lastRefresh;
        [RequiredField]
        public Text CurrentUsedText;
        [RequiredField]
        public GameObject NotSupportedMessage;
        [RequiredField]
        public Slider Slider;
        [RequiredField]
        public Text TotalAllocatedText;
        private bool _isSupported;
        protected override void OnEnable()
        {
            base.OnEnable();
#if UNITY_5_6_OR_NEWER
            _isSupported = Profiler.GetMonoUsedSizeLong() > 0;
#else
            _isSupported = Profiler.GetMonoUsedSize() > 0;
#endif
            NotSupportedMessage.SetActive(!_isSupported);
            CurrentUsedText.gameObject.SetActive(_isSupported);
            TriggerRefresh();
        }
        protected override void Update()
        {
            base.Update();
            if (SRDebug.Instance.IsDebugPanelVisible && (Time.realtimeSinceStartup - _lastRefresh > 1f))
            {
                TriggerRefresh();
                _lastRefresh = Time.realtimeSinceStartup;
            }
        }
        public void TriggerRefresh()
        {
            long max;
            long current;
#if UNITY_5_6_OR_NEWER
            max = _isSupported ? Profiler.GetMonoHeapSizeLong() : GC.GetTotalMemory(false);
            current = Profiler.GetMonoUsedSizeLong();
#else
            max = _isSupported ? Profiler.GetMonoHeapSize() : GC.GetTotalMemory(false);
            current = Profiler.GetMonoUsedSize();
#endif
            var maxMb = (max >> 10);
            maxMb /= 1024; // On new line to workaround IL2CPP bug
            var currentMb = (current >> 10);
            currentMb /= 1024;
            Slider.maxValue = maxMb;
            Slider.value = currentMb;
            TotalAllocatedText.text = "Total: {0}MB".Fmt(maxMb);
            if (currentMb > 0)
            {
                CurrentUsedText.text = "{0}MB".Fmt(currentMb);
            }
        }
        public void TriggerCollection()
        {
            GC.Collect();
            TriggerRefresh();
        }
    }
}