using FeMM.Grasshopper.Helpers;
using Grasshopper.Kernel;
using St7API;
using System;
using System.Collections.Generic;

namespace FeMM.Grasshopper.Components.ST2R
{
    public class St7GetBeamSelectStateComponent : GH_Component
    {
        public St7GetBeamSelectStateComponent()
            : base(
                "Get Beam Select State",
                "GetBeamSelectState",
                "Returns the selection state of a beam",
                CategoryNameConstants.CATEGORY_F2R, CategoryNameConstants.SUBCATEGORY_ST2R_BAKE)
        { }

        public override void CreateAttributes()
        {
            var buttonAttributes = new ComponentAttributes.ComponentOneButtonAttributes(this, "Check");
            buttonAttributes.ButtonPressed += () =>
            {
                ExpireSolution(true);
            };
            m_attributes = buttonAttributes;
        }

        protected override void RegisterInputParams(GH_InputParamManager p)
        {
            p.AddIntegerParameter("uID", "ID", "Straus7 model file ID", GH_ParamAccess.item);
            p.AddIntegerParameter("Beam Number", "Num", "Beam number in Straus7", GH_ParamAccess.item);
        }

        protected override void RegisterOutputParams(GH_OutputParamManager p)
        {
            p.AddBooleanParameter("SelectedState", "Sel", "Selection state of the beam for Local 0", GH_ParamAccess.item);
            p.AddTextParameter("Log", "Log", "Debug messages", GH_ParamAccess.list);
        }

        protected override void SolveInstance(IGH_DataAccess DA)
        {
            int uID = 0;
            int beamNum = 0;

            if (!DA.GetData(0, ref uID)) return;
            if (!DA.GetData(1, ref beamNum)) return;

            List<string> log = [];
            bool isSelected = false;

            // Always check Local 0
            byte selectedByte = 0;
            int err = St7.St7GetEntitySelectState(uID, St7.tyBEAM, beamNum, 0, ref selectedByte);

            if (err != 0)
            {
                log.Add($"Error reading selection for Beam {beamNum}, Local 0: {err}");
            }
            else
            {
                isSelected = selectedByte != 0;
                log.Add($"Beam {beamNum}, Local 0 selected: {isSelected}");
            }

            DA.SetData(0, isSelected);
            DA.SetDataList(1, log);
        }

        protected override System.Drawing.Bitmap Icon => Properties.Resources.St7GetBeamSelectStateIcon;

        public override Guid ComponentGuid =>
            new("e7c8f3a0-1234-4abc-9d12-abcdef123458");
    }
}
303 files24 directories