from django.db.models import Model, ForeignKey, CharField, DateTimeField, BooleanField
from django.conf import settings
from django.utils import timezone
from vm.models import Lease
from django.utils.translation import ugettext_lazy as _
from datetime import timedelta


class VmLease(Model):
    lease = ForeignKey(Lease, help_text=_("Preferred expiration periods."),
                       verbose_name=_("Lease"))
    os_server_id = CharField(blank=False, max_length=100, unique=True)
    time_of_suspend = DateTimeField(blank=True, default=None, null=True,
                                    verbose_name=_('time of suspend'),
                                    help_text=_("Proposed time of automatic "
                                                "suspension."))
    time_of_delete = DateTimeField(blank=True, default=None, null=True,
                                   verbose_name=_('time of delete'),
                                   help_text=_("Proposed time of automatic "
                                               "deletion."))
    suspend_done = BooleanField(blank=False, default=False)

    def get_renew_times(self, lease=None):
        """Returns new suspend and delete times if renew would be called.
        """
        if lease is None:
            lease = self.lease
        return (
            timezone.now() + lease.suspend_interval,
            timezone.now() + lease.delete_interval)

    def clean(self, *args, **kwargs):
        self.time_of_suspend, self.time_of_delete = self.get_renew_times()
        self.suspend_done = False
        super(VmLease, self).clean(*args, **kwargs)
        return self

    def is_suspend_expiring(self, threshold=0.1):
        limit = timezone.now() + timedelta(seconds=(
                threshold * self.lease.suspend_interval.total_seconds()))
        return limit > self.time_of_suspend

    def is_delete_expiring(self, threshold=0.1):
        limit = timezone.now() + timedelta(seconds=(
                threshold * self.lease.delete_interval.total_seconds()))
        return limit > self.time_of_delete

    @classmethod
    def get_or_create_lease(cls, server_id):
        try:
            return VmLease.objects.get(os_server_id=server_id)
        except VmLease.DoesNotExist:
            lease = VmLease(
                os_server_id=server_id,
                lease=Lease.objects.get(name=settings.DEFAULT_LEASE_NAME)
            )
            lease.clean()
            lease.save()
            return lease