import os
import sys
from django.db.models import Q, F
from synchronizers.new_base.SyncInstanceUsingAnsible import SyncInstanceUsingAnsible
from synchronizers.new_base.modelaccessor import *

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

class SyncVPGWUTenant(SyncInstanceUsingAnsible):

    provides = [VPGWUTenant]

    observes = VPGWUTenant

    requested_interval = 0

    template_name = "vpgwutenant_playbook.yaml"

    service_key_name = "/opt/xos/configurations/mcord/mcord_private_key"

    def __init__(self, *args, **kwargs):
        super(SyncVPGWUTenant, self).__init__(*args, **kwargs)

    def fetch_pending(self, deleted):

        if (not deleted):
            objs = VPGWUTenant.get_tenant_objects().filter(
                Q(enacted__lt=F('updated')) | Q(enacted=None), Q(lazy_blocked=False))
        else:

            objs = VPGWUTenant.get_deleted_tenant_objects()

        return objs

    def get_extra_attributes(self, o):
        fields = {}
        fields['display_message'] = o.display_message
        fields['s5s8_pgw_tag'] = o.s5s8_pgw_tag
        fields['image_name'] = o.image_name
        return fields

    def delete_record(self, port):
        pass
