/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package com.qsoft.wmp.services.util;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.qsoft.erp.constantes.DominioConstantes;
import com.qsoft.erp.dto.AuditoriaDTO;
import com.qsoft.util.constantes.CodigoRespuesta;
import com.qsoft.util.constantes.ErrorTipo;
import com.qsoft.util.ms.pojo.HeaderMS;
import com.qsoft.wmp.services.xsd.SalidaAccion;
import com.qsoft.wmp.services.xsd.SalidaConsulta;
import java.util.List;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author james
 */
public class ServiceUtil {

    public static final String REQUEST = "Request";
    public static final String RESPONSE = "Response";
    
    /**
     * Crear salida
     *
     * @param codigo
     * @param mensaje
     * @return
     */
    public static SalidaConsulta crearSalidaConsultaError(CodigoRespuesta codigo, String mensaje) {
        SalidaConsulta salida = new SalidaConsulta();
        salida.getError().setCodigo(codigo.getCodigo());
        salida.getError().setMensaje(mensaje);
        salida.getError().setTipo(ErrorTipo.ERROR.name());
        return salida;
    }

    /**
     * Crear salida
     *
     * @param codigo
     * @param mensaje
     * @return
     */
    public static SalidaAccion crearSalidaAccionError(CodigoRespuesta codigo, String mensaje) {
        SalidaAccion salida = new SalidaAccion();
        salida.getError().setCodigo(codigo.getCodigo());
        salida.getError().setMensaje(mensaje);
        salida.getError().setTipo(ErrorTipo.ERROR.name());
        return salida;
    }

    /**
     * Crear salida
     *
     * @param error
     * @param codigo
     * @param mensaje
     * @return
     */
    public static SalidaConsulta crearSalidaConsultaError(ErrorTipo error, CodigoRespuesta codigo, String mensaje) {
        SalidaConsulta salida = new SalidaConsulta();
        salida.getError().setCodigo(codigo.getCodigo());
        salida.getError().setMensaje(mensaje);
        salida.getError().setTipo(error.name());
        return salida;
    }

    /**
     * Crear salida
     *
     * @param error
     * @param codigo
     * @param mensaje
     * @return
     */
    public static SalidaAccion crearSalidaAccionError(ErrorTipo error, CodigoRespuesta codigo, String mensaje) {
        SalidaAccion salida = new SalidaAccion();
        salida.getError().setCodigo(codigo.getCodigo());
        salida.getError().setMensaje(mensaje);
        salida.getError().setTipo(error.name());
        return salida;
    }

    /**
     * Crear salida ok
     *
     * @param header
     * @param tipoSalida
     * @param data
     * @return
     */
    public static SalidaConsulta crearSalidaConsultaOk(HeaderMS header, String tipoSalida, List data) {
        SalidaConsulta salida = new SalidaConsulta();
        salida.setHeaderOut(header);
        salida.getError().setCodigo(CodigoRespuesta.CODIGO_OK.getCodigo());
        salida.getError().setMensaje(CodigoRespuesta.CODIGO_OK.name());
        salida.getError().setTipo(ErrorTipo.INFO.name());
        salida.getBodyOut().setEntidad(tipoSalida);
        salida.getBodyOut().setData(data);
        return salida;
    }

    /**
     * Crear salida ok
     *
     * @param <error>
     * @param header
     * @param estado
     * @param data
     * @return
     */
    public static Map<String, Object> crearSalidaAccionOkFarmaenlace(Map<String, Object> resultado) {
        //SalidaAccionFarmaEnlace salida = new SalidaAccionFarmaEnlace();
        //salida.setStatus((Boolean) resultado.get("status"));
        //salida.setMensaje((String) resultado.get("mensaje"));
        //salida.setAutorizacion((String) resultado.get("autorizacion"));
        //salida.setReceta((Integer) resultado.get("receta"));

       
        //return salida;
        return resultado;
    }
    
    
    public static SalidaAccion crearSalidaAccionOk(HeaderMS header, String estado, List<Object> data) {
        SalidaAccion salida = new SalidaAccion();
        salida.setHeaderOut(header);
        salida.getError().setCodigo(CodigoRespuesta.CODIGO_OK.getCodigo());
        salida.getError().setMensaje(CodigoRespuesta.CODIGO_OK.name());
        salida.getError().setTipo(ErrorTipo.INFO.name());
        salida.getBodyOut().setEstado(estado);
        salida.getBodyOut().setResultados(data);
        return salida;
    }

    /**
     * Permite convertiri un objeto determinado en JSON 
     * @param object
     * @return 
     */
    public static String getJson(Object object) {
        ObjectMapper mapper = new ObjectMapper();
        String json = null;
        try {
            json = mapper.writeValueAsString(object);
        } catch (JsonProcessingException ex) {
            Logger.getLogger(ServiceUtil.class.getName()).log(Level.SEVERE, null, ex);
        }
        return json;
    }

    /**
     * Permite crear el DTO de auditoria
     *
     * @param header
     * @param entidad
     * @param metodo
     * @param endpoint
     * @param backend
     * @param servicio
     * @param json
     * @param tiempo
     * @param accion
     * @return
     */
    public static AuditoriaDTO crearAuditoria(HeaderMS header, String entidad, String metodo,
            String endpoint, String backend, String servicio, String accion, Integer tiempo, String json) {
        AuditoriaDTO auditoria = new AuditoriaDTO();
        auditoria.setAudAplicacion(header.getAplicacion());
        auditoria.setAudBackend(backend);
        auditoria.setAudCanal(header.getCanal());
        auditoria.setAudDinamico(json);
        auditoria.setAudDispositivo(header.getDispositivo());
        auditoria.setAudEmpresa(header.getEmpresa());
        auditoria.setAudEndpoint(endpoint);
        auditoria.setAudEntidad(entidad);
        auditoria.setAudFecha(DominioConstantes.getBddDate());
        auditoria.setAudGeolocalizacion(header.getGeolocalizacion());
        auditoria.setAudIdioma(header.getIdioma());
        auditoria.setAudMedio(header.getMedio());
        auditoria.setAudMetodo(metodo);
        auditoria.setAudServicio(servicio);
        auditoria.setAudTiempoEjecucion(tiempo);
        auditoria.setAudTipoEjecucion(accion);
        auditoria.setAudToken(header.getUuid());
        auditoria.setAudTransaccion(header.getTipoTransaccion());
        auditoria.setAudUsuario(header.getUsuario());
        return auditoria;
    }   
    

}
