#!/usr/bin/env perl

use common::sense;
use Getopt::Long ();
use Pod::Usage ();
use Log::Log4perl ();

use AnyEvent ();

use Lim ();
use Lim::RPC::Server ();
use Lim::RPC::Client::TLS ();
use Lim::Agent ();
use Lim::Plugins ();

my $help = 0;
my $host = '0.0.0.0';
my $port = 5353;
my $key;
my $log4perl;
my $html = '/usr/share/lim/html';
my $prefix;

Getopt::Long::GetOptions(
    'help|?' => \$help,
    'host:s' => \$host,
    'port:i' => \$port,
    'key=s' => \$key,
    'log4perl:s' => \$log4perl,
    'html:s' => \$html,
    'prefix:s' => \$prefix
) or Pod::Usage::pod2usage(2);
Pod::Usage::pod2usage(1) if $help;

unless (-d $html) {
    print STDERR 'Path to HTML directory invalid or non existing: ', $html, "\n";
    exit(1);
}

if (defined $log4perl and -f $log4perl) {
    Log::Log4perl->init($log4perl);
}
else {
    Log::Log4perl->init( \q(
    log4perl.logger                   = DEBUG, Screen
    log4perl.appender.Screen          = Log::Log4perl::Appender::Screen
    log4perl.appender.Screen.stderr   = 0
    log4perl.appender.Screen.layout   = Log::Log4perl::Layout::PatternLayout
    log4perl.appender.Screen.layout.ConversionPattern = %d %F [%L] %p: %m%n
    ) );
}

if (defined $prefix) {
    Lim::Config->{prefix} = [];
    
    foreach (split(/,/o, $prefix)) {
        s/\/+$//o;
        push(@{Lim::Config->{prefix}}, $_);
    }
}

my $cv = AnyEvent->condvar;
my @watchers;

push(@watchers,
# TODO Implement config files
#    AnyEvent->signal(signal => "HUP", cb => sub {
#        if (defined($server)) {
#            $server->reload;
#        }
#    }),
    AnyEvent->signal(signal => "INT", cb => sub {
        $cv->send;
    }),
    AnyEvent->signal(signal => "QUIT", cb => sub {
        $cv->send;
    }),
    AnyEvent->signal(signal => "TERM", cb => sub {
        $cv->send;
    }),
);

$html =~ s/\/*$//o;

Lim::RPC::Client::TLS->set_instance(Lim::RPC::Client::TLS->new(
    key => $key
));

my $server = Lim::RPC::Server->new(
    host => $host,
    port => $port,
    key => $key,
    html => $html
);
$server->serve(qw(Lim::Agent));
$server->serve(Lim::Plugins->instance->LoadedModules);

if (defined $server) {
    push(@watchers, $server);
    $cv->recv;
}

@watchers = ();

__END__

=head1 NAME

lim-agentd - Lim Agent Daemon

=head1 SYNOPSIS

lim-agentd [options]

=head1 OPTIONS

=over 8

=item B<--host <ip>>

Specify the host/IP to bind to (default 0.0.0.0).

=item B<--port <port>>

Specify the port to listen on (default 5353).

=item B<--key <key>>

Specify the SSL/TLS key to use for HTTPS.

=item B<--html <path>>

Specify the HTML directory (default /usr/share/lim/html).

=item B<--log4perl <file>>

Specify a Log::Log4perl configure file (default output to stdout).

=item B<--help>

Print a brief help message and exits.

=back

=head1 DESCRIPTION

B<This program> will read the given input file(s) and do something
useful with the contents thereof.

=cut

