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

namespace FeMM.Grasshopper.Components.ST2R
{
    public class St7SetNodeXYZComponent : GH_Component
    {
        private bool _run = false;

        public St7SetNodeXYZComponent()
            : base("Set Node Positions", "SetNodePositions",
                  "Sets the coordinates of nodes",
                  CategoryNameConstants.CATEGORY_F2R, CategoryNameConstants.SUBCATEGORY_ST2R_BAKE)
        { }

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

        protected override void RegisterInputParams(GH_InputParamManager p)
        {
            p.AddIntegerParameter("uID", "ID", "Straus7 model file ID", GH_ParamAccess.item);
            p.AddIntegerParameter("Node Number", "Num", "Node number in Straus7", GH_ParamAccess.item);
            p.AddNumberParameter("Coordinates", "C", "Coordinates as [X,Y,Z] per node branch", GH_ParamAccess.tree);
        }

        protected override void RegisterOutputParams(GH_OutputParamManager p)
        {
            p.AddBooleanParameter("Success", "OK", "True if node coordinates were set successfully", GH_ParamAccess.item);
            p.AddTextParameter("Log", "Log", "Debug messages", GH_ParamAccess.list);
        }

        protected override void SolveInstance(IGH_DataAccess DA)
        {
            int uid = 0;
            int nodeNum = 0;

            if (!DA.GetData(0, ref uid)) return;
            if (!DA.GetData(1, ref nodeNum)) return;
            if (!DA.GetDataTree(2, out GH_Structure<GH_Number> xyzTree)) return;

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

            if (!_run)
            {
                DA.SetData(0, success);
                DA.SetDataList(1, log);
                return;
            }

            // Check if branch for node exists
            GH_Path path = new(nodeNum - 1);
            if (!xyzTree.Paths.Contains(path))
            {
                log.Add($"No coordinate data found for Node {nodeNum}");
                DA.SetData(0, success);
                DA.SetDataList(1, log);
                _run = false;
                return;
            }

            var branch = xyzTree.Branches[nodeNum - 1]; // branch is List<GH_Number>
            if (branch.Count != 3)
            {
                log.Add($"Node {nodeNum} must have exactly 3 numbers (X,Y,Z)");
                DA.SetData(0, success);
                DA.SetDataList(1, log);
                _run = false;
                return;
            }

            double[] xyz =
            [
                branch[0].Value,
                branch[1].Value,
                branch[2].Value
            ];

            // Call Straus7 API
            long err = St7.St7SetNodeXYZ(uid, nodeNum, xyz);

            if (err != 0)
            {
                log.Add($"Error setting Node {nodeNum} coordinates: {err}");
            }
            else
            {
                log.Add($"Node {nodeNum} coordinates set: X={xyz[0]}, Y={xyz[1]}, Z={xyz[2]}");
                success = true;
            }

            DA.SetData(0, success);
            DA.SetDataList(1, log);

            _run = false; // reset button
        }

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

        public override Guid ComponentGuid => new("c1d2e3f4-5678-4abc-9d12-abcdef123464");
    }
}
303 files24 directories