import lucene
from enmi.ldt import STORE
from enmi.ldt import ANALYZER
import enmi.settings
import uuid
import django.core.urlresolvers
from django.core.cache import cache
import enmi.settings
from Ft.Xml import MarkupWriter
import xml.dom
import xml.dom.minidom
import xml.dom.ext
import xml.xpath
import os
import os.path
import base64
import enmi.utils.log



class LdtSearch(object):

    contribution_search_enum = {"all":"all", "project":"project", "content":"content"}

    def query(self, field, type, query, queryKey=None):


        # create query key
        if queryKey is None:
            queryKey = base64.urlsafe_b64encode((u":".join([unicode(field), unicode(type), query])).encode("utf-8"))

		

        #get result from cache
        res = cache.get(queryKey)
		
        if res is not None:
            return res
		
        indexSearcher = lucene.IndexSearcher(STORE)
        #queryParser = lucene.MultiFieldQueryParser(["tags","title","abstract"], ANALYZER)
        queryParser = lucene.QueryParser(field, lucene.FrenchAnalyzer())
        queryParser.setDefaultOperator(lucene.QueryParser.Operator.AND)
        queryObj = queryParser.parse(query)
        hits = indexSearcher.search(queryObj)
        
        res = []
        for hit in hits:
            doc = lucene.Hit.cast_(hit).getDocument()
            ldt_id = doc.get("ldt_id")
            if type == "all" or ((type == "project") ^ (ldt_id is None or len(ldt_id) == 0)):
                res.append({"ldt_id":ldt_id,"iri_id":doc.get("iri_id"),"ensemble_id":doc.get("ensemble_id"),"decoupage_id":doc.get("decoupage_id"), "element_id":doc.get("element_id")})
        cache.set(queryKey, res, enmi.settings.CACHE_TIMEOUT)
		
        return res

	
	def queryAll(self, type, query):		
		return self.query("all", type, query)
	
class LdtUtils(object):
 
    def generateLdt(self, contentList, file, title = u"", author=u"IRI Web", web_url=u"", media_url="", resultList=None, startSegment=None, contributions=None):

        writer = MarkupWriter(file, indent = u"yes")
        writer.startDocument()
        writer.startElement(u"iri")
        writer.simpleElement(u"project", attributes={u"id":unicode(str(uuid.uuid1())), u"title":unicode(title) , u"user":author, u"abstract":u""})
        writer.startElement(u"medias")
        for content in contentList:
            writer.simpleElement(u"media", attributes={u"id":content.content_base.iri_id,u"src":content.iri_url(web_url),u"video":unicode(media_url)+unicode(enmi.settings.STREAM_URL),u"pict":u"",u"extra":u""})
        writer.endElement(u"medias")

        if contributions is None:
            contributions = []
        annotations_nodes = {}
        for contrib in contributions:
            doc = xml.dom.minidom.parseString(contrib.ldtproject.ldt.encode("utf-8"))
            con = xml.xpath.Context.Context(doc, 1, 1, None)
            res = xml.xpath.Evaluate("/iri/annotations/content", context=con)
            for content in res:
                contentid = content.getAttribute("id")
                if annotations_nodes.has_key(contentid):
                    contentnode = annotations_nodes[contentid]
                else:
                    contentnode = {"id":contentid, "ensembles":[]}
                    annotations_nodes[contentid]=contentnode
                for ens in content.childNodes:
                    if ens.nodeType == xml.dom.Node.ELEMENT_NODE and ens.tagName.endswith("ensemble"):
                        contentnode["ensembles"].append(ens.toprettyxml())

        if len(annotations_nodes) > 0:
            writer.startElement(u"annotations")
            for content in contentList:
                if content.content_base.iri_id in annotations_nodes:
                    contentnode = annotations_nodes[content.content_base.iri_id]
                    if contentnode is not None:
                        if len(contentnode["ensembles"])>0:
                            writer.startElement(u"content", attributes={"id":contentnode["id"]})
                            writer.text(u"")
                            for ens in contentnode["ensembles"]:
                                writer.xmlFragment(ens.encode("utf-8"))
                            writer.endElement(u"content")
                        else:
                            writer.simpleElement(u"content", attributes={"id":contentnode["id"]})
            writer.endElement(u"annotations") 
        else:
            writer.simpleElement(u"annotations")

        writer.startElement(u"displays")        
        
        if len(contentList) > 0:
            writer.startElement(u"display", attributes={u"id":u"0",u"title":u"generated",u"idsel":contentList[0].content_base.iri_id,u"tc":u"0"})
            if resultList is not None:
                dec_dict = {}
                for res in resultList:
                    iri_id = res["iri_id"]
                    if iri_id not in dec_dict:
                        dec_dict[iri_id] = []
                    dec_list = dec_dict[iri_id]
                    dec_tuple = (res["decoupage_id"], res["ensemble_id"])
                    if dec_tuple not in dec_list:
                        dec_list.append(dec_tuple)
                        
            for content in contentList:
                writer.startElement(u"content", attributes={u"id":content.content_base.iri_id})
                
                dec_list = []
                if resultList is None:
                    doc = xml.dom.minidom.parse(content.iri_file_path())
                    con = xml.xpath.Context.Context(doc, 1, 1, None)
                    res = xml.xpath.Evaluate("/iri/body/ensembles/ensemble/decoupage", context=con)
                    for decoupagenode in res:
                        decoupage_id = decoupagenode.getAttribute(u"id")
                        ensemble_id = decoupagenode.parentNode.getAttribute(u"id")
                        dec_list.append((decoupage_id, ensemble_id))
                else:
                    dec_list = dec_dict[content.content_base.iri_id]

                for decoupage_id, ensemble_id in dec_list:
                    writer.simpleElement(u"decoupage", attributes={u"id":decoupage_id,u"idens":ensemble_id})
                writer.endElement(u"content")
            if startSegment is not None:
                writer.startElement(u"activeSegment")
                writer.simpleElement(u"id",attributes={u"idctt" : startSegment["idcontent"],u"idens" : startSegment["idgroup"], u"idcut" : startSegment["idcutting"], u"idseg" : startSegment["idsegment"]})
                writer.endElement(u"activeSegment")
                    
            writer.endElement(u"display")        

        writer.endElement(u"displays")
        writer.simpleElement(u"edits")
        writer.endElement(u"iri")

    def generateInit(self, url, method, search=None):
        
        import xml.dom
        import xml.dom.ext
        import time

        ts = unicode(int(time.time()*1000))
    
        impl = xml.dom.getDOMImplementation()
        doc = impl.createDocument(xml.dom.EMPTY_NAMESPACE, 'iri', None)
    
        elementFiles = doc.createElement('files')
        doc.documentElement.appendChild(elementFiles)
    
        elementInit = doc.createElement('init')
        elementFiles.appendChild(elementInit)
    
        elementfile = doc.createElement('file')
            
        elementfile.setAttribute('src',enmi.settings.WEB_URL + django.core.urlresolvers.reverse(method, args=url)+u"?"+ts)
        elementfile.setAttribute('display', '1')
        if(search):
            elementfile.setAttribute("segsel",enmi.settings.WEB_URL + django.core.urlresolvers.reverse(search, args=url)+u"?"+ts)
    
    
        #/*chemin video : tant que le serveur de media n'est pas up, */
        elementfile.setAttribute('video', enmi.settings.STREAM_URL)
        elementfile.setAttribute('pict', "")
        elementfile.setAttribute('extra', "")
    
        elementInit.appendChild(elementfile);
    
        elementRecent = doc.createElement('recent');
        elementFiles.appendChild(elementRecent);
    
    
        elementLibrary = doc.createElement('library');
        elementFiles.appendChild(elementLibrary);
    
        username = ''
        id = ''
        elementUser = doc.createElement('user')
        elementUser.setAttribute('name', username)
        elementUser.setAttribute('id', id)
        doc.documentElement.appendChild(elementUser)
        
        return doc
                
