from django.db.models.signals import post_save
from django.dispatch import receiver
import pdb
from dependency_walker import *
import model_policies
from util.logger import logger
from datetime import datetime
import time
from core.models import *
from django.db.transaction import atomic
from django.db.models import F, Q

modelPolicyEnabled = True

def EnableModelPolicy(x):
    global modelPolicyEnabled
    modelPolicyEnabled = x

def update_dep(d, o):
	try:
		if (d.updated < o.updated):
			d.save(update_fields=['updated'])
	except AttributeError,e:
		raise e
	
def delete_if_inactive(d, o):
	#print "Deleting %s (%s)"%(d,d.__class__.__name__)
	# d.delete()	
	return

@atomic
def execute_model_policy(instance, deleted):
	# Automatic dirtying
	walk_inv_deps(update_dep, instance)

	sender_name = instance.__class__.__name__
	policy_name = 'model_policy_%s'%sender_name
	noargs = False

	if deleted:
		walk_inv_deps(delete_if_inactive, instance)
	else:
		try:
			policy_handler = getattr(model_policies, policy_name, None)
			logger.error("POLICY HANDLER: %s %s" % (policy_name, policy_handler))                       
			if policy_handler is not None:
				policy_handler.handle(instance)
		except:
			logger.log_exc("Model Policy Error:") 
			print "Policy Exceution Error"

	instance.policed=datetime.now()
        instance.save(update_fields=['policed'])

def run_policy():
        from core.models import Slice,Controller,Network,User,SlicePrivilege,Site,SitePrivilege,Image,ControllerSlice
	while (True):
		start = time.time()
		models = [Slice, Controller, Network, User, SlicePrivilege, Site, SitePrivilege, Image, ControllerSlice]
		objects = []
		
		for m in models:
        		res = m.objects.filter(Q(policed__lt=F('updated')) | Q(policed=None))
			objects.extend(res)	

		for o in objects:
			print "Working on %r"%o
			execute_model_policy(o, False)
		
		
		if (time.time()-start<1):
			time.sleep(1)	
