using System;

using RobocraftX.Blocks;
using RobocraftX.Common;
using Svelto.ECS;
using Unity.Mathematics;

using GamecraftModdingAPI;
using GamecraftModdingAPI.Utility;

namespace GamecraftModdingAPI.Blocks
{
	public class ConsoleBlock : SignalingBlock
    {
	    public ConsoleBlock(EGID id): base(id)
        {
        }

	    public ConsoleBlock(uint id): base(new EGID(id, CommonExclusiveGroups.CONSOLE_BLOCK_GROUP))
        {
        }

        // custom console block properties

        /// <summary>
        /// Setting a nonexistent command will crash the game when switching to simulation
        /// </summary>
        public string Command
		{
			get
			{
				return BlockEngine.GetBlockInfo(this, (ConsoleBlockEntityStruct st) => st.commandName);
			}

			set
			{
				BlockEngine.SetBlockInfo(this, (ref ConsoleBlockEntityStruct st, string val) => st.commandName.Set(val),
					value);
			}
		}

		public string Arg1
		{
			get => BlockEngine.GetBlockInfo(this, (ConsoleBlockEntityStruct st) => st.arg1);

			set
			{
				BlockEngine.SetBlockInfo(this, (ref ConsoleBlockEntityStruct st, string val) => st.arg1.Set(val),
					value);
			}
		}

		public string Arg2
        {
			get => BlockEngine.GetBlockInfo(this, (ConsoleBlockEntityStruct st) => st.arg2);

			set
			{
				BlockEngine.SetBlockInfo(this, (ref ConsoleBlockEntityStruct st, string val) => st.arg2.Set(val),
					value);
			}
        }

		public string Arg3
        {
			get => BlockEngine.GetBlockInfo(this, (ConsoleBlockEntityStruct st) => st.arg3);

			set
			{
				BlockEngine.SetBlockInfo(this, (ref ConsoleBlockEntityStruct st, string val) => st.arg3.Set(val),
					value);
			}
        }
    }
}