package org.genedb.web.mvc.controller.download;
import org.displaytag.tags.TableTagParameters;
import org.displaytag.util.ParamEncoder;
import org.genedb.querying.core.Query;
import org.genedb.querying.core.QueryException;
import org.genedb.querying.core.QueryFactory;
import org.genedb.querying.core.NumericQueryVisibility;
import org.genedb.querying.history.HistoryItem;
import org.genedb.querying.history.HistoryManager;
import org.genedb.querying.tmpquery.GeneSummary;
import org.genedb.querying.tmpquery.IdsToGeneSummaryQuery;
import org.genedb.querying.tmpquery.QuickSearchQuery;
import org.genedb.querying.tmpquery.SuggestQuery;
import org.genedb.web.mvc.controller.HistoryManagerFactory;
//import org.genedb.web.mvc.model.ResultsCacheFactory;
import org.apache.log4j.Logger;
//import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
//
//@Controller
//@RequestMapping("/Results")
public class ResultsController {
// private static final Logger logger = Logger.getLogger(ResultsController.class);
//
// //private static final String IDS_TO_GENE_SUMMARY_QUERY = "idsToGeneSummary";
//
// public static final int DEFAULT_LENGTH = 30;
//
// public static final int ID_TO_GENE_SUMMARY_EXPANSION_BATCH = 10;
//
// private HistoryManagerFactory hmFactory;
//
// public void setHmFactory(HistoryManagerFactory hmFactory) {
// this.hmFactory = hmFactory;
// }
//
// //@Autowired
// //private ResultsCacheFactory resultsCacheFactory;
//
//// public void setResultsCacheFactory(ResultsCacheFactory resultsCacheFactory) {
//// this.resultsCacheFactory = resultsCacheFactory;
//// }
//
// @SuppressWarnings("unchecked")
// public void setQueryFactory(QueryFactory queryFactory) {
// this.queryFactory = queryFactory;
// }
//
// //@Autowired
// @SuppressWarnings("unchecked")
// private QueryFactory queryFactory;
//
// @RequestMapping(method = RequestMethod.GET)
// public String setUpForm() {
// return "redirect:/QueryList";
// }
//
// @RequestMapping(method = {RequestMethod.GET} , value="/{key}")
// public String setUpForm(
// @PathVariable(value="key") String key,
// @RequestParam(value="taxonNodeName", required=false) String taxonNodeName,
// HttpServletRequest request,
// HttpSession session,
// Model model) throws QueryException {
// // TODO Do we want form submission via GET?
//
// if (!StringUtils.hasText(key)) {
// WebUtils.setFlashMessage("Unable to identify which query to use", session);
// return "redirect:/QueryList";
// }
//
// String pName = new ParamEncoder("row").encodeParameterName(TableTagParameters.PARAMETER_PAGE);
// logger.debug("pName is '"+pName+"'");
// String startString = request.getParameter((new ParamEncoder("row").encodeParameterName(TableTagParameters.PARAMETER_PAGE)));
// logger.debug("The start string is '"+startString+"'");
//
// // Use 1-based index for start and end
// int start = 1;
// if (startString != null) {
// start = (Integer.parseInt(startString) - 1) * DEFAULT_LENGTH + 1;
// }
//
// int end = start + DEFAULT_LENGTH;
//
// logger.debug(key);
// //logger.debug(resultsCacheFactory);
// //logger.debug(resultsCacheFactory.getResultsCacheMap());
//
//// if (!resultsCacheFactory.getResultsCacheMap().containsKey(key)) {
//// WebUtils.setFlashMessage("Unable to retrieve results for this key", session);
//// logger.error("Unable to retrieve results for key '"+key+"'");
//// return "redirect:/QueryList";
//// }
//
//
//
// //ResultEntry resultEntry = resultsCacheFactory.getResultsCacheMap().get(key);
// HistoryManager hm = hmFactory.getHistoryManager(session);
// HistoryItem item = hm.getHistoryItemByName("query"+key);
//
// logger.info("item:" + item);
//
// Query query = item.getQuery();
//
// logger.info("Found results for query (Query: '"+query.getQueryName()+" 'Session: '"+session.getId()+"' key: '"+key+"')-");
//
// //List<GeneSummary> results = query.getResults();
//
// String queryName = queryFactory.getRealName(query);
//
// Integer resultSize = item.getNumberItems();
//
//
// logger.debug("The number of results retrieved is '"+resultSize+"'");
// logger.debug("The end marker, before adjustment, is '"+end+"'");
//
// if (end > resultSize + 1) {
// end = resultSize + 1;
// }
//
// // List<GeneSummary> possiblyExpanded = possiblyExpandResults(results);
//
//// if (possiblyExpanded == null) {
//// possiblyExpanded = results;
//// logger.debug("The subset is already expanded");
//// } else {
//// // Need to update cache
//// logger.debug("We've expanded the systematic ids");
//// resultEntry.results = possiblyExpanded;
//// resultsCacheFactory.getResultsCacheMap().put(key, resultEntry);
//// logger.debug("And stored the set back");
//// }
//
// model.addAttribute("results", query.getResults());
// model.addAttribute("resultsSize", resultSize);
// model.addAttribute("key", key);
// model.addAttribute("firstResultIndex", start);
//
// //model.addAttribute("isMaxResultsReached", Boolean.valueOf(resultEntry.query.isMaxResultsReached()));
//
// if (taxonNodeName != null) {
// model.addAttribute("taxonNodeName", taxonNodeName);
// }
//// if (resultEntry.taxonGroup != null) {
//// model.addAttribute("taxonGroup", resultEntry.taxonGroup);
//// }
//
// if (query != null) {
//
// populateModelData(model, query);
//
// if (queryName.equals("quickSearch")) {
//
// QuickSearchQuery quickSearchQuery = (QuickSearchQuery) query;
// model.addAttribute("query", quickSearchQuery);
// logger.info("taxonGroup : " + quickSearchQuery.getQuickSearchQueryResults().getTaxonGroup());
// model.addAttribute("taxonGroup", quickSearchQuery.getQuickSearchQueryResults().getTaxonGroup());
//
// if (resultSize == 0) {
// SuggestQuery squery = (SuggestQuery) queryFactory.retrieveQuery("suggest", NumericQueryVisibility.PRIVATE);
// squery.setSearchText(quickSearchQuery.getSearchText());
// squery.setTaxons(quickSearchQuery.getTaxons());
// squery.setMax(30);
//
// List sResults = squery.getResults();
// model.addAttribute("suggestions", sResults);
// }
//
// } else {
// model.addAttribute("query", query);
// }
//// // quick search query has a special path...
//// model.addAttribute("actionName" , request.getContextPath() + "/QuickSearchQuery");
//// } else {
////
//// }
////
// model.addAttribute("actionName" , request.getContextPath() + "/Query/" + queryName);
//
// return "search/"+ queryName;
// }
//
// return "list/results2";
// }
//
// /**
// * Expand the current resultset, i.e. to initialise more fields in the list of GeneSummary instances
// * @param results The un-expanded resultset
// * @return expanded The expanded resultset
// * @throws QueryException
// */
//// private List<GeneSummary> possiblyExpandResults(List<GeneSummary> results) throws QueryException {
//// List<String> subset = new ArrayList<String>();
//// List<GeneSummary> expanded = new ArrayList<GeneSummary>();
////
//// for(int i=0; i<results.size(); ++i){
////
//// subset.add(results.get(i).getSystematicId());
//// if (i % ID_TO_GENE_SUMMARY_EXPANSION_BATCH == 0
//// || i+1 == results.size()){
//// //expand current batch
//// List<GeneSummary> converts = convertIdsToGeneSummaries(subset);
//// expanded.addAll(converts);
//// subset.clear();
//// }
//// }
////
//// //Sort overall result
//// Collections.sort(expanded);
//// return expanded;
//// }
//
//// @SuppressWarnings("unchecked")
//// private List<GeneSummary> convertIdsToGeneSummaries(List<String> ids) throws QueryException {
//// IdsToGeneSummaryQuery idsToGeneSummary =
//// (IdsToGeneSummaryQuery) queryFactory.retrieveQuery(IDS_TO_GENE_SUMMARY_QUERY, NumericQueryVisibility.PRIVATE);
////
//// if (idsToGeneSummary == null) {
//// throw new RuntimeException("Internal error - unable to find ids to gene summary query");
//// }
//// idsToGeneSummary.setIds(ids);
//// return (List<GeneSummary>)idsToGeneSummary.getResults();
//// }
//
// private void populateModelData(Model model, Query query) {
// Map<String, Object> modelData = query.prepareModelData();
// for (Map.Entry<String, Object> entry : modelData.entrySet()) {
// logger.info("Populating " + entry.getKey());
// model.addAttribute(entry.getKey(), entry.getValue());
// }
// }
}