from awxkit.api.mixins import HasStatus
from awxkit.api.resources import resources
from awxkit.utils import poll_until, seconds_since_date_string
from . import base
from . import page


class Notification(HasStatus, base.Base):

    def __str__(self):
        items = ['id', 'notification_type', 'status', 'error', 'notifications_sent',
                 'subject', 'recipients']
        info = []
        for item in [x for x in items if hasattr(self, x)]:
            info.append('{0}:{1}'.format(item, getattr(self, item)))
        output = '<{0.__class__.__name__} {1}>'.format(self, ', '.join(info))
        return output.replace('%', '%%')

    @property
    def is_successful(self):
        """Return whether the notification was created successfully. This means that:
        * self.status == 'successful'
        * self.error == False
        """
        return super(Notification, self).is_successful and not self.error

    def wait_until_status(self, status, interval=5, timeout=30, **kwargs):
        adjusted_timeout = timeout - seconds_since_date_string(self.created)
        return super(Notification, self).wait_until_status(status, interval, adjusted_timeout, **kwargs)

    def wait_until_completed(self, interval=5, timeout=240):
        """Notifications need a longer timeout, since the backend often has
        to wait for the request (sending the notification) to timeout itself
        """
        adjusted_timeout = timeout - seconds_since_date_string(self.created)
        return super(Notification, self).wait_until_completed(interval, adjusted_timeout)


page.register_page(resources.notification, Notification)


class Notifications(page.PageList, Notification):

    def wait_until_count(self, count, interval=10, timeout=60, **kw):
        """Poll notifications page until it is populated with `count` number of notifications."""
        poll_until(lambda: getattr(self.get(), 'count') == count,
                   interval=interval, timeout=timeout, **kw)
        return self


page.register_page([resources.notifications,
                    resources.related_notifications], Notifications)
