import os
import sys
import base64
import traceback
from django.db.models import F, Q
from xos.config import Config
from observer.syncstep import SyncStep
from core.models import Service
from requestrouter.models import RequestRouterService
from util.logger import Logger, logging

parentdir = os.path.join(os.path.dirname(__file__),"..")
sys.path.insert(0,parentdir)

from rrlib import RequestRouterLibrary

logger = Logger(level=logging.INFO)

class SyncRequestRouterService(SyncStep, RequestRouterLibrary):
    provides=[RequestRouterService]
    requested_interval=0

    def __init__(self, **args):
        SyncStep.__init__(self, **args)
        RequestRouterLibrary.__init__(self)

    def fetch_pending(self):
	try:
        	ret = RequestRouterService.objects.filter(Q(enacted__lt=F('updated')) | Q(enacted=None))
        	return ret
	except Exception, e:
        	traceback.print_exc()
            	return None	

    def sync_record(self, rr_service):
	try:
        	print "syncing service!"
        	logger.info("sync'ing rr_service %s" % str(rr_service))
        	self.gen_slice_file(rr_service)
        	rr_service.save()
		return True
	except Exception, e:
                traceback.print_exc()
                return False


