package com.fitbank.servlet;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.fitbank.common.logger.FitbankLogger;
import com.fitbank.dto.GeneralResponse;
import com.fitbank.dto.management.Detail;
import com.fitbank.web.ActionTypes;
import com.fitbank.web.DataManage;
import com.fitbank.web.FacesUtil;
import com.fitbank.web.Report;
import com.fitbank.web.Trn;

public class ActionsServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	private boolean evalAction(DataManage dm, String pAction, HttpServletRequest req) {
		ActionTypes action = ActionTypes.valueOf(pAction);
		switch (action) {
		case QUERY:
			dm.query(req);
			return true;
		case SAVE:
			dm.save(req);
			return true;
		case NEXT:
			dm.next(req);
			return true;
		case PREV:
			dm.prev(req);
			return true;
		default:
			return false;
		}
	}

	public DataManage getDataManage(HttpServletRequest req) {
		DataManage dm = (DataManage) req.getSession().getAttribute("dm");

		return dm;
	}

	private String getResponse(String pCode, String pMessage) {
		String data = "{ identifier: 'id',  items: [	{ id:'1' ,code: '" + pCode + "', message: '" + pMessage + "' }]}";
		return data;
	}

	@Override
	public void init(ServletConfig config) throws ServletException {
		super.init(config);
	}

	@Override
	protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		PrintWriter pw = resp.getWriter();
		try {
			DataManage dm = this.getDataManage(req);
			new FacesUtil(dm, req);
			String action = req.getParameter("_action");
			FitbankLogger.getLogger().debug("Action:|" + action + "|");
			String data = "";
			if (action != null) {
				if (action.trim().toLowerCase().compareTo("trn") == 0) {
					Trn trn = new Trn(req);
					data = trn.getData();
				} else if (action.trim().toLowerCase().compareTo("rep") == 0) {
					Report trn = new Report(req);
					data = trn.getData();
				} else {
					if (this.evalAction(dm, action.toUpperCase(), req)) {
						Detail det = (Detail) dm.get("det");
						if (det != null) {
							GeneralResponse gr = det.getResponse();
							if (gr != null) {
								data = this.getResponse(gr.getCode(), gr.getUserMessage());
							} else {
								data = this.getResponse("2", "MENSAJE SIN RESPUESTA");
							}
						} else {
							data = this.getResponse("2", "MENSAJE NO ENCONTRADO");
						}
					} else {
						if (action.compareToIgnoreCase("copy") == 0) {
							String from = req.getParameter("from");
							String to = req.getParameter("to");
							if ((from == null) || (to == null)) {
								data = this.getResponse("1", "FROM/TO NO VALIDO");
							} else {
								Object obj = dm.get(from);
								if (obj != null) {
									dm.put(to, obj);
									data = this.getResponse("0", "OK");
								} else {
									data = this.getResponse("1", "OBJETO NO ENCONTRADO");
								}
							}
						} else {
							data = this.getResponse("1", "TIPO NO DEFINIDO");
						}
					}
				}
			}
			pw.print(data);
		} catch (Exception e) {
			e.printStackTrace();
			pw.print(e.getMessage());
		} finally {
			pw.close();
		}

	}
}
