using System;
using Content.Shared.GameObjects.Components;
using Content.Shared.Utility;
using Robust.Client.Graphics.Drawing;
using Robust.Client.UserInterface;
using Robust.Client.UserInterface.Controls;
using Robust.Shared.GameObjects;
using Robust.Shared.Maths;
using Robust.Shared.Timing;
using Robust.Shared.ViewVariables;

namespace Content.Client.GameObjects.Components
{
    [RegisterComponent]
    public sealed class HandheldLightComponent : SharedHandheldLightComponent, IItemStatus
    {
        [ViewVariables] protected override bool HasCell => _level != null;

        private byte? _level;

        public Control MakeControl()
        {
            return new StatusControl(this);
        }

        public override void HandleComponentState(ComponentState curState, ComponentState nextState)
        {
            base.HandleComponentState(curState, nextState);

            if (curState is not HandheldLightComponentState cast)
                return;

            _level = cast.Charge;
        }

        private sealed class StatusControl : Control
        {
            private const float TimerCycle = 1;

            private readonly HandheldLightComponent _parent;
            private readonly PanelContainer[] _sections = new PanelContainer[StatusLevels - 1];

            private float _timer;

            private static readonly StyleBoxFlat _styleBoxLit = new()
            {
                BackgroundColor = Color.Green
            };

            private static readonly StyleBoxFlat _styleBoxUnlit = new()
            {
                BackgroundColor = Color.Black
            };

            public StatusControl(HandheldLightComponent parent)
            {
                _parent = parent;

                var wrapper = new HBoxContainer
                {
                    SeparationOverride = 4,
                    SizeFlagsHorizontal = SizeFlags.ShrinkCenter
                };

                AddChild(wrapper);

                for (var i = 0; i < _sections.Length; i++)
                {
                    var panel = new PanelContainer {CustomMinimumSize = (20, 20)};
                    wrapper.AddChild(panel);
                    _sections[i] = panel;
                }
            }

            protected override void Update(FrameEventArgs args)
            {
                base.Update(args);

                if (!_parent.HasCell)
                    return;

                _timer += args.DeltaSeconds;
                _timer %= TimerCycle;

                var level = _parent._level;

                for (var i = 0; i < _sections.Length; i++)
                {
                    if (i == 0)
                    {
                        if (level == 0)
                        {
                            _sections[0].PanelOverride = _styleBoxUnlit;
                        }
                        else if (level == 1)
                        {
                            // Flash the last light.
                            _sections[0].PanelOverride = _timer > TimerCycle / 2 ? _styleBoxLit : _styleBoxUnlit;
                        }
                        else
                        {
                            _sections[0].PanelOverride = _styleBoxLit;
                        }

                        continue;
                    }

                    _sections[i].PanelOverride = level >= i + 2 ? _styleBoxLit : _styleBoxUnlit;
                }
            }
        }
    }
}
