/*
 * 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.standard.StandardAnalyzer
import org.apache.lucene.document.Document
import org.apache.lucene.index.Term
import org.apache.lucene.queryparser.classic.QueryParser
import org.apache.lucene.store.FSDirectory
import org.apache.ofbiz.base.util.UtilHttp
import org.apache.ofbiz.content.search.SearchWorker
import org.apache.ofbiz.product.feature.ParametricSearch
import org.apache.lucene.search.*
import org.apache.lucene.index.DirectoryReader
import org.apache.ofbiz.base.util.UtilProperties;

queryLine = parameters.queryLine;

siteId = parameters.lcSiteId;

searchFeature1 = (String) parameters.SEARCH_FEAT;
searchFeature2 = (String) parameters.SEARCH_FEAT2;
searchFeature3 = (String) parameters.SEARCH_FEAT3;

featureIdByType = ParametricSearch.makeFeatureIdByTypeMap(UtilHttp.getParameterMap(request));

combQuery = new BooleanQuery();

try {
    DirectoryReader reader = DirectoryReader.open(FSDirectory.open(new File(SearchWorker.getIndexPath("content")).toPath()));
    searcher = new IndexSearcher(reader);
    analyzer = new StandardAnalyzer();
} catch (java.io.FileNotFoundException e) {
    context.errorMessageList.add(UtilProperties.getMessage("ContentErrorUiLabels", "ContentSearchNotIndexed", locale));
    return;
}

if (queryLine || siteId) {
    Query query = null;
    if (queryLine) {
        QueryParser parser = new QueryParser("content", analyzer);
        query = parser.parse(queryLine);
        combQuery.add(query, BooleanClause.Occur.MUST);
    }
    if (siteId) {
        termQuery = new TermQuery(new Term("site", siteId.toString()));
        combQuery.add(termQuery, BooleanClause.Occur.MUST);
    }
}

if (searchFeature1 || searchFeature2 || searchFeature3 || !featureIdByType.isEmpty()) {
    featureQuery = new BooleanQuery();
    featuresRequired = BooleanClause.Occur.MUST;
    if ("any".equals(parameters.any_or_all)) {
        featuresRequired = BooleanClause.Occur.SHOULD;
    }

    if (searchFeature1) {
        termQuery = new TermQuery(new Term("feature", searchFeature1));
        featureQuery.add(termQuery, featuresRequired);
    }

    if (searchFeature2) {
        termQuery = new TermQuery(new Term("feature", searchFeature2));
        featureQuery.add(termQuery, featuresRequired);
    }

    if (searchFeature3) {
        termQuery = new TermQuery(new Term("feature", searchFeature3));
        featureQuery.add(termQuery, featuresRequired);
    }

  if (featureIdByType) {
    featureIdByType.each { key, value ->
            termQuery = new TermQuery(new Term("feature", value));
            featureQuery.add(termQuery, featuresRequired);
        }
    combQuery.add(featureQuery, featuresRequired);
    }
}
if (searcher) {
    TopScoreDocCollector collector = TopScoreDocCollector.create(100); //defaulting to 100 results
    searcher.search(combQuery, collector);
    ScoreDoc[] hits = collector.topDocs().scoreDocs;

    contentList = [] as ArrayList;
    hitSet = [:] as HashSet;
    for (int start = 0; start < collector.getTotalHits(); start++) {
        Document doc = searcher.doc(hits[start].doc)
        contentId = doc.get("contentId");
        content = from("Content").where("contentId", contentId).cache(true).queryOne();
        if (!hitSet.contains(contentId)) {
            contentList.add(content);
            hitSet.add(contentId);
        }
    }
    context.queryResults = contentList;
}
