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 =
      in: new noflo.Port 'bang'
      data: new noflo.Port 'all'

    @outPorts =
      out: new noflo.ArrayPort '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
