""" SummaryItem.py

"""
__copyright__ = "Copyright (c) 2002-2005 Free Software Foundation, Inc."
__license__ = """
Straw is free software; you can redistribute it and/or modify it under the
terms of the GNU General Public License as published by the Free Software
Foundation; either version 2 of the License, or (at your option) any later
version.

Straw is distributed in the hope that it will be useful, but WITHOUT ANY
WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
A PARTICULAR PURPOSE. See the GNU General Public License for more details.

You should have received a copy of the GNU General Public License along with
this program; if not, write to the Free Software Foundation, Inc., 59 Temple
Place - Suite 330, Boston, MA 02111-1307, USA. """

import time
import locale
import Event
import ImageCache


class SummaryItem(object, Event.SignalEmitter):
    __slots__ = ('title', 'link', 'description', 'guid', 'pub_date', 'source',
                 '_images', '_seen', '_id', 'feed', '_slots',
                 'fm_license', 'fm_changes', 'creator', 'license_urls',
                 '_searchable_fields', '_sticky', 'publication_name',
                 'publication_volume', 'publication_number',
                 'publication_section', 'publication_starting_page',
                 'guidislink', 'contributors', 'enclosures')

    _searchable_fields = ('title', 'description', 'fm_license', 'fm_changes',
                          'creator', 'contributors')

    def __init__(self):
        Event.SignalEmitter.__init__(self)
        self.initialize_slots(Event.ItemReadSignal, Event.ItemStickySignal)
        self.title = None
        self.link = None
        self.description = None
        self.guid = None
        self.guidislink = True
        self.pub_date = time.localtime()
        self.source = None
        self._images = {}
        self._seen = 0
        self._id = None
        self.feed = None
        self.fm_license = None
        self.fm_changes = None
        self.creator = None
        self.contributors = list()
        self.license_urls = list()
        self.publication_name = None
        self.publication_volume = None
        self.publication_number = None
        self.publication_section = None
        self.publication_starting_page = None
        self._sticky = 0
        self.enclosures = None

    def __eq__(self, item):
        r = item.title == self.title and item.description == self.description
        if r:
            return True
        elif item.guid and self.guid and item.guid == self.guid:
            return True
        return False

    @apply
    def seen():
        doc = ""
        def fget(self):
            return self._seen
        def fset(self, seen = True):
            if self._seen != seen:
                self._seen = seen
                self.emit_signal(Event.ItemReadSignal(self))
        return property(**locals())

    @apply
    def sticky():
        doc = ""
        def fget(self):
            return self._sticky
        def fset(self, sticky):
            if self._sticky != sticky:
                self._sticky = sticky
                self.emit_signal(Event.ItemStickySignal(self))
        return property(**locals())

    @apply
    def id():
        doc = "Item ID (internal)"
        def fget(self):
            return self._id
        def fset(self, iid):
            self._id = iid
        return property(**locals())

    def _add_image(self, image_name, restore):
        ImageCache.cache.add_refer(image_name, restore, self)
        self._images[image_name] = ImageCache.cache[image_name]

    def add_image(self, image_name):
        self._add_image(image_name, restore = False)

    def restore_image(self, image_name):
        self._add_image(image_name, restore = True)

    def set_image(self, image_name, image):
        self._images[image_name] = image

    def get_image(self, image_name):
        return self._images.get(image_name, None)

    def clear_images(self):
        self._images = {}

    def image_keys(self):
        return self._images.keys()

    def set_seen_quiet(self, seen = 1):
        old = self._seen
        self._seen = seen
        return seen != old

    def match(self, text):
        def try_field(field):
            return type(field) in (
                type(''), type(u'')) and field.lower().find(text.lower()) > -1
        for f in self._searchable_fields:
            try:
                if try_field(self.__getattribute__(f)):
                    return 1
            except AttributeError:
                pass
        return 0

    def clean_up(self):
        for image in self._images:
            ImageCache.cache.remove_refer(image)
