/*
 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.
 */

package org.apache.ofbiz.content.test;

import java.io.File;
import java.lang.Object;
import java.lang.String;
import java.util.HashMap;
import java.util.Map;

import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.index.DirectoryReader;
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.TopScoreDocCollector;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
import org.apache.ofbiz.content.search.SearchWorker;
import org.apache.ofbiz.entity.GenericValue;
import org.apache.ofbiz.entity.util.EntityQuery;
import org.apache.ofbiz.service.ServiceUtil;
import org.apache.ofbiz.service.testtools.OFBizTestCase;

public class LuceneTests extends OFBizTestCase {

    protected GenericValue userLogin = null;

    public LuceneTests(String name) {
        super(name);
    }

    @Override
    protected void setUp() throws Exception {
        userLogin = EntityQuery.use(delegator).from("UserLogin").where("userLoginId", "system").queryOne();
    }

    @Override
    protected void tearDown() throws Exception {
    }

    public void testSearchTermHand() throws Exception {
        Map<String, Object> ctx = new HashMap<String, Object>();
        ctx.put("contentId", "WebStoreCONTENT");
        ctx.put("userLogin", userLogin);
        Map<String, Object> resp = dispatcher.runSync("indexContentTree", ctx);
        assertTrue("Could not init search index", ServiceUtil.isSuccess(resp));
        try {
            Thread.sleep(3000); // sleep 3 seconds to give enough time to the indexer to process the entries
        } catch(Exception e) {}
        Directory directory = FSDirectory.open(new File(SearchWorker.getIndexPath("content")).toPath());
        DirectoryReader r = null;
        try {
            r = DirectoryReader.open(directory);
        } catch (Exception e) {
            fail("Could not open search index: " + directory);
        }

        BooleanQuery.Builder combQueryBuilder = new BooleanQuery.Builder();
        String queryLine = "hand";

        IndexSearcher searcher = new IndexSearcher(r);
        Analyzer analyzer = new StandardAnalyzer();
        analyzer.setVersion(SearchWorker.getLuceneVersion());

        QueryParser parser = new QueryParser("content", analyzer);
        Query query = parser.parse(queryLine);
        combQueryBuilder.add(query, BooleanClause.Occur.MUST);
        BooleanQuery combQuery = combQueryBuilder.build();

        TopScoreDocCollector collector = TopScoreDocCollector.create(10);
        searcher.search(combQuery, collector);

        assertEquals("Only 1 result expected from the testdata", 1, collector.getTotalHits());
    }
}
