import { app } from "../../../scripts/app.js";

app.registerExtension({
  name: "Bjornulf.PickInput",
  async nodeCreated(node) {
    if (node.comfyClass === "Bjornulf_PickInput") {
      const updateInputButtons = (numInputs) => {
        // Remove only the dynamic widgets (input buttons and stop button)
        node.widgets = node.widgets.filter((w) => !w.dynamicWidget);

        // Add new input buttons
        for (let i = 1; i <= numInputs; i++) {
          const inputButton = node.addWidget(
            "button",
            `Input ${i}`,
            `input_button_${i}`,
            () => {
              fetch(`/bjornulf_select_input_${i}`, { method: "GET" })
                .then((response) => response.text())
                .then((data) => {
                  console.log(`Input ${i} response:`, data);
                  // You can update the UI here if needed
                })
                .catch((error) => console.error("Error:", error));
            }
          );
          inputButton.dynamicWidget = true; // Tag as dynamic
        }

        // Add the Stop button
        const stopButton = node.addWidget("button", "Stop", "Stop", () => {
          fetch("/bjornulf_stop_pick", { method: "GET" })
            .then((response) => response.text())
            .then((data) => {
              console.log("Stop response:", data);
              // You can update the UI here if needed
            })
            .catch((error) => console.error("Error:", error));
        });
        stopButton.dynamicWidget = true; // Tag as dynamic

        node.setSize(node.computeSize());
      };

      const updateInputs = () => {
        const numInputsWidget = node.widgets.find(
          (w) => w.name === "number_of_inputs"
        );
        if (!numInputsWidget) return;

        const numInputs = numInputsWidget.value;

        // Initialize node.inputs if it doesn't exist
        if (!node.inputs) {
          node.inputs = [];
        }

        // Filter existing text inputs
        const existingInputs = node.inputs.filter((input) =>
          input.name.startsWith("input_")
        );

        // Determine if we need to add or remove inputs
        if (existingInputs.length < numInputs) {
          // Add new inputs if not enough existing
          for (let i = existingInputs.length + 1; i <= numInputs; i++) {
            const inputName = `input_${i}`;
            if (!node.inputs.find((input) => input.name === inputName)) {
              node.addInput(inputName, "*");
            }
          }
        } else {
          // Remove excess inputs if too many
          node.inputs = node.inputs.filter(
            (input) =>
              !input.name.startsWith("input_") ||
              parseInt(input.name.split("_")[1]) <= numInputs
          );
        }

        // Update input buttons
        updateInputButtons(numInputs);

        node.setSize(node.computeSize());
      };

      // Move number_of_inputs to the top initially
      const numInputsWidget = node.widgets.find(
        (w) => w.name === "number_of_inputs"
      );
      if (numInputsWidget) {
        node.widgets = [
          numInputsWidget,
          ...node.widgets.filter((w) => w !== numInputsWidget),
        ];
        numInputsWidget.callback = () => {
          updateInputs();
          app.graph.setDirtyCanvas(true);
        };
      }

      // Delay the initial update to ensure node is fully initialized
      setTimeout(updateInputs, 0);

      // Hide the seed widget
      const seedWidget = node.widgets.find((w) => w.name === "seed");
      if (seedWidget) {
        seedWidget.type = "HIDDEN";
      }
    }
  },
});
