#!/usr/bin/perl

use strict;
use warnings;
$| = 1;

use File::Basename;
use Log::Log4perl ();
use Proc::Daemon;
use Proc::PID::File;

use lib qw(libs);
use API::Config;

use lib $API::Config::Config->{'Website_libs'};
use ECS::Config;
use ECS::Endeca::Updates::QueueManager;
use ECS::Messaging::Queue::AmazonSQS;
use ECS::Messaging::Queue::AmazonSQS;

my $SERVICE_NAME = "endecaPartialUpdate";

main();
exit 0;

###############################################################################

sub main {

    my $doDaemon = ($ARGV[0]||'') eq "-d";
    my $processName = fileparse(__FILE__);
    my $logger;

    if ( $doDaemon ) {
        initDaemonProc();
        checkAlreadyRunning( $processName );
        $logger = initLogger();
    }

    initDaemon( $logger );

    return;
}

###############################################################################

sub checkAlreadyRunning {
    my ( $processName ) = @_;

    my $isRunning = Proc::PID::File->running(
        'name' => $processName,
        'dir' => "/var/run/",
    );

    if ($isRunning) {
        die "failed to start: $processName already running";
    }

    return;
}

###############################################################################

sub initDaemonProc {

    my $childPID = Proc::Daemon::Init; # fork

    # Parent dies and child does the work
    exit if $childPID;

    return;
}

###############################################################################

sub initLogger {
    Log::Log4perl::init( \$ECS::Config::c{'ECS.logConf'} );
    return Log::Log4perl::get_logger( $SERVICE_NAME );
}

###############################################################################

sub initDaemon {
    my ( $logger ) = @_;

    my $config = \%ECS::Config::c;

    my $messageQueue = ECS::Messaging::Queue::AmazonSQS->new({
        'accessKey' => $config->{'sqsAccessKey'},
        'secretKey' => $config->{'sqsSecretKey'},
        'queueUri'  => $config->{'sqsPartialUpdateQueue'}->{'uri'},
        'queueType' => $config->{'sqsPartialUpdateQueue'}->{'type'},
        'batchSize' => $config->{'partialUpdateBatchSize'},
    });

    my $signalQueue = ECS::Messaging::Queue::AmazonSQS->new({
        'accessKey' => $config->{'sqsAccessKey'},
        'secretKey' => $config->{'sqsSecretKey'},
        'queueUri'  => $config->{'sqsPartialUpdateSignalQueue'}->{'uri'},
        'queueType' => $config->{'sqsPartialUpdateSignalQueue'}->{'type'},
    });

    my $queueManager = ECS::Endeca::Updates::QueueManager->new({
        'messageQueue'    => $messageQueue,
        'signalQueue'     => $signalQueue,
        'timeout'         => $config->{'partialUpdateDaemonTimeout'},
        ($logger ? (
            'logger' => $logger,
        ) : ()),
    });

    $queueManager->daemon(); # infinite blocking

    return;
}

###############################################################################
