# -*- coding: utf-8 -*-
# vi:si:et:sw=4:sts=4:ts=4
from __future__ import division, with_statement

from django.db import models
from django.contrib.auth.models import User

from ox.django.fields import DictField

from item.models import Item

import managers


class List(models.Model):

    class Meta:
        unique_together = ("user", "name")

    created = models.DateTimeField(auto_now_add=True)
    modified = models.DateTimeField(auto_now=True)
    user = models.ForeignKey(User)
    name = models.CharField(max_length=255)
    public = models.BooleanField(default=False)
    featured = models.BooleanField(default=False)
    query = DictField(default={})

    items = models.ManyToManyField('item.Item', related_name='lists',
                                                through='ListItem')

    objects = managers.ListManager()

    def save(self, *args, **kwargs):
        if self.query:
            self.smart = True
        else:
            self.smart = False
        super(List, self).save(*args, **kwargs)

    def get_number_of_items(self, user=None):
        if not self.query:
            return self.items.count()
        else:
            return Item.objects.find({'query': self.query}, user).count()

    def add(self, item):
        q = self.items.filter(id=item.id)
        if q.count() == 0:
            l = ListItem()
            l.list = self
            l.item = item
            l.save()

    def remove(self, item):
        self.ListItem.objects.all().filter(item=item, list=self).delete()

    def __unicode__(self):
        return u'%s (%s)' % (self.name, self.user)

    def editable(self, user):
        #FIXME: make permissions work
        if self.user == user or user.has_perm('Ox.admin'):
            return True
        return False

    def json(self, user=None):
        return {
            'user': self.user.username,
            'name': self.name,
            'public': self.public,
            'featured': self.featured,
            'query': self.query,
            'items': self.get_number_of_items(user)
        }

class ListItem(models.Model):
    created = models.DateTimeField(auto_now_add=True)
    modified = models.DateTimeField(auto_now=True)
    list = models.ForeignKey(List)
    item = models.ForeignKey('item.Item')

    def __unicode__(self):
        return u'%s in %s' % (self.item, self.list)