"""Karma logging models."""

from __future__ import unicode_literals

import logging
import pytz

from irc.client import NickMask

from django.conf import settings
from django.db import models


log = logging.getLogger('karma.models')


class KarmaKeyManager(models.Manager):

    """Manage handy queries for KarmaKey."""

    def ranked_scored_order(self):
        keys = self.annotate(karma_score=models.Sum('karmalogentry__delta')).order_by('-karma_score')
        return keys

    def ranked_scored_reverse_order(self):
        keys = self.annotate(karma_score=models.Sum('karmalogentry__delta')).order_by('karma_score')
        return keys


class KarmaKey(models.Model):

    """Track a thing being karmaed."""

    key = models.CharField(max_length=200, unique=True)

    objects = KarmaKeyManager()

    def __unicode__(self):
        """String representation."""

        return "{0:s} ({1:d})".format(self.key, self.score())

    def score(self):
        """Determine the score for this karma entry."""

        return KarmaLogEntry.objects.filter(key=self).aggregate(models.Sum('delta'))['delta__sum']

    def rank(self):
        """Determine the rank of this karma entry relative to the others."""

        sorted_keys = KarmaKey.objects.ranked_scored_order()
        for rank, key in enumerate(sorted_keys):
            if key == self:
                return rank+1
        return None


class KarmaLogEntryManager(models.Manager):

    """Manage handy queries for KarmaLogEntry."""

    def optimists(self):
        karmaers = self.values('nickmask').annotate(karma_outlook=models.Sum('delta')).order_by('-karma_outlook')
        return karmaers

    def pessimists(self):
        karmaers = self.values('nickmask').annotate(karma_outlook=models.Sum('delta')).order_by('karma_outlook')
        return karmaers

    def most_opinionated(self):
        karmaers = self.values('nickmask').annotate(karma_count=models.Count('delta')).order_by('-karma_count')
        return karmaers


class KarmaLogEntry(models.Model):

    """Track each karma increment/decrement."""

    key = models.ForeignKey('KarmaKey')
    delta = models.SmallIntegerField()
    nickmask = models.CharField(max_length=200, default='', blank=True)
    created = models.DateTimeField(auto_now_add=True)

    objects = KarmaLogEntryManager()

    class Meta:
        verbose_name_plural = 'karma log entries'

    def __unicode__(self):
        """String representation."""

        tz = pytz.timezone(settings.TIME_ZONE)
        return "{0:s}{1:s} @ {2:s} by {3:s}".format(self.key.key, '++' if self.delta > 0 else '--',
                                                    self.created.astimezone(tz).strftime('%Y-%m-%d %H:%M:%S %Z'),
                                                    NickMask(self.nickmask).nick)