/**
 * 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.oodt.cas.filemgr.browser.model;

import org.apache.lucene.analysis.standard.ParseException;
import org.apache.lucene.index.Term;
import org.apache.lucene.queryParser.QueryParser;
import org.apache.lucene.search.BooleanClause;
import org.apache.lucene.search.BooleanQuery;
import org.apache.lucene.search.PhraseQuery;
import org.apache.lucene.search.RangeQuery;
import org.apache.lucene.search.TermQuery;

import org.apache.oodt.cas.filemgr.structs.Query;
import org.apache.oodt.cas.filemgr.structs.RangeQueryCriteria;
import org.apache.oodt.cas.filemgr.structs.TermQueryCriteria;
import org.apache.oodt.cas.filemgr.tools.CASAnalyzer;

public class QueryBuilder {

  private CasDB database;

  public QueryBuilder(CasDB db) {
    database = db;
  }

  public Query ParseQuery(String query) {
    // note that "__FREE__" is a control work for free text searching
    QueryParser parser = new QueryParser("__FREE__", new CASAnalyzer());

    org.apache.lucene.search.Query luceneQ = null;
    org.apache.oodt.cas.filemgr.structs.Query casQ = new org.apache.oodt.cas.filemgr.structs.Query();

    try {
      luceneQ = parser.parse(query);
    } catch (org.apache.lucene.queryParser.ParseException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    }

    System.out.println(luceneQ.toString());
    GenerateCASQuery(casQ, luceneQ);

    return casQ;
  }

  public void GenerateCASQuery(org.apache.oodt.cas.filemgr.structs.Query casQ,
      org.apache.lucene.search.Query luceneQ) {
    if (luceneQ instanceof TermQuery) {
      Term t = ((TermQuery) luceneQ).getTerm();
      if (t.field().equals("__FREE__")) {
        // if(casQuery.getCriteria().isEmpty()) casQuery.addCriterion(new
        // FreeTextQueryCriteria());
        // ((FreeTextQueryCriteria)casQuery.getCriteria().get(0)).addValue(t.text());
      } else {
        String element = database.getElementID(t.field());
        if (!element.equals("") && !t.text().equals("")) {

          casQ.addCriterion(new TermQueryCriteria(element, t.text()));
        }
      }
    } else if (luceneQ instanceof PhraseQuery) {
      Term[] t = ((PhraseQuery) luceneQ).getTerms();
      if (t[0].field().equals("__FREE__")) {
        // if(casQuery.getCriteria().isEmpty()) casQuery.addCriterion(new
        // FreeTextQueryCriteria());
        // for(int i=0;i<t.length;i++)
        // ((FreeTextQueryCriteria)casQuery.getCriteria().get(0)).addValue(t[i].text());
      } else {
        for (int i = 0; i < t.length; i++) {
          String element = database.getElementID(t[i].field());
          if (!element.equals("") && !t[i].text().equals("")) {
            casQ.addCriterion(new TermQueryCriteria(element, t[i].text()));
          }
        }
      }
    } else if (luceneQ instanceof RangeQuery) {
      Term startT = ((RangeQuery) luceneQ).getLowerTerm();
      Term endT = ((RangeQuery) luceneQ).getUpperTerm();
      String element = database.getElementID(startT.field());
      if (!element.equals("") && !startT.text().equals("")
          && !endT.text().equals("")) {
        casQ.addCriterion(new RangeQueryCriteria(element, startT.text(), endT
            .text()));
      }
    } else if (luceneQ instanceof BooleanQuery) {
      BooleanClause[] clauses = ((BooleanQuery) luceneQ).getClauses();
      for (int i = 0; i < clauses.length; i++) {
        GenerateCASQuery(casQ, (clauses[i]).getQuery());
      }
    } else {
      System.out.println("Error Parsing Query");
      System.exit(-1);
    }
  }

}
