/**
 * 
 */
package com.tandbergtv.workflow.web.util;

import java.io.File;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.ResourceBundle;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.log4j.Logger;

import com.n2bb.web.util.ReportWriter;
import com.tandbergtv.workflow.web.formbeans.BaseForm;
import com.tandbergtv.workflow.web.table.Column;
import com.tandbergtv.workflow.web.table.Table;
import com.tandbergtv.workflow.web.table.TableConfig;

/**
 * @author venkataprasath
 * 
 */
public class ExportUtility {

	private static final Logger log = Logger.getLogger(ExportUtility.class);

	private static final String DEFAULT_HEADER = "Default";

	public boolean exportDataToExcel(HttpServletRequest request,
			HttpServletResponse response, BaseForm baseForm,
			Collection<?> dataBeans, File configFile, String propertiesFileName) {
		return exportDataToExcel(request, response, baseForm, dataBeans, null, configFile,
				propertiesFileName);
	}

	public boolean exportDataToExcel(HttpServletRequest request, HttpServletResponse response,
			BaseForm baseForm, Collection<?> dataBeans, String[][] filters, File configFile,
			String propertiesFileName) {
		String tableName = (request.getParameter("tableName") == null) ? "NO TABLE FOUND"
				: request.getParameter("tableName").toString();
		Table table = TableConfig.getInstance().getTable(tableName, configFile);
		return exportDataToExcel(request, response, table, baseForm, dataBeans, filters, propertiesFileName);
	}

	public boolean exportDataToExcel(HttpServletRequest request, HttpServletResponse response,
			Table table, BaseForm baseForm, Collection<?> dataBeans, String propertiesFileName) {
		return exportDataToExcel(request, response, table, baseForm, dataBeans, null,
				propertiesFileName);
	}

	public boolean exportDataToExcel(HttpServletRequest request, HttpServletResponse response,
			Table table, BaseForm baseForm, Collection<?> dataBeans, String[][] filters,
			String propertiesFileName) {
		try {
			// Setting the Header
			String header = (request.getParameter("headerName") == null) ? DEFAULT_HEADER
					: request.getParameter("headerName").toString();
			log.debug("Header Name:" + header);

			// Setting the Sorting column name
			String sortBy = (baseForm.getSortingColumnName() == null || baseForm
					.getSortingColumnName().equals("")) ? null : baseForm
					.getSortingColumnName();
			log.debug("Sort By:" + sortBy);

			// Setting the Data Bean
			log.debug("records :" + dataBeans);

			// Setting the Display Column Names and Column Names
			Collection<Column> columns = table.getColumns();

			ArrayList<String> columnDisplayNamesList = new ArrayList<String>();
			ArrayList<String> methodNamesList = new ArrayList<String>();
			ArrayList<String> parameterList = new ArrayList<String>();
			ResourceBundle rbPaginationConstants = ResourceBundle.getBundle(propertiesFileName);

			for (Column column : columns) {
				if(column.getIsCheckBox())
					continue;
				
				HashMap<?,?> map = column.getColumnAttributesMap();
				String columnDisplayName = map.get("ColumnName").toString();
				if(columnDisplayName == null)
					columnDisplayName = "";
				
				try {
					columnDisplayName = rbPaginationConstants.getString(columnDisplayName);
				} catch (Exception ex) {
					log.debug("Key : " + columnDisplayName
							+ " not found in resource bundle. Using the column name as-is.", ex);
				}

				columnDisplayNamesList.add(columnDisplayName);
				if (map.get("MethodName") == null) {
					if (map.get("ParmValue") != null) {
						methodNamesList.add("paramValue");
						parameterList.add(map.get("ParmValue").toString());
					}
				} else {
					methodNamesList.add(map.get("MethodName").toString());
					parameterList.add("");
				}
			}
			
			String[] columnDisplayNames = columnDisplayNamesList.toArray(new String[]{});
			String[] methodNames = methodNamesList.toArray(new String[]{});
			String[] parameterNames = parameterList.toArray(new String[]{});

			// Export the data to Excel Sheet
			ReportWriter.generateReport(response, "Excel", header, filters,
					sortBy, columnDisplayNames, methodNames, parameterNames,
					dataBeans);

			return true;
		} catch (Exception ex) {
			log.error("Exception happened while exporting to Excel :" + ex, ex);
			return false;
		}
	}
}
