package com.fp.frontend.helper;

import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;

import com.fp.common.exception.ExceptionHandler;
import com.fp.dto.Response;
import com.fp.frontend.utility.MsgGeneral;

/**
 * Clase a extender en las clases encargadas de obtener direcciones email a las
 * cuales se env&iacute;a notificaciones de flujos de trabajo..
 *
 * @version 2.1
 * @author Jorge Vaca
 */
public class MessageHelper {

    /**
     * Manejo de mensaje de error cuando en el core una transaccion no finaliza
     * correctamente.
     *
     * @param response Objeto que contiene la respuesta de la ejecucion de una
     * transaccion.
     */
    public static void setMessageError(Response response) {
        MessageHelper.setMessage(response, FacesMessage.SEVERITY_ERROR);
    }

    /**
     * Manejo de mensaje de error cuando en el core una transaccion no finaliza
     * correctamente.
     *
     * @param response Objeto que contiene la respuesta de la ejecucion de una
     * transaccion.
     */
    public static void setMessageInfo(Response response) {
        MessageHelper.setMessage(response, FacesMessage.SEVERITY_INFO);
    }

    /**
     * Manejo de mensaje de error cuando en el core una transaccion no finaliza
     * correctamente agregado un parametro.
     *
     * @param response Objeto que contiene la respuesta de la ejecucion de una
     * transaccion.
     * @param parametro Parametro a mostrar adjunto al mensaje
     */
    public static void setMessageInfo(Response response, String parametro) {
        MessageHelper.setMessage(response, FacesMessage.SEVERITY_INFO, parametro);
    }

    /**
     * Manejo de mensaje de error cuando en el core una transaccion no finaliza
     * correctamente.
     *
     * @param response Objeto que contiene la respuesta de la ejecucion de una
     * transaccion.
     */
    public static void setMessageInfo(String messagecode, String idComponent, Object... parameters) {
        MessageHelper.setMessage(FacesMessage.SEVERITY_INFO, messagecode, idComponent, parameters);
    }

    /**
     * Manejo de mensaje de error cuando en el core una transaccion no finaliza
     * correctamente.
     *
     * @param response Objeto que contiene la respuesta de la ejecucion de una
     * transaccion.
     */
    public static void setMessageError(String messagecode, Object... parameters) {
        MessageHelper.setMessageError(messagecode, null, parameters);
    }

    /**
     * Manejo de mensaje de error cuando en el core una transaccion no finaliza
     * correctamente.
     *
     * @param response Objeto que contiene la respuesta de la ejecucion de una
     * transaccion.
     * @param filename Nombre del campo al cual se asocia el mensaje de error.
     */
    public static void setMessageError(String messagecode, String idComponent, Object... parameters) {
        MessageHelper.setMessage(FacesMessage.SEVERITY_ERROR, messagecode, idComponent, parameters);
        FacesContext.getCurrentInstance().validationFailed();
    }

    /**
     * Manejo de mensaje de error cuando en el core una transaccion no finaliza
     * correctamente.
     *
     * @param response Objeto que contiene la respuesta de la ejecucion de una
     * transaccion.
     */
    public static void setMessageWarn(String messagecode, Object... parameters) {
        MessageHelper.setMessageWarn(messagecode, null, parameters);
    }

    /**
     * Manejo de mensaje de advertencia bajo alguna condicion.
     *
     * @param response Objeto que contiene la respuesta de la ejecucion de una
     * transaccion.
     * @param filename Nombre del campo al cual se asocia el mensaje de error.
     */
    public static void setMessageWarn(String messagecode, String idComponent, Object... parameters) {
        MessageHelper.setMessage(FacesMessage.SEVERITY_WARN, messagecode, idComponent, parameters);
        FacesContext.getCurrentInstance().validationFailed();
    }

    /**
     * Manejo de mensaje de error cuando en el core una transaccion no finaliza
     * correctamente.
     *
     * @param response Objeto que contiene la respuesta de la ejecucion de una
     * transaccion.
     * @param filename Nombre del campo al cual se asocia el mensaje de error.
     */
    private static void setMessage(FacesMessage.Severity type, String messagecode, String idComponent, Object... parameters) {
        String message = messagecode;
        try {
            message = MsgGeneral.getProperty(messagecode, parameters);
        } catch (Exception e) {
            // NO hacer nada se presenta el codigo de mensaje.
        }

        MessageHelper.setMessage(message, type, idComponent);
        FacesContext.getCurrentInstance().validationFailed();
    }

    /**
     * Manejo de mensaje de error cuando en el core una transaccion no finaliza
     * correctamente.
     *
     * @param response Objeto que contiene la respuesta de la ejecucion de una
     * transaccion.
     */
    public static void setMessageWarn(Response response) {
        MessageHelper.setMessage(response, FacesMessage.SEVERITY_WARN);
    }
    
    public static void setMessageWarn(String message){
        try {
            FacesMessage fm = new FacesMessage();
            fm.setSummary(message);
            fm.setSeverity(FacesMessage.SEVERITY_WARN);
            FacesContext.getCurrentInstance().addMessage(null, fm);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * Manejo de mensaje de error cuando en el core una transaccion no finaliza
     * correctamente.
     *
     * @param response Objeto que contiene la respuesta de la ejecucion de una
     * transaccion.
     */
    private static void setMessage(Response response, FacesMessage.Severity type) {
        try {
            FacesMessage fm = new FacesMessage();
            if (response.getResponseCode().compareTo(Response.RESPONSE_OK) == 0) {
                fm.setSummary("TRANSACCION FINALIZADA");
            } else {
                fm.setSummary(response.getResponseCode() + " " + response.getResponseUserMessage());
                FacesContext.getCurrentInstance().validationFailed();
            }

            fm.setDetail("");
            fm.setSeverity(type); // con esto saca la imagen en el browser.
            FacesContext.getCurrentInstance().addMessage(null, fm);

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * Manejo de un mensaje personalizado
     *
     * @param message
     */
    public static void setMessageInfo(String message) {
        try {
            FacesMessage fm = new FacesMessage();
            fm.setSummary(message);
            FacesContext.getCurrentInstance().addMessage(null, fm);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * Manejo de mensaje de error cuando en el core una transaccion no finaliza
     * correctamente.
     *
     * @param response Objeto que contiene la respuesta de la ejecucion de una
     * transaccion.
     * @param severity Severity error
     * @param param valor a mostrar adjunto al mensaje
     */
    private static void setMessage(Response response, FacesMessage.Severity type, String param) {
        try {
            FacesMessage fm = new FacesMessage();
            if (response.getResponseCode().compareTo(Response.RESPONSE_OK) == 0) {
                fm.setSummary("TRANSACCION FINALIZADA " + param);
            } else {
                fm.setSummary(response.getResponseCode() + " " + response.getResponseUserMessage());
                FacesContext.getCurrentInstance().validationFailed();
            }

            fm.setDetail("");
            fm.setSeverity(type); // con esto saca la imagen en el browser.
            FacesContext.getCurrentInstance().addMessage(null, fm);

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * Manejo del mensaje de respuesta cuando en la ejecucion de una transaccion
     * se presenta una excepcion.
     *
     * @param ex
     */
    public static void setMessageError(Throwable ex) {
        try {
            ExceptionHandler eh = new ExceptionHandler(ex, "es");
            FacesMessage fm = new FacesMessage();
            fm.setSummary(eh.getUserMessage());
            fm.setDetail(eh.getTechnicalMessage());
            fm.setSeverity(FacesMessage.SEVERITY_ERROR);
            FacesContext.getCurrentInstance().addMessage(null, fm);
            ex.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * Manejo de mensaje de error cuando en el core una transaccion no finaliza
     * correctamente.
     *
     * @param response Objeto que contiene la respuesta de la ejecucion de una
     * transaccion.
     */
    private static void setMessage(String messagecode, FacesMessage.Severity type, String idComponent) {
        try {
            FacesMessage fm = new FacesMessage();
            fm.setSummary(messagecode);
            fm.setDetail("");
            fm.setSeverity(type);

            FacesContext.getCurrentInstance().addMessage(idComponent, fm);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
