/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */


import org.apache.lucene.analysis.core.WhitespaceAnalyzer
import org.apache.ofbiz.content.search.SearchWorker

import org.apache.lucene.document.Document
import org.apache.lucene.index.DirectoryReader
import org.apache.lucene.queryparser.classic.ParseException
import org.apache.lucene.queryparser.classic.QueryParser
import org.apache.lucene.search.BooleanClause
import org.apache.lucene.search.BooleanQuery
import org.apache.lucene.search.IndexSearcher
import org.apache.lucene.search.Query
import org.apache.lucene.search.ScoreDoc
import org.apache.lucene.search.TopScoreDocCollector
import org.apache.lucene.store.FSDirectory

if (parameters.luceneQuery) {
    Query combQuery = new BooleanQuery()
    IndexSearcher searcher
    WhitespaceAnalyzer analyzer
    try {
        DirectoryReader reader = DirectoryReader.open(FSDirectory.open(new File(SearchWorker.getIndexPath("products")).toPath()))
        searcher = new IndexSearcher(reader)
        analyzer = new WhitespaceAnalyzer()
    } catch (FileNotFoundException e) {
        context.errorMessageList.add(e.getMessage())
        return
    }

    QueryParser parser = new QueryParser("fullText", analyzer)
    parser.setLocale(locale)
    Query query
    try {
        query = parser.parse(parameters.luceneQuery)
    } catch(ParseException pe) {
        context.errorMessageList.add(pe.getMessage())
        return
    }
    combQuery.add(query, BooleanClause.Occur.MUST)

    TopScoreDocCollector collector = TopScoreDocCollector.create(100) // defaulting to 100 results
    searcher.search(combQuery, collector)
    ScoreDoc[] hits = collector.topDocs().scoreDocs
    productList = []
    hits.each { hit ->
        Document doc = searcher.doc(hit.doc)
        productId = doc.productId
        product = from("Product").where("productId", productId).cache(true).queryOne()
        if (product) {
            productList.add(product)
        }
    }
    context.queryResults = productList
}
