/*
 * 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.rest;

import com.qsoft.util.constantes.CodigoRespuesta;
import com.qsoft.util.constantes.ErrorTipo;
import com.qsoft.util.ms.pojo.HeaderMS;
import com.qsoft.erp.constantes.DominioConstantes;
import com.qsoft.erp.dominio.ConsultaGenerica;
import com.qsoft.erp.dominio.exception.DominioExcepcion;
import com.qsoft.erp.dominio.util.AuditoriaUtil;
import com.qsoft.wmp.services.util.ServiceUtil;
import com.qsoft.wmp.services.xsd.BodyEntradaConsulta;
import com.qsoft.wmp.services.xsd.EntradaConsulta;
import com.qsoft.wmp.services.xsd.SalidaConsulta;
import java.util.List;
import javax.annotation.PostConstruct;
import javax.inject.Inject;
import javax.servlet.http.HttpServletRequest;
import javax.ws.rs.Consumes;
import javax.ws.rs.Produces;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.MediaType;

/**
 * REST Web Service
 *
 * @author james
 */
@Path("consulta")
public class ConsultaResource {

    @Inject
    private ConsultaGenerica consulta;

    @Inject
    private AuditoriaUtil auditoria;

    @Context
    private HttpServletRequest request;

    @PostConstruct
    public void postConstructor() {
    }

    /**
     *
     * @return an instance of java.lang.String
     */
    @GET
    @Produces(MediaType.APPLICATION_JSON)
    public SalidaConsulta getJson() {
        SalidaConsulta salida = ServiceUtil.crearSalidaConsultaError(CodigoRespuesta.CODIGO_ERROR_GENERICO,
                "Acción no soportada por favor ejecute la consulta via POST");
        return salida;
    }

    /**
     * PUT method for updating or creating an instance of ConsultaResource
     *
     * @param entrada
     * @return
     */
    @POST
    @Consumes(MediaType.APPLICATION_JSON)
    @Produces(MediaType.APPLICATION_JSON)
    public SalidaConsulta postJson(EntradaConsulta entrada) {
        SalidaConsulta salida = null;
//        Long time = System.currentTimeMillis();
        if (entrada == null) {
            salida = ServiceUtil.crearSalidaConsultaError(ErrorTipo.WARNING, CodigoRespuesta.CODIGO_IN_NULO, "La entrada no puede ser nula");
        } else {
//            AuditoriaDTO dto = ServiceUtil.crearAuditoria(entrada.getHeaderIn(), entrada.getBodyIn().getEntidad(),
//                    super.getClass().getName() + ".posJson", this.request.getRequestURL().toString(),
//                    ConsultaGenerica.class.getName() + ".consultaGenerica", ServiceUtil.REQUEST,
//                    "" + entrada.getBodyIn().getTipoConsulta(), 0, ServiceUtil.getJson(entrada));
//            this.auditoria.AddAuditoria(dto);
            try {
                List resultado = null;
                BodyEntradaConsulta body = entrada.getBodyIn();
                resultado = consulta.consultaGenerica(entrada.getHeaderIn(), entrada.getBodyIn().getEntidad(),
                        body.getParametros(), body.getMaximoRegistros(), body.getRegistroInicio(), body.getTipoConsulta());

                HeaderMS header = entrada.getHeaderIn();
                header.setFechaHora(DominioConstantes.getDateTime());
                salida = ServiceUtil.crearSalidaConsultaOk(header, entrada.getBodyIn().getEntidad(), resultado);
            } catch (DominioExcepcion ex) {
                salida = ServiceUtil.crearSalidaConsultaError(ex.getTipo(), ex.getCodigo(), ex.getMensaje());
            } catch (Exception ex) {
                salida = ServiceUtil.crearSalidaConsultaError(CodigoRespuesta.CODIGO_ERROR_GENERICO, ex.toString());
                ex.printStackTrace();
            }
        }
//        time = System.currentTimeMillis() - time;
//        AuditoriaDTO dto = ServiceUtil.crearAuditoria(salida.getHeaderOut(), salida.getBodyOut().getEntidad(),
//                super.getClass().getName() + ".posJson", this.request.getRequestURL().toString(),
//                ConsultaGenerica.class.getName() + ".consultaGenerica", ServiceUtil.RESPONSE,
//                "", time.intValue(), ServiceUtil.getJson(salida.getError()));
//        System.out.println("=====> TIEMPO " + dto.getAudTiempoEjecucion());
//        this.auditoria.AddAuditoria(dto);
        return salida;
    }

}
