from OdenGraphQt import BaseNode, BaseNodeCircle


class BasicNodeA(BaseNode):
    """
    A node class with 2 inputs and 2 outputs.
    """

    # unique node identifier.
    __identifier__ = 'nodes.basic'

    # initial default node name.
    NODE_NAME = 'node A'

    def __init__(self):
        super(BasicNodeA, self).__init__()

        # create node inputs.
        self.add_input('in A')
        self.add_input('in B')

        # create node outputs.
        self.add_output('out A')
        self.add_output('out B')


class BasicNodeB(BaseNode):
    """
    A node class with 3 inputs and 3 outputs.
    The last input and last output can take in multiple pipes.
    """

    # unique node identifier.
    __identifier__ = 'nodes.basic'

    # initial default node name.
    NODE_NAME = 'node B'

    def __init__(self):
        super(BasicNodeB, self).__init__()

        # create node inputs
        self.add_input('single 1')
        self.add_input('single 2')
        self.add_input('multi in', multi_input=True)

        # create node outputs
        self.add_output('single 1', multi_output=False)
        self.add_output('single 2', multi_output=False)
        self.add_output('multi out')


class CircleNode(BaseNodeCircle):
    """
    A node class with 3 inputs and 3 outputs.
    This node is a circular design.
    """

    # unique node identifier.
    __identifier__ = 'nodes.basic'

    # initial default node name.
    NODE_NAME = 'Circle Node'

    def __init__(self):
        super(CircleNode, self).__init__()
        self.set_color(10, 24, 38)

        # create node inputs
        p = self.add_input('in 1')
        p.add_accept_port_type(
            port_name='single 1',
            port_type='out',
            node_type='nodes.basic.BasicNodeB'
        )

        self.add_input('in 2')
        self.add_input('in 3', multi_input=True)
        self.add_input('in 4', display_name=False)
        self.add_input('in 5', display_name=False)

        # create node outputs
        self.add_output('out 1')
        self.add_output('out 2', multi_output=False)
        self.add_output('out 3', multi_output=True, display_name=False)
        self.add_output('out 4', multi_output=True, display_name=False)