package eu.dnetlib.espas.dm.local;

import java.io.IOException;
import java.io.PrintStream;
import java.util.ArrayList;
import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.io.IOUtils;
import org.apache.log4j.Logger;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

import com.google.gson.Gson;


@Controller()
public class DownloadManagerController {

	private static Logger logger = Logger.getLogger(DownloadManagerController.class);
	private LocalDownloadManager manager = null;

	@RequestMapping("/download")
	@SuppressWarnings("unchecked")
	public void download(HttpServletRequest request,
			HttpServletResponse response) throws IOException {
		
		try {
			String descriptors = request.getParameter("descriptors");
			System.out.println(descriptors);
			int ttl = Integer.parseInt(request.getParameter("timeToLive"));
			Gson gson = GsonUtils.createGson();
	
			List<Object> descriptorList = gson.fromJson(descriptors, List.class);
			List<ResultDescriptor> list = new ArrayList<ResultDescriptor>();
	
			for (Object o : descriptorList)
				list.add(gson.fromJson(o.toString(), ResultDescriptor.class));
			
			response.setContentType("application/json");
			response.getOutputStream().write((GsonUtils.createGson().toJson(manager.download(null, list, ttl, null))).getBytes());
		} catch (Exception e) {
			logger.error("Error starting download", e);
			e.printStackTrace(new PrintStream(response.getOutputStream()));
			
			response.setStatus(500);
		}
	}

	@RequestMapping("/getStatus")
	public void getStatus(HttpServletRequest request,
			HttpServletResponse response) throws IOException {

		try {
			String requestId = request.getParameter("requestId");
			Gson gson = GsonUtils.createGson();
			
			response.setContentType("application/json");
			response.getOutputStream().write(gson.toJson(manager.getStatus(requestId)).getBytes());
		} catch (Exception e) {
			logger.error("Error getting status", e);
			e.printStackTrace(new PrintStream(response.getOutputStream()));
			response.setStatus(500);
		}

	}

	@RequestMapping("/getBundle")
	public void getBundle(HttpServletRequest request,
			HttpServletResponse response) throws IOException {
		String requestId = request.getParameter("requestId");
		
		DownloadStatus requestStatus = manager.getStatus(requestId);

		try {
			response.setContentType("application/octet-stream");
			logger.debug("Filename = " + requestStatus.getFileName());
			response.setHeader("Content-Disposition", "attachment; filename=" + requestStatus.getFileName() + ".zip");
			
			IOUtils.copy(manager.getBundle(requestId),
					response.getOutputStream());
		} catch (Exception e) {
			logger.error("Error getting bundle", e);
			
			e.printStackTrace(new PrintStream(response.getOutputStream()));

			response.setStatus(500);
		}
	}

	public LocalDownloadManager getManager() {
		return manager;
	}

	public void setManager(LocalDownloadManager manager) {
		this.manager = manager;
	}
	
}