package App::Netdisco::Worker::Plugin::Discover::WithNodes;

use Dancer ':syntax';
use App::Netdisco::Worker::Plugin;
use aliased 'App::Netdisco::Worker::Status';

use App::Netdisco::JobQueue 'jq_insert';
use App::Netdisco::Util::Permission 'acl_matches';

register_worker({ phase => 'main' }, sub {
  my ($job, $workerconf) = @_;
  my $device = $job->device;

  # if requested, and the device has not yet been
  # arpniped/macsucked, queue those jobs now
  return unless $device->in_storage and $job->subaction eq 'with-nodes';

  if (!defined $device->last_macsuck and ($device->has_layer(2)
                                          or acl_matches($device, 'force_macsuck')
                                          or acl_matches($device, 'ignore_layers'))) {
    jq_insert({
      device => $device->ip,
      action => 'macsuck',
      username => $job->username,
      userip => $job->userip,
    });
    debug sprintf ' [%s] queued macsuck', $device;
  }

  if (!defined $device->last_arpnip and ($device->has_layer(3)
                                         or acl_matches($device, 'force_arpnip')
                                         or acl_matches($device, 'ignore_layers'))) {
    jq_insert({
      device => $device->ip,
      action => 'arpnip',
      username => $job->username,
      userip => $job->userip,
    });
    debug sprintf ' [%s] queued arpnip', $device;
  }
});

true;