package org.genedb.web.mvc.controller.download;
import org.genedb.db.taxon.TaxonNode;
import org.genedb.db.taxon.TaxonNodeList;
import org.genedb.db.taxon.TaxonNodeManager;
import org.genedb.querying.core.NumericQueryVisibility;
import org.genedb.querying.core.Query;
import org.genedb.querying.core.QueryException;
import org.genedb.querying.core.QueryFactory;
import org.genedb.querying.history.HistoryItem;
import org.genedb.querying.history.HistoryManager;
import org.genedb.querying.history.HistoryType;
import org.genedb.querying.tmpquery.GeneSummary;
import org.genedb.querying.tmpquery.QuickSearchQuery;
import org.genedb.querying.tmpquery.SuggestQuery;
import org.genedb.querying.tmpquery.TaxonQuery;
import org.genedb.querying.tmpquery.QuickSearchQuery.QuickSearchQueryResults;
import org.genedb.web.mvc.controller.HistoryManagerFactory;
import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import com.google.common.collect.Lists;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
/**
*
* @author larry@sangerinstitute
*/
//@Controller
//@RequestMapping("/QuickSearchQuery")
public class QuickSearchQueryController extends AbstractGeneDBFormController {
// public static final String QUERY_NAME = "quickSearch";
//
// Logger logger = Logger.getLogger(QuickSearchQueryController.class);
//
// //@Autowired
// private QueryFactory queryFactory;
//
// public void setQueryFactory(QueryFactory queryFactory) {
// this.queryFactory = queryFactory;
// }
//
//
// private HistoryManagerFactory hmFactory;
//
// public void setHmFactory(HistoryManagerFactory hmFactory) {
// this.hmFactory = hmFactory;
// }
//
// @Autowired
// private ApplicationContext applicationContext;
//
// @RequestMapping(method = RequestMethod.GET)
// public String processRequest(HttpServletRequest request, HttpSession session, Model model) throws QueryException {
//
// QuickSearchQuery query = (QuickSearchQuery) queryFactory.retrieveQuery(QUERY_NAME, NumericQueryVisibility.PRIVATE);
//
// model.addAttribute("actionName" , request.getContextPath() + "/QuickSearchQuery");
//
// if (query==null){
// return "redirect:/Query";
// }
//
// for (Object key : request.getParameterMap().keySet()) {
// StringBuffer sb = new StringBuffer(key.toString() + " = ");
// for (String val : (String[]) request.getParameterMap().get(key)) {
// sb.append(" " + val);
// }
// logger.debug(sb.toString());
// }
//
// // Initialise model data somehow
// model.addAttribute("query", query);
// logger.error("The number of parameters is '" + request.getParameterMap().keySet().size() + "'");
// initialiseQueryForm(query, request);
//
// logger.debug("Query taxons: " + query.getTaxons());
//
// if (query != null && StringUtils.isEmpty(query.getSearchText())){
// logger.error("The query isn't null but no search terms. Returning to Query list");
// return "redirect:/Query";
// }
//
// String taxonLabel = "Root";
// if (request.getParameterMap().get("taxons") != null) {
// taxonLabel = ((String[]) request.getParameterMap().get("taxons"))[0];
// }
//
// TaxonNodeManager tnm = (TaxonNodeManager) applicationContext.getBean("taxonNodeManager", TaxonNodeManager.class);
// TaxonNode taxonNode = tnm.getTaxonNodeForLabel(taxonLabel);
// TaxonNodeList taxons = new TaxonNodeList(taxonNode);
//
// query.setTaxons(taxons);
//
// logger.debug("Query taxons: " + query.getTaxons());
//
// QuickSearchQueryResults quickSearchQueryResults = query.getQuickSearchQueryResults();
//
// // AddTaxonGroupToSession
// model.addAttribute("taxonGroup", quickSearchQueryResults.getTaxonGroup());
//
// return findDestinationView(query, model, quickSearchQueryResults, session);
// }
////
//// @RequestMapping(method = RequestMethod.GET, params = "q=none")
//// public String displayTaxonGroup(ServletRequest request, @RequestParam("searchText") String searchText,
//// @RequestParam("pseudogenes") String pseudogenes, @RequestParam("allNames") String allNames,
//// @RequestParam("product") String product, Model model) {
////
//// model.addAttribute("searchText", searchText.trim());
//// model.addAttribute("pseudogenes", pseudogenes);
//// model.addAttribute("allNames", allNames);
//// model.addAttribute("product", product);
//// String view = "search/quickSearchTaxons";
//// return view;
//// }
//
// /**
// *
// * @param queryName
// * @param query
// * @param model
// * @param quickSearchQueryResults
// * @param session
// * @return
// */
// private String findDestinationView(Query query, Model model,
// QuickSearchQueryResults quickSearchQueryResults, HttpSession session) {
// // Get the current taxon name
// String taxonName = findTaxonName(query);
// String resultsKey = null;
//
// logger.error("The number of results is '"+quickSearchQueryResults.getResults().size());
//
// logger.error(taxonName);
//
//
//
//// switch (quickSearchQueryResults.getQuickResultType()) {
//// case NO_EXACT_MATCH_IN_CURRENT_TAXON:
//// logger.error("No results found for query");
//// model.addAttribute("taxonNodeName", taxonName);
////
//// try {
//// logger.debug("No result found, trying suggestions.");
////
//// SuggestQuery squery = (SuggestQuery) queryFactory.retrieveQuery("suggest", NumericQueryVisibility.PRIVATE);
//// squery.setSearchText(((QuickSearchQuery) query).getSearchText());
//// squery.setMax(30);
//// squery.setTaxons(((TaxonQuery) query).getTaxons());
////
//// List sResults = squery.getResults();
//// model.addAttribute("suggestions", sResults);
////
//// } catch (QueryException e) {
//// logger.error(e.getMessage());
//// logger.error(e.getStackTrace().toString());
//// }
////
//// return "search/" + QUERY_NAME;
////
//// case SINGLE_RESULT_IN_CURRENT_TAXON:
//// List<GeneSummary> gs = quickSearchQueryResults.getResults();
//// cacheResults(gs, query, QUERY_NAME, quickSearchQueryResults.getTaxonGroup(), session.getId());
////
//// HistoryManager hm = hmFactory.getHistoryManager(session);
//// HistoryItem hitem = hm.addHistoryItem("query"+resultsKey, HistoryType.QUERY, gs.get(0).getSystematicId());
//// hitem.setQuery(query);
////
//// logger.error("The result is "+gs.get(0));
//// return "redirect:/gene/" + gs.get(0).getSystematicId();
////
//// case MULTIPLE_RESULTS_IN_CURRENT_TAXON:
//// List<GeneSummary> gs2 = quickSearchQueryResults.getResults();
//// resultsKey = cacheResults(gs2, query, QUERY_NAME, quickSearchQueryResults.getTaxonGroup(), session.getId());
//// //model.addAttribute("key", resultsKey);
////
//// HistoryManager hm2 = hmFactory.getHistoryManager(session);
//// List<String> ids2 = Lists.newArrayList();
//// for (GeneSummary geneSummary : gs2) {
//// ids2.add(geneSummary.getSystematicId());
//// }
////
//// HistoryItem hitem2 = hm2.addHistoryItem("query"+resultsKey, HistoryType.QUERY, ids2);
//// hitem2.setQuery(query);
////
//// model.addAttribute("taxonNodeName", taxonName);
//// logger.error("Found results for query (Size: '" + gs2.size() + "' key: '" + resultsKey
//// + "')- redirecting to Results controller");
//// return "redirect:/Results/"+resultsKey;
////
//// case ALL_ORGANISMS_IN_ALL_TAXONS:
//// List<GeneSummary> gs3 = quickSearchQueryResults.getResults();
//// resultsKey = cacheResults(gs3, query, QUERY_NAME, quickSearchQueryResults.getTaxonGroup(), session.getId());
//// //model.addAttribute("key", resultsKey);
////
//// HistoryManager hm3 = hmFactory.getHistoryManager(session);
////
//// List<String> ids3 = Lists.newArrayList();
//// for (GeneSummary geneSummary : gs3) {
//// ids3.add(geneSummary.getSystematicId());
//// }
////
//// HistoryItem hitem3 = hm3.addHistoryItem("query"+resultsKey, HistoryType.QUERY, ids3);
//// hitem3.setQuery(query);
////
//// model.addAttribute("taxonNodeName", taxonName);
//// logger.error("Found results for query (Size: '" + gs3.size() + "' key: '" + resultsKey
//// + "')- redirecting to Results controller");
//// return "redirect:/Results/"+resultsKey;
////
//// default:
//// return "";
//// }
// return "";
// }
}