# -*- coding: utf-8 -*-
#

from django.db import models
from django.utils.translation import ugettext_lazy as _
from django.core.cache import cache

from orgs.mixins import OrgManager

from .base import AssetUser
from ..const import ASSET_USER_CONN_CACHE_KEY

__all__ = ['AuthBook']


class AuthBookQuerySet(models.QuerySet):

    def latest_version(self):
        return self.filter(is_latest=True)


class AuthBookManager(OrgManager):
    pass


class AuthBook(AssetUser):
    asset = models.ForeignKey('assets.Asset', on_delete=models.CASCADE, verbose_name=_('Asset'))
    is_latest = models.BooleanField(default=False, verbose_name=_('Latest version'))
    version = models.IntegerField(default=1, verbose_name=_('Version'))

    objects = AuthBookManager.from_queryset(AuthBookQuerySet)()

    class Meta:
        verbose_name = _('AuthBook')

    def _set_latest(self):
        self._remove_pre_obj_latest()
        self.is_latest = True
        self.save()

    def _get_pre_obj(self):
        pre_obj = self.__class__.objects.filter(
            username=self.username, asset=self.asset).latest_version().first()
        return pre_obj

    def _remove_pre_obj_latest(self):
        pre_obj = self._get_pre_obj()
        if pre_obj:
            pre_obj.is_latest = False
            pre_obj.save()

    def _set_version(self):
        pre_obj = self._get_pre_obj()
        if pre_obj:
            self.version = pre_obj.version + 1
        else:
            self.version = 1
        self.save()

    def set_version_and_latest(self):
        self._set_version()
        self._set_latest()

    @property
    def _conn_cache_key(self):
        return ASSET_USER_CONN_CACHE_KEY.format(self.id, self.asset.id)

    @property
    def connectivity(self):
        value = cache.get(self._conn_cache_key, self.UNKNOWN)
        return value

    @connectivity.setter
    def connectivity(self, value):
        _connectivity = self.UNKNOWN

        for host in value.get('dark', {}).keys():
            if host == self.asset.hostname:
                _connectivity = self.UNREACHABLE

        for host in value.get('contacted', {}).keys():
            if host == self.asset.hostname:
                _connectivity = self.REACHABLE

        cache.set(self._conn_cache_key, _connectivity, 3600)

    @property
    def keyword(self):
        return {'username': self.username, 'asset': self.asset}

    def __str__(self):
        return '{}@{}'.format(self.username, self.asset)

