#!/usr/bin/env python

import os

os.environ['DJANGO_SETTINGS_MODULE'] = 'mymontools.settings'

import django
django.setup()

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

import optparse
import sys

from django.db.models import Max
from django.http import QueryDict

from plugin.models import PluginMemory

from traps.models import Trap
from traps.tools import get_filtered_traps_for_querydict

from states.models import State
from states.tools import get_filtered_states_for_querydict

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

parser = optparse.OptionParser()

parser.add_option('', '--states', dest='check_states', action='store_true', default=False, help='Check for States instead of Traps')

parser.add_option('-H', '--hostname', dest='hostname', default=None, help='Filter hostname(s), separated by ","')
parser.add_option('-S', '--severity', dest='severity', default=None, help='Filter severity(s), separated by ","')
parser.add_option('-C', '--category', dest='category', default=None, help='Filter category(s), separated by ","')

parser.add_option('', '--exclude-hostname', dest='exclude_hostname', default=None, help='Exclude hostname(s), separated by ","')
parser.add_option('', '--exclude-severity', dest='exclude_severity', default=None, help='Exclude severity(s), separated by ","')
parser.add_option('', '--exclude-category', dest='exclude_category', default=None, help='Exclude category(s), separated by ","')

parser.add_option('', '--include-read', dest='exclude_read', action='store_false', default=True, help='Include read')

parser.add_option('', '--memory', dest='memory', default=None, help='Memory name to save ids for already seen traps')
parser.add_option('', '--simulate-maxid', dest='simmaxid', type=long, default=0, help='Simulate remembered maxid')

parser.add_option('-v', '--verbose', dest='verb', action='count', default=0, help='Be verbose')

(opts, args) = parser.parse_args()
if opts.verb >=3:
	print opts

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

retstring = ['OK', 'WARNING', 'CRITICAL']

query = QueryDict('', mutable=True)

if opts.hostname:
	[ query.update( {u'hostname': hostname} ) for hostname in opts.hostname.split(',') ]
if opts.severity:
	[ query.update( {u'severity': severity} ) for severity in opts.severity.split(',') ]
if opts.category:
	[ query.update( {u'category': category} ) for category in opts.category.split(',') ]

if opts.exclude_hostname:
	[ query.update( {u'exclude_hostname': hostname} ) for hostname in opts.exclude_hostname.split(',') ]
if opts.exclude_severity:
	[ query.update( {u'exclude_severity': severity} ) for severity in opts.exclude_severity.split(',') ]
if opts.exclude_category:
	[ query.update( {u'exclude_category': category} ) for category in opts.exclude_category.split(',') ]

if opts.verb >=3:
	from pprint import pprint
	pprint(query)

if opts.check_states:
	objs = get_filtered_states_for_querydict(query)
	objname = 'state'
	if opts.exclude_read:
		objs = objs.filter(read=False)
else:
	objs = get_filtered_traps_for_querydict(query)
	objname = 'trap'
	if opts.exclude_read:
		objs = objs.filter(trapread=False)

if opts.memory:
	try:
		mem = PluginMemory.objects.get(tag=opts.memory)
		if opts.verb >=2:
			print 'Found in DB'
	except PluginMemory.DoesNotExist:
		mem = PluginMemory(tag=opts.memory)
		if opts.verb >=2:
			print 'Not found in DB'

	maxid = mem.maxid

elif opts.simmaxid:
	maxid = opts.simmaxid

else:
	maxid = 0

if opts.verb >=2:
	print 'Maxid is %s' % maxid

if maxid:
	objs = objs.filter(id__gt=maxid)

if opts.verb >=3:
	for obj in objs:
		print obj

maxid = max( objs.aggregate(Max('id')).values()[0], maxid )

if opts.verb >=2:
	print 'Max ID: %s' % maxid

if opts.memory:
	mem.maxid = maxid
	mem.save()

warn_cnt = objs.filter(severity='WARNING').count()
crit_cnt = objs.filter(severity='CRITICAL').count()
if opts.verb >=2:
	print 'Warning %ss: %s' % (objname, warn_cnt)
	print 'Critical %ss: %s' % (objname, crit_cnt)

out = []
retcode = 0

if crit_cnt:
	retcode = max(2, retcode)
	out.append('%s critical %ss' % (crit_cnt, objname) )
if warn_cnt:
	retcode = max(1, retcode)
	out.append('%s warning %ss' % (warn_cnt, objname) )

print 'MyMonTools/%ss %s: %s%s' % (objname, retstring[retcode], ' and '.join(out), out and ' found in DB' or 'no warning or critical %s found' % objname)
sys.exit(retcode)