namespace SRDebugger.Services.Implementation
{
    using Internal;
    using SRF.Service;
    using UI.Other;
    using UnityEngine;

    [Service(typeof (IDockConsoleService))]
    public class DockConsoleServiceImpl : IDockConsoleService
    {
        private ConsoleAlignment _alignment;
        private DockConsoleController _consoleRoot;
        private bool _didSuspendTrigger;
        private bool _isExpanded = true;
        private bool _isVisible;

        public DockConsoleServiceImpl()
        {
            _alignment = Settings.Instance.ConsoleAlignment;
        }

        public bool IsVisible
        {
            get { return _isVisible; }

            set
            {
                if (value == _isVisible)
                {
                    return;
                }

                _isVisible = value;

                if (_consoleRoot == null && value)
                {
                    Load();
                }
                else
                {
                    _consoleRoot.CachedGameObject.SetActive(value);
                }

                CheckTrigger();
            }
        }

        public bool IsExpanded
        {
            get { return _isExpanded; }

            set
            {
                if (value == _isExpanded)
                {
                    return;
                }

                _isExpanded = value;

                if (_consoleRoot == null && value)
                {
                    Load();
                }
                else
                {
                    _consoleRoot.SetDropdownVisibility(value);
                }

                CheckTrigger();
            }
        }

        public ConsoleAlignment Alignment
        {
            get { return _alignment; }
            set
            {
                _alignment = value;

                if (_consoleRoot != null)
                {
                    _consoleRoot.SetAlignmentMode(value);
                }

                CheckTrigger();
            }
        }

        private void Load()
        {
            var dockService = SRServiceManager.GetService<IPinnedUIService>();

            if (dockService == null)
            {
                Debug.LogError("[DockConsoleService] PinnedUIService not found");
                return;
            }

            var pinService = dockService as PinnedUIServiceImpl;

            if (pinService == null)
            {
                Debug.LogError("[DockConsoleService] Expected IPinnedUIService to be PinnedUIServiceImpl");
                return;
            }

            _consoleRoot = pinService.DockConsoleController;

            _consoleRoot.SetDropdownVisibility(_isExpanded);
            _consoleRoot.IsVisible = _isVisible;
            _consoleRoot.SetAlignmentMode(_alignment);

            CheckTrigger();
        }

        private void CheckTrigger()
        {
            ConsoleAlignment? triggerAlignment = null;
            var pinAlignment = Service.Trigger.Position;

            if (pinAlignment == PinAlignment.TopLeft ||
                pinAlignment == PinAlignment.TopRight || pinAlignment == PinAlignment.TopCenter)
            {
                triggerAlignment = ConsoleAlignment.Top;
            } else if (pinAlignment == PinAlignment.BottomLeft ||
                       pinAlignment == PinAlignment.BottomRight ||
                       pinAlignment == PinAlignment.BottomCenter)
            {
                triggerAlignment = ConsoleAlignment.Bottom;
            }

            var shouldHide = triggerAlignment.HasValue &&  IsVisible && Alignment == triggerAlignment.Value;

            // Show trigger if we have hidden it, and we no longer need to hide it.
            if (_didSuspendTrigger && !shouldHide)
            {
                Service.Trigger.IsEnabled = true;
                _didSuspendTrigger = false;
            }
            else if (Service.Trigger.IsEnabled && shouldHide)
            {
                Service.Trigger.IsEnabled = false;
                _didSuspendTrigger = true;
            }
        }
    }
}