using System;
using System.ComponentModel;
using UnityEngine.UI;

namespace SRDebugger.UI.Other
{
    using Internal;
    using SRF;
    using UnityEngine;

    [RequireComponent(typeof (Canvas))]
    public class ConfigureCanvasFromSettings : SRMonoBehaviour
    {
        private Canvas _canvas;
        private CanvasScaler _canvasScaler;

        private float _originalScale;
        private float _lastSetScale;
        private Settings _settings;

        private void Start()
        {
            _canvas = GetComponent<Canvas>();
            _canvasScaler = GetComponent<CanvasScaler>();

            SRDebuggerUtil.ConfigureCanvas(_canvas);

            _settings = SRDebug.Instance.Settings;
            _originalScale = _canvasScaler.scaleFactor;
            _canvasScaler.scaleFactor = _originalScale * _settings.UIScale;

            // Track the last set scale in case it is modified by the retina scaler.
            _lastSetScale = _canvasScaler.scaleFactor;

            _settings.PropertyChanged += SettingsOnPropertyChanged;
        }

        private void OnDestroy()
        {
            if (_settings != null)
            {
                _settings.PropertyChanged -= SettingsOnPropertyChanged;
            }
        }

        private void SettingsOnPropertyChanged(object sender, PropertyChangedEventArgs propertyChangedEventArgs)
        {
            // If the last set scale does not match the current scale factor, then it is likely the retina scaler has applied a change.
            // Treat the new value as the original scale.
            if (_canvasScaler.scaleFactor != _lastSetScale) _originalScale = _canvasScaler.scaleFactor;

            _canvasScaler.scaleFactor = _originalScale * _settings.UIScale;
            _lastSetScale = _canvasScaler.scaleFactor;
        }
    }
}