#!/usr/bin/env perl
use strict;
use warnings;

use Module::Runtime qw/require_module/;
use Log::Log4perl;

package SpawnWorkerArgs {
  use Moose;
  with 'MooseX::Getopt';

  has worker    => (is => 'ro', isa => 'Str', required => 1, documentation => 'The SQS::Worker class name');
  has queue_url => (is => 'ro', isa => 'Str', required => 1, documentation => 'The SQS queue URL to poll for messages');
  has region    => (is => 'ro', isa => 'Str', required => 1, documentation => 'The SQS region identifier');
  has log_conf  => (is => 'ro', isa => 'Str', required => 0, documentation => 'Path to a Log4perl config file');
  has consumer  => (is => 'ro', isa => 'Str', required => 0, default => sub { 'Default' },
      documentation => 'The SQS::Consumers model to use. Either Default or DeleteAlways. If empty Default processing model is assumed.');
  has _consumer  => (is => 'ro', lazy => 1, builder => '_consumer_builder');

  sub _consumer_builder {
      my $self = shift;
      if ($self->consumer eq 'DeleteAlways') {
          return SQS::Consumers::DeleteAlways->new;
      }
      return SQS::Consumers::Default->new;
  }
}

my $args = SpawnWorkerArgs->new_with_options();

if ($args->log_conf) {
  Log::Log4perl::init($args->log_conf);
} else {
  Log::Log4perl->init(\ qq{
log4perl.rootLogger=ERROR, SCREEN
    
log4perl.appender.SCREEN=Log::Log4perl::Appender::Screen

log4perl.appender.SCREEN.layout=PatternLayout
log4perl.appender.SCREEN.layout.ConversionPattern=[%r] %F %L %c - %m%n
  });
}

require_module($args->worker);

# Instance worker
my $worker_instance = $args->worker->new(
  queue_url => $args->queue_url,
  region    => $args->region,
  log => Log::Log4perl->get_logger('async'),
  processor => $args->_consumer,
);

if ($worker_instance->does('SQS::Worker')) {
  $worker_instance->run();
} else {
  die "You are trying to load a non-SQS::Worker compliant class: " . $args->worker;
}
