package eu.dnetlib.server;

import eu.dnetlib.goldoa.domain.*;
import eu.dnetlib.goldoa.service.RequestManager;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileItemFactory;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.commons.io.IOUtils;
import org.springframework.context.ApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils;

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.text.ParseException;
import java.util.List;

/**
 * Created by antleb on 10/13/15.
 */
public class CSVServlet extends HttpServlet {

	private RequestManager requestManager;

	@Override
	public void init(ServletConfig config) throws ServletException {

		super.init(config);

		ApplicationContext context = WebApplicationContextUtils
				.getWebApplicationContext(getServletContext());

		this.requestManager = (RequestManager) context.getBean("requestManager");
	}

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		try {
			String mode = req.getParameter("mode");
			RequestSort requestSortBy = null;
			RequestSortOrder order = null;
			String term = req.getParameter("filterTerm");
			Request.RequestStatus[] statusFilter = null;

			if (req.getParameter("requestSort") != null)
				requestSortBy = RequestSort.valueOf(req.getParameter("requestSort"));
			if (req.getParameter("requestOrder") != null)
				order = RequestSortOrder.valueOf(req.getParameter("requestOrder"));
			if (req.getParameter("statusFilters") != null) {
				String[] statuses = req.getParameter("statusFilters").split(",");
				statusFilter = new Request.RequestStatus[statuses.length];

				for (int i = 0; i < statuses.length; i++)
					statusFilter[i] = Request.RequestStatus.valueOf(statuses[i]);
			} else if ("accounting".equals(mode)){
				statusFilter = new Request.RequestStatus[] {Request.RequestStatus.APPROVED, Request.RequestStatus.ACCOUNTING_PROCESSING, Request.RequestStatus.ACCOUNTING_PAID, Request.RequestStatus.ACCOUNTING_ON_HOLD, Request.RequestStatus.ACCOUNTING_DENIED};
			}

			String csv = requestManager.getCSV(mode, requestSortBy, order, null, term, statusFilter);

			resp.setStatus(200);
			resp.setContentType("text/csv; charset=UTF-8");
			resp.setContentLength(csv.length());
			resp.setCharacterEncoding("UTF-8");
			resp.addHeader("Content-Disposition", "attachment; filename=requests.csv");
			resp.getWriter().write(csv);
//			new PrintWriter(new OutputStreamWriter(resp.getOutputStream(), "UTF-8")).write();

		} catch (Exception e) {
			resp.setStatus(500);
			e.printStackTrace(new PrintStream(resp.getOutputStream()));
		}

	}

	@Override
	public void doPost(HttpServletRequest request, HttpServletResponse response)  throws ServletException, IOException {
		FileItemFactory factory = new DiskFileItemFactory();
		ServletFileUpload upload = new ServletFileUpload(factory);
		try {
			List<FileItem> items = upload.parseRequest(request);
			for (FileItem item:items) {
				InputStream is = item.getInputStream();
				String csv = IOUtils.toString(is, "UTF-8");
				requestManager.importCSV(csv);
			}
			String resp = "";
			response.setContentType("text/plain");
			response.setContentLength(resp.length()+6);
			response.getOutputStream().print("###" + resp + "###");
		} catch (Exception e){
			response.setContentType("text/plain");
			response.setContentLength(e.getMessage().length()+6);
			response.getOutputStream().print("###" + e.getMessage() + "###");
			new RuntimeException(e);
		}
	}


}
