"""Cataloging and searching components for students.
"""
import grok
from grok import index
from hurry.query import Eq, Text
from hurry.query.query import Query
from zope.index.text.parsetree import ParseError
from waeup.sirp.interfaces import IUniversity, IQueryResultItem
from waeup.sirp.students.interfaces import IStudent

class StudentIndexes(grok.Indexes):
    """A catalog for students.
    """
    grok.site(IUniversity)
    grok.name('students_catalog')
    grok.context(IStudent)

    student_id = index.Field(attribute='student_id')
    name = index.Text(attribute='name')
    reg_number = index.Field(attribute='reg_number')
    state = index.Field(attribute='state')

class StudentQueryResultItem(object):
    grok.implements(IQueryResultItem)

    title = u'Student Query Item'
    description = u'Some students found in a search'

    def __init__(self, context, view):
        self.context = context
        self.url = view.url(context)
        self.student_id = context.student_id
        self.name = context.name
        self.reg_number = context.reg_number
        self.state = context.state

def search(query=None, searchtype=None, view=None):
    hitlist = []
    #if not query:
    #    view.flash('Empty search string.')
    #    return
    if searchtype in ('name',):
        results = Query().searchResults(
            Text(('students_catalog', searchtype), query))
    else:
        # Temporary solution to display all students added
        if query == '*':
            from zope.component import queryUtility
            from zope.catalog.interfaces import ICatalog
            cat = queryUtility(ICatalog, name='students_catalog')
            results = cat.searchResults(student_id=(None, None))
        else:
            results = Query().searchResults(
                Eq(('students_catalog', searchtype), query))
    for result in results:
        hitlist.append(StudentQueryResultItem(result, view=view))
    return hitlist
