#!/usr/bin/perl

use strict;

use Getopt::Long;
use NOCpulse::TimeSeriesQueue;
use NOCpulse::StateChangeQueue;
use NOCpulse::NotificationQueue;
use NOCpulse::CommandOutputQueue;
use NOCpulse::Config;
use NOCpulse::Debug;
use NOCpulse::Gritch;
use BerkeleyDB;

# these belong in SMONQueue.pm

################################
# main
################################

my $cfg = new NOCpulse::Config;
my $debug = new NOCpulse::Debug();
my $gritcher = new NOCpulse::Gritch($cfg->get('queues', 'gritchdb'));

my $debuglevel = 0;
my $summary;
my $queuename;
&GetOptions('debug=i'     => \$debuglevel,
	    'queuename=s' => \$queuename,
	    'summary'     => \$summary);

my $usage = "usage: $0 { --summary | --queuename=<queuename> } [ --debug=<dbg> ]\n";

if( $debuglevel < 1 )
{
    $debuglevel = 1;
}

my $debugstream = $debug->addstream(LEVEL => $debuglevel);

if( $summary )
{
    my $tsdb = NOCpulse::TimeSeriesQueue->new( Debug => $debug, Config => $cfg, Gritcher => $gritcher );
    my $scdb = NOCpulse::StateChangeQueue->new( Debug => $debug, Config => $cfg, Gritcher => $gritcher );
    my $notif = NOCpulse::NotificationQueue->new( Debug => $debug, Config => $cfg, Gritcher => $gritcher );
    my $command = NOCpulse::CommandOutputQueue->new( Debug => $debug, Config => $cfg, Gritcher => $gritcher );

    # bt_ndata  bt_levels    bt_free    bt_int_pg    bt_leaf_pg
    # bt_minkey  bt_flags  bt_version  bt_pagesize  bt_magic  bt_maxkey  bt_metaflags
    # bt_re_len  bt_re_pad  bt_dup_pg bt_dup_pgfree  bt_over_pg  bt_over_pgfree
    # bt_nkeys bt_int_pgfree bt_leaf_pgfree
    
    my @queues = ( $tsdb, $scdb, $notif, $command );
    my $queue;
    my $info;
    my $size;
    my $dqlimit;

format STDOUT_TOP =

Queue System Summary

            Data         Free Intrnl  Leaf    File Size  Dequeue
Queue      Items  Lvls  Pages  Pages Pages      (Bytes)    Limit

.
format STDOUT =
@<<<<<<  @>>>>>>  @>>>  @>>>>  @>>>> @>>>> @>>>>>>>>>>> @>>>>>>>
$queue->id, $info->{'bt_ndata'}, $info->{'bt_levels'}, $info->{'bt_free'}, $info->{'bt_int_pg'}, $info->{'bt_leaf_pg'}, $size, $dqlimit
.

    foreach $queue (@queues)
    {
        $size = (stat $queue->filename())[7];
	$info = $queue->btree_info();
	$dqlimit = $queue->dqlimit();
        write;
    }

print "\n";
}
else
{
    my $queue;
    if( $queuename eq "ts_db" ) {
	$queue = NOCpulse::TimeSeriesQueue->new( Debug => $debug, Config => $cfg, Gritcher => $gritcher );
    }
    elsif( $queuename eq "sc_db" ) {
	$queue = NOCpulse::StateChangeQueue->new( Debug => $debug, Config => $cfg, Gritcher => $gritcher );
    }
    elsif( $queuename eq "notif" ) {
	$queue = NOCpulse::NotificationQueue->new( Debug => $debug, Config => $cfg, Gritcher => $gritcher );
    }
    elsif( $queuename eq "command" ) {
	$queue = NOCpulse::CommandOutputQueue->new( Debug => $debug, Config => $cfg, Gritcher => $gritcher );
    }
    else {
	print STDERR "unknown queue: '$queuename'\n";
	print STDERR $usage;
	print STDERR "\n";
	exit;
    }
    $queue->show();
}
