# -*- coding: utf-8 -*-
'''
Created on Jul 23, 2012

@author: ymh
'''

from haystack import indexes

from ldt.ldt_utils.models import Segment, Content
from ldt.text.models import Annotation


class SegmentIndex(indexes.SearchIndex, indexes.Indexable):
    text = indexes.CharField(document=True, use_template=True)
    iri_id = indexes.CharField(model_attr='iri_id', indexed=False, stored=True)
    project_id = indexes.CharField(model_attr='project_id', indexed=False, stored=True, null=True)
    ensemble_id = indexes.CharField(model_attr='ensemble_id', indexed=False, stored=True)
    cutting_id = indexes.CharField(model_attr='cutting_id', indexed=False, stored=True)
    element_id = indexes.CharField(model_attr='element_id', indexed=False, stored=True)
    tags = indexes.CharField(model_attr='get_tags', stored=True)
    title = indexes.CharField(model_attr='title', stored=True)
    abstract = indexes.CharField(model_attr='abstract', stored=True)
    duration = indexes.IntegerField(model_attr='duration', indexed=False, stored=True)
    author = indexes.CharField(model_attr='author', stored=True, null=True)
    start_ts = indexes.IntegerField(model_attr='start_ts', indexed=False, stored=True)
    date = indexes.CharField(model_attr='date', stored=True)

    def get_model(self):
        return Segment

    def prepare_tags(self, obj):
        if hasattr(obj, 'tag_list'):
            if obj.tag_list is not None:
                obj.tags = None # To avoid a second and useless db request
                return ",".join(obj.tag_list)
        return ",".join([tag.name for tag in obj.tags.all()])

    def index_queryset(self, using=None):
        "Used when the entire index for model is updated."
        return self.get_model().objects.prefetch_related("tags")

class ContentIndex(indexes.SearchIndex, indexes.Indexable):
    text = indexes.CharField(document=True, use_template=True)
    iri_id = indexes.CharField(model_attr='iri_id', indexed=False, stored=True)
    tags = indexes.CharField(model_attr='get_tags', stored=True)
    title = indexes.CharField(model_attr='title', stored=True)
    description = indexes.CharField(model_attr='description', stored=True)
    creation_date = indexes.DateTimeField(model_attr='creation_date', stored=True)
    update_date = indexes.DateTimeField(model_attr='update_date', stored=True)
    authors = indexes.CharField(model_attr="get_authors", stored=True)
    duration = indexes.IntegerField(model_attr="duration", stored=True)
    content_creation_date = indexes.DateTimeField(model_attr="content_creation_date", stored=True)


    def get_model(self):
        return Content

    def prepare_tags(self, obj):
        if hasattr(obj, 'tag_list'):
            if obj.tag_list is not None:
                obj.tags = None # To avoid a second and useless db request
                return ",".join(obj.tag_list)
        return ",".join([tag.name for tag in obj.tags.all()])

    def index_queryset(self, using=None):
        "Used when the entire index for model is updated."
        return self.get_model().objects.prefetch_related("tags")



class AnnotationIndex(indexes.SearchIndex, indexes.Indexable):
    text = indexes.CharField(document=True, use_template=True)
    tags = indexes.CharField(model_attr='tags', indexed=True, stored=False)
    title = indexes.CharField(model_attr='title', indexed=True, stored=True)
    abstract = indexes.CharField(model_attr='description', indexed=True, stored=False)
    text_field = indexes.CharField(model_attr='text', indexed=True, stored=False)
    annotation_id = indexes.CharField(model_attr='external_id', indexed=False, stored=True)

    def get_model(self):
        return Annotation

    def prepare_tags(self, obj):
        return ",".join([tag.name for tag in obj.tags.all()])

    def index_queryset(self, using=None):
        "Used when the entire index for model is updated."
        return self.get_model().objects.prefetch_related("tags")


class ContentIndex(indexes.SearchIndex, indexes.Indexable):
    text = indexes.CharField(document=True, use_template=True)
    tags = indexes.CharField(model_attr='get_tags', indexed=True, stored=False, null=True)
    title = indexes.CharField(model_attr='title', indexed=True, stored=True)
    abstract = indexes.CharField(model_attr='description', indexed=True, stored=False, null=True)

    def get_model(self):
        return Content

    def prepare_tags(self, obj):
        return ",".join([tag.name for tag in obj.tags.all()])

    def index_queryset(self, using=None):
        "Used when the entire index for model is updated."
        return self.get_model().objects.prefetch_related("tags")
