using System;
using Robust.Shared.GameObjects;
using Robust.Shared.Maths;
using Robust.Shared.Players;
using Robust.Shared.Serialization;
using Robust.Shared.Serialization.Manager.Attributes;
using Robust.Shared.ViewVariables;

namespace Content.Shared.Friction
{
    [RegisterComponent]
    public sealed class TileFrictionModifierComponent : Component
    {
        /// <summary>
        ///     Multiply the tilefriction cvar by this to get the body's actual tilefriction.
        /// </summary>
        [ViewVariables(VVAccess.ReadWrite)]
        public float Modifier
        {
            get => _modifier;
            set
            {
                if (MathHelper.CloseToPercent(_modifier, value)) return;

                _modifier = value;
            }
        }

        [DataField("modifier")]
        private float _modifier = 1.0f;

        public override ComponentState GetComponentState()
        {
            return new TileFrictionComponentState(_modifier);
        }

        public override void HandleComponentState(ComponentState? curState, ComponentState? nextState)
        {
            base.HandleComponentState(curState, nextState);
            if (curState is not TileFrictionComponentState tileState) return;
            _modifier = tileState.Modifier;
        }

        [NetSerializable, Serializable]
        private sealed class TileFrictionComponentState : ComponentState
        {
            public float Modifier;

            public TileFrictionComponentState(float modifier)
            {
                Modifier = modifier;
            }
        }
    }
}
