package com.fp.frontend.webservices.impl;

import java.io.ByteArrayInputStream;
import java.util.Calendar;
import java.util.Date;
import java.util.List;

import javax.jws.WebService;

import com.fp.common.logger.APPLogger;
import com.fp.dto.Request;
import com.fp.dto.Response;
import com.fp.frontend.controller.alfresco.AlfrescoController;
import com.fp.frontend.helper.CallerHelper;
import com.fp.frontend.webservices.ColaImpresionService;
import com.fp.persistence.parmas.dto.ws.ColaImpresionDto;
import com.fp.persistence.parmas.dto.ws.ImagenDto;
import com.fp.persistence.parmas.dto.ws.JefeCentroControlDto;

@WebService(endpointInterface = "com.fp.frontend.webservices.ColaImpresionService")
public class ColaImpresionServiceImpl implements ColaImpresionService {

    @SuppressWarnings("unchecked")
    @Override
    public List<ColaImpresionDto> obtenerDatosPendientesImprimir(String usercode) {
        List<ColaImpresionDto> lcolaImpresion = null;
        try {
            CallerHelper callerHelper = new CallerHelper();
            Request request = callerHelper.getRequest();
            request.setCompany(1);
            request.put("usercode", usercode);
            request.put("estado", "PIMPR");
            request.put("queryalias", "COLAIMPRESION");
            Response response = callerHelper.executeQuery(request);
            if (response.getResponseCode().compareTo(Response.RESPONSE_OK) == 0) {
                lcolaImpresion = (List<ColaImpresionDto>) response.get("COLAIMPRESION");
            }
        } catch (Throwable e) {
            lcolaImpresion = null;
            APPLogger.getLogger().error(e.getMessage(), e);
        }
        return lcolaImpresion;
    }

    @SuppressWarnings("unchecked")
    @Override
    public List<ColaImpresionDto> obtenerDocumentosImpresionProceso(
            String codigoproceso) {
        List<ColaImpresionDto> lcolaImpresion = null;
        try {
            CallerHelper callerHelper = new CallerHelper();
            Request request = callerHelper.getRequest();
            request.setCompany(1);
            request.put("CODIGOSOLICITUD", codigoproceso);
            request.put("queryalias", "IMPRESIONPROCESO");
            Response response = callerHelper.executeQuery(request);
            if (response.getResponseCode().compareTo(Response.RESPONSE_OK) == 0) {
                lcolaImpresion = (List<ColaImpresionDto>) response.get("COLAIMPRESION");
            }
        } catch (Throwable e) {
            lcolaImpresion = null;
            APPLogger.getLogger().error(e.getMessage(), e);
        }
        return lcolaImpresion;
    }

    @Override
    public JefeCentroControlDto obtenerJefeCentroArmas(String numerodocumento) {
        JefeCentroControlDto jefeCentroControl = null;
        try {
            CallerHelper callerHelper = new CallerHelper();
            Request request = callerHelper.getRequest();
            request.setCompany(1);
            request.put("NUMERODOCUMENTO", numerodocumento);
            request.put("queryalias", "JEFECENTRO");
            Response response = callerHelper.executeQuery(request);
            if (response.getResponseCode().compareTo(Response.RESPONSE_OK) == 0) {
                jefeCentroControl = (JefeCentroControlDto) response.get("JEFECENTRO");
            }
        } catch (Throwable e) {
            APPLogger.getLogger().error(e.getMessage(), e);
        }
        return jefeCentroControl;
    }

    @Override
    public ImagenDto obtenerImagenPersona(String numeroidentificacion) {
        System.out.println("obtenerImagenPersona.........." + numeroidentificacion);
        ImagenDto imagen = null;
        try {
            CallerHelper callerHelper = new CallerHelper();
            Request request = callerHelper.getRequest();
            request.setCompany(1);
            request.put("NUMEROIDENTIFICACION", numeroidentificacion);
            request.put("queryalias", "IMAGENPERSONA");
            System.out.println("obtenerImagenPersona..........** " + numeroidentificacion);
            Response response = callerHelper.executeQuery(request);
            if (response.getResponseCode().compareTo(Response.RESPONSE_OK) == 0) {
                imagen = (ImagenDto) response.get("IMAGENPERSONA");
                System.out.println("..Imagen.........." + imagen);
            }
        } catch (Throwable e) {
            APPLogger.getLogger().error(e.getMessage(), e);
        }
        return imagen;
    }

    @Override
    public String envioInforme(byte[] documento, String numerosolicitud) {
        System.out.println("envioInforme............................" + numerosolicitud);
        String responseStatus = "0";
        try {
            if (documento == null || numerosolicitud == null) {
                return "1";
            }

            CallerHelper callerHelper = new CallerHelper();
            Request request = callerHelper.getRequest();
            request.setCompany(1);
            request.put("NUMEROSOLICITUD", numerosolicitud);
            request.put("queryalias", "XPATHDOCUMENTOSOLICITUD");
            request.setTransactionModule("30");
            request.setTransactionCode(9995);
            request.setTransactionVersion(1);
            Response response = callerHelper.executeSave(request);
            String xpathdocumento = null;
            if (response.getResponseCode().compareTo(Response.RESPONSE_OK) == 0) {
                xpathdocumento = (String) response.get("XPATHDOCUMENTOSOLICITUD");
                responseStatus = (String) response.get("RESPONSESTATUS");

            }

            if (xpathdocumento != null) {
                AlfrescoController alfrescoController = new AlfrescoController();
                alfrescoController.uploadFileWebService(new ByteArrayInputStream(documento), obtenerNombreArchivoxPath(xpathdocumento), obtenerXpath(xpathdocumento), "admin");
                responseStatus = "0";
            } else {
                responseStatus = "3";
            }
        } catch (Throwable e) {
            responseStatus = "2";
        }
        return responseStatus;
    }

    /**
     * Retorna el nombre del archivo del xpath enviado
     *
     * @param xpath
     * @return
     */
    private String obtenerNombreArchivoxPath(String xpath) {
        String nombreArchivo = null;
        int indice = xpath.lastIndexOf("/cm:");
        nombreArchivo = xpath.substring(indice + 4);
        return nombreArchivo;
    }

    /**
     * Retorna el xpath de la ruta en donde se va a almacenar el documento
     *
     * @param xpath ruta en donde se almacenar&aacute; el archivo
     * @return
     */
    private String obtenerXpath(String xpath) {
        String rutaXpath = null;
        int indice = xpath.lastIndexOf("/cm:");
        rutaXpath = xpath.substring(0, indice);
        return rutaXpath;
    }

    /**
     * Retorna la ruta base donde se almacenara dicho archivo
     *
     * @return
     */
    public String getRutaDocumentoSolBase(Date fechaEmision, String numerosolicitud, String numerodocumento) {
        StringBuilder ruta = null;
        if (fechaEmision != null && numerosolicitud != null
                && numerodocumento != null) {
            Calendar calendar = Calendar.getInstance();
            calendar.setTime(fechaEmision);
            ruta = new StringBuilder("cm:Solicitud");
            ruta = ruta.append("/cm:A-").append(calendar.get(Calendar.YEAR));
            ruta = ruta.append("/cm:M-").append((calendar.get(Calendar.MONTH) + 1) <= 9 ? "0" + (calendar.get(Calendar.MONTH) + 1) : (calendar.get(Calendar.MONTH) + 1));
            ruta = ruta.append("/cm:").append(numerosolicitud);
            ruta = ruta.append("/cm:").append(numerodocumento + ".pdf");
        }
        return ruta != null ? ruta.toString() : null;
    }

}
