/**
 * 
 */
package querqy.solr;

import java.io.IOException;
import java.util.List;
import java.util.Map;
import java.util.Set;

import org.apache.lucene.search.Query;
import org.apache.solr.handler.component.QueryComponent;
import org.apache.solr.handler.component.ResponseBuilder;
import org.apache.solr.search.QParser;

import querqy.infologging.InfoLoggingContext;
import querqy.rewrite.SearchEngineRequestAdapter;
import querqy.rewrite.commonrules.model.DecorateInstruction;

/**
 * @author René Kriegler, @renekrie
 *
 */
public class QuerqyQueryComponent extends QueryComponent {

    /* (non-Javadoc)
     * @see org.apache.solr.handler.component.SearchComponent#prepare(org.apache.solr.handler.component.ResponseBuilder)
     */
    @Override
    public void prepare(final ResponseBuilder rb) throws IOException {

        super.prepare(rb);
        
        QParser parser = rb.getQparser();
        
        if (parser instanceof QuerqyDismaxQParser) {
        
            List<Query> filterQueries = ((QuerqyDismaxQParser) parser).getFilterQueries();
            if ((filterQueries != null) && !filterQueries.isEmpty()) {
                List<Query> filters = rb.getFilters();
                if (filters == null) {
                    rb.setFilters(filterQueries);
                } else {
                    filters.addAll(filterQueries);
                }
            }

        }
    }

    /* (non-Javadoc)
     * @see org.apache.solr.handler.component.SearchComponent#process(org.apache.solr.handler.component.ResponseBuilder)
     */
    @Override
    public void process(final ResponseBuilder rb) throws IOException {
        
        super.process(rb);
        
        QParser parser = rb.getQparser();
        
        if (parser instanceof QuerqyDismaxQParser) {

            final SearchEngineRequestAdapter searchEngineRequestAdapter =
                    ((QuerqyDismaxQParser) parser).getSearchEngineRequestAdapter();

            final Map<String, Object> context = searchEngineRequestAdapter.getContext();
            if (context != null) {

                @SuppressWarnings("unchecked")
                Set<Object> decorations = (Set<Object>) context.get(DecorateInstruction.CONTEXT_KEY);
                if (decorations != null) {
                    rb.rsp.add("querqy_decorations", decorations);
                }
            }

            searchEngineRequestAdapter.getInfoLoggingContext().ifPresent(InfoLoggingContext::endOfRequest);
        }

    }

    /* (non-Javadoc)
     * @see org.apache.solr.handler.component.SearchComponent#getDescription()
     */
    @Override
    public String getDescription() {
        return "Querqy search component";
    }

}