#!/usr/bin/env python3

"""
Standardized Data Node:
  - Accepts and transmits values consistently.
  - Updates its value based on a global update timer.
"""

from OdenGraphQt import BaseNode
from Qt import QtCore

class DataNode(BaseNode):
    __identifier__ = 'bunny-lab.io.data_node'
    NODE_NAME = 'Data Node'

    def __init__(self):
        super(DataNode, self).__init__()
        self.add_input('Input')
        self.add_output('Output')
        self.add_text_input('value', 'Value', text='')
        self.process_widget_event()
        self.set_name("Data Node")
        # Removed self-contained update timer; global timer now drives updates.

    def post_create(self):
        text_widget = self.get_widget('value')
        if text_widget is not None:
            try:
                # Removed textChanged signal connection; global timer will call process_input.
                pass
            except Exception as e:
                print("Error connecting textChanged signal:", e)

    def process_widget_event(self, event=None):
        current_text = self.get_property('value')
        self.value = current_text
        self.transmit_data(current_text)

    def property_changed(self, property_name):
        if property_name == 'value':
            # Immediate update removed; relying on global timer.
            pass

    def process_input(self):
        input_port = self.input(0)
        output_port = self.output(0)
        if input_port.connected_ports():
            input_value = input_port.connected_ports()[0].node().get_property('value')
            self.set_property('value', input_value)
            self.transmit_data(input_value)
        elif output_port.connected_ports():
            self.transmit_data(self.get_property('value'))

    def on_input_connected(self, input_port, output_port):
        # Removed immediate update; global timer handles updates.
        pass

    def on_input_disconnected(self, input_port, output_port):
        # Removed immediate update; global timer handles updates.
        pass

    def receive_data(self, data, source_port_name=None):
        self.set_property('value', str(data))
        self.transmit_data(data)

    def transmit_data(self, data):
        output_port = self.output(0)
        if output_port and output_port.connected_ports():
            for connected_port in output_port.connected_ports():
                connected_node = connected_port.node()
                if hasattr(connected_node, 'receive_data'):
                    connected_node.receive_data(data, source_port_name="Output")