# models.py -  ExampleService Models

from core.models import Service, TenantWithContainer
from django.db import models, transaction

PASSIVETEST_KIND = 'PassiveTest'
PASSIVETEST_SERVICE_NAME = 'passivetest'
PASSIVETEST_SERVICE_NAME_VERBOSE = 'PASSIVETEST Service'
PASSIVETEST_SERVICE_NAME_VERBOSE_PLURAL = 'PASSIVETEST Services'
PASSIVETEST_TENANT_NAME_VERBOSE = 'PASSIVETEST Tenant'
PASSIVETEST_TENANT_NAME_VERBOSE_PLURAL = 'PASSIVETEST Tenants'

class PassiveTestService(Service):

    KIND = PASSIVETEST_KIND

    class Meta:
        app_label = PASSIVETEST_SERVICE_NAME
        verbose_name = PASSIVETEST_SERVICE_NAME_VERBOSE

    tap_ports = models.CharField(max_length=254, help_text="Neutron Port ids of the ports we want to tap (comma delimited)")
    reset_viv = models.BooleanField(default=False, help_text="Reset the VIV's input and output configurations!")
    

class PassiveTestTenant(TenantWithContainer):

    KIND = PASSIVETEST_KIND

    class Meta:
        verbose_name = PASSIVETEST_TENANT_NAME_VERBOSE

    def __init__(self, *args, **kwargs):
        passivetestservice = PassiveTestService.get_service_objects().all()
        if passivetestservice:
            self._meta.get_field('provider_service').default = passivetestservice[0].id
        super(PassiveTestTenant, self).__init__(*args, **kwargs)

    def save(self, *args, **kwargs):
        super(PassiveTestTenant, self).save(*args, **kwargs)
        model_policy_passivetesttenant(self.pk)

    def delete(self, *args, **kwargs):
        self.cleanup_container()
        super(PassiveTestTenant, self).delete(*args, **kwargs)

    @property
    def public_ip(self):
        for port in self.instance.ports.all():
            if "public" in port.network.name.lower():
                return port.ip
        return None

    @property
    def synchronizer_ip(self):
        for port in self.instance.ports.all():
            if "management" in port.network.name.lower():
                return port.ip
        return None

def model_policy_passivetesttenant(pk):
    with transaction.atomic():
        tenant = PassiveTestTenant.objects.select_for_update().filter(pk=pk)
        if not tenant:
            return
        tenant = tenant[0]
        tenant.manage_container()

