noflo = require 'noflo'

class Kick extends noflo.Component
  description: 'This component generates a single packet and sends it to
  the output port. Mostly usable for debugging, but can also be useful
  for starting up networks.'
  icon: 'share'

  constructor: ->
    @data =
      packet: null
      group: []
    @groups = []

    @inPorts = new noflo.InPorts
      in:
        datatype: 'bang'
        description: 'Signal to send the data packet'
      data:
        datatype: 'all'
        description: 'Packet to be sent'
    @outPorts = new noflo.OutPorts
      out:
        datatype: 'all'

    @inPorts.in.on 'begingroup', (group) =>
      @groups.push group

    @inPorts.in.on 'data', =>
      @data.group = @groups.slice 0

    @inPorts.in.on 'endgroup', (group) =>
      @groups.pop()

    @inPorts.in.on 'disconnect', =>
      @sendKick @data
      @groups = []

    @inPorts.data.on 'data', (data) =>
      @data.packet = data

  sendKick: (kick) ->
    for group in kick.group
      @outPorts.out.beginGroup group

    @outPorts.out.send kick.packet

    for group in kick.group
      @outPorts.out.endGroup()

    @outPorts.out.disconnect()

exports.getComponent = -> new Kick
