#nullable enable
using System;
using Content.Shared.Chemistry;
using Content.Shared.GameObjects;
using Robust.Shared.GameObjects;
using Robust.Shared.Serialization;

namespace Content.Shared.Kitchen
{
    public abstract class SharedReagentGrinderComponent : Component
    {
        public override string Name => "ReagentGrinder";
        public override uint? NetID => ContentNetIDs.REAGENT_GRINDER;

        [Serializable, NetSerializable]
        public class ReagentGrinderGrindStartMessage : BoundUserInterfaceMessage
        {
            public ReagentGrinderGrindStartMessage()
            {
            }
        }

        [Serializable, NetSerializable]
        public class ReagentGrinderJuiceStartMessage : BoundUserInterfaceMessage
        {
            public ReagentGrinderJuiceStartMessage()
            {
            }
        }

        [Serializable, NetSerializable]
        public class ReagentGrinderEjectChamberAllMessage : BoundUserInterfaceMessage
        {
            public ReagentGrinderEjectChamberAllMessage()
            {
            }
        }

        [Serializable, NetSerializable]
        public class ReagentGrinderEjectBeakerMessage : BoundUserInterfaceMessage
        {
            public ReagentGrinderEjectBeakerMessage()
            {
            }
        }

        [Serializable, NetSerializable]
        public class ReagentGrinderEjectChamberContentMessage : BoundUserInterfaceMessage
        {
            public EntityUid EntityID;
            public ReagentGrinderEjectChamberContentMessage(EntityUid entityID)
            {
                EntityID = entityID;
            }
        }

        [Serializable, NetSerializable]
        public class ReagentGrinderVaporizeReagentIndexedMessage : BoundUserInterfaceMessage
        {
            public Solution.ReagentQuantity ReagentQuantity;
            public ReagentGrinderVaporizeReagentIndexedMessage(Solution.ReagentQuantity reagentQuantity)
            {
                ReagentQuantity = reagentQuantity;
            }
        }

        [Serializable, NetSerializable]
        public class ReagentGrinderWorkStartedMessage : BoundUserInterfaceMessage
        {
            public GrinderProgram GrinderProgram;
            public ReagentGrinderWorkStartedMessage(GrinderProgram grinderProgram)
            {
                GrinderProgram = grinderProgram;
            }
        }

        [Serializable, NetSerializable]
        public class ReagentGrinderWorkCompleteMessage : BoundUserInterfaceMessage
        {
            public ReagentGrinderWorkCompleteMessage()
            {
            }
        }

        [Serializable, NetSerializable]
        public enum ReagentGrinderVisualState : byte
        {
            BeakerAttached
        }

        [NetSerializable, Serializable]
        public enum ReagentGrinderUiKey : byte
        {
            Key
        }

        [Serializable, NetSerializable]
        public enum GrinderProgram : byte
        {
            Grind,
            Juice
        }
    }

    [NetSerializable, Serializable]
    public sealed class ReagentGrinderInterfaceState : BoundUserInterfaceState
    {
        public bool IsBusy;
        public bool HasBeakerIn;
        public bool Powered;
        public bool CanJuice;
        public bool CanGrind;
        public EntityUid[] ChamberContents;
        public Solution.ReagentQuantity[]? ReagentQuantities;
        public ReagentGrinderInterfaceState(bool isBusy, bool hasBeaker, bool powered, bool canJuice, bool canGrind, EntityUid[] chamberContents, Solution.ReagentQuantity[]? heldBeakerContents)
        {
            IsBusy = isBusy;
            HasBeakerIn = hasBeaker;
            Powered = powered;
            CanJuice = canJuice;
            CanGrind = canGrind;
            ChamberContents = chamberContents;
            ReagentQuantities = heldBeakerContents;
        }
    }
}
