/**
 * @author Daniel Castillo (adcastic)
 * @since 03/11/2017
 * @version 1.0
 */
angular.module('felApp')
        /**
         * 
         * @param {type} $http Servicio que permite realizar peticiones HTTP
         * @param {type} $rootScope Contexto global
         * @returns {undefined}
         */
        .service('felSrv', function ($http, $rootScope, $modal, $filter) {
            var felSrv = {};
            // indica si se debe de mostrar el panel de cargando
            $rootScope.mostrarPanelCargando = false;
            
            $rootScope.parametros={};
            const URL_API_REST = document.querySelector('#urlApiRest').innerHTML;

            // se obtiene la url del API-Rest
            //const URL_API_REST = 'http://localhost:8080/fel-rest/rest';
            // servicio que sera inyectado en los controladores



            var catalogoSeleccione = {codigo: '',
                descripcion: 'Seleccione',
                codigoDescripcion: 'Seleccione'};
            /**
             * Funcion que se encarga de carga un catalogo desde el Api-REST.
             * 
             * @param {type} nombreCatalogo Catalogo que se debe solicitar
             * @param {type} filtro Filtro que se debe aplicar a los valores del catalogo
             
             */
            felSrv.cargarCatalogo = function (datosFiltro) {
                var catalogo = {
                    exito: true,
                    data: []
                };
                var param = {};
                param.formatoRespuesta = 'json';
                param.urlServicio = '/publico/configuracion/' + datosFiltro.Nit + '/' + datosFiltro.Clave;
                
                felSrv.ejecutarPeticionGet(param).then(
                        function (respuesta) {
                            catalogo.exito = true;
                            catalogo.data = respuesta.data.respuesta;
                            if (felSrv.isNullOrEmptyOrUndefined(catalogo.data.tipoRespuesta)) {                               
                                // document.location.target = "_blank";
                                // document.location.href = "https://prefarm3.sat.gob.gt/menu/pages/adm/menuSaqbe.jsf";
                            }
                        },
                        function () {
                            // document.location.target = "_blank";
                            // document.location.href = "https://prefarm3.sat.gob.gt/menu/pages/adm/menuSaqbe.jsf";
                            catalogo.exito = false;
                            catalogo.data = [];
                        });
                return catalogo;
            };
            felSrv.isNullOrEmptyOrUndefined = function (value) {
                return !value;
            };
           
            felSrv.enviarDatosPost = function (pDocumento, urlServicio) {
                var respuestaPost = {
                    exito: false,
                    data: []
                };
                var param = {};
                param.data = pDocumento;
                param.urlServicio = urlServicio;
                felSrv.ejecutarPeticionPost(param).then(
                        function (respuesta) {
                            respuestaPost.exito = true;
                            respuestaPost.data = respuesta.data.detalle[0];
                        });
                return respuestaPost;
            };
            /**
             * Funcion que permite ejecutar peticiones GET.
             * 
             * @param {type} param Datos para la peticion
             * @returns {unresolved}
             */
            felSrv.ejecutarPeticionGet = function (param) {
                return $http({
                    method: 'GET',
                    url: URL_API_REST + param.urlServicio,
                    params: param.filtros,
                    responseType: 'json',
                    headers: {
                        'Accept': 'application/json;charset=utf-8',
                        'Access-Control-Allow-Origin': '*'
                    }
                });
            };
            /**
             * Funcion que permite ejecutar peticiones POST.
             * 
             * @param {type} param Datos para la peticion
             * @returns {unresolved}
             */
            felSrv.ejecutarPeticionPost = function (param) {                
                return $http({
                    method: 'POST',
                    url: URL_API_REST + param.urlServicio,
                    data: param.data,
                    
                    responseType: 'json',
                    headers: {
                        'Content-Type': 'application/json;charset=utf-8',
                        'Accept': 'application/json;charset=utf-8',
                        'Access-Control-Allow-Origin': '*',
                        'Authorization': param.validacion
                    }
                });
            };

            /**
             * Funcion permte ejecutar peticion post devuelve arraybuffer para 
             * descarga e impresion de pdf
             * @param {type} param
             * @returns {unresolved}
             */
            felSrv.ejecutarPeticionPostPdf = function (param) {
                return  $http({
                    method: 'POST',
                    url: URL_API_REST + param.urlServicio,
                    data: param.data,
                    responseType: 'arraybuffer',
                    headers: {
                        'Content-Type': 'application/json;charset=utf-8',
                        'Accept': 'application/json;charset=utf-8, application/pdf',
                        'Access-Control-Allow-Origin': '*',
                        'Authorization': param.validacion
                    }
                });
            };
            
               felSrv.ejecutarPeticionPostPdfVerificacion = function (param) {
                return  $http({
                    method: 'POST',
                    url: URL_API_REST + param.urlServicio,
                    data: param.data,
                    responseType: 'arraybuffer',
                    headers: {
                        'Content-Type': 'application/json;charset=utf-8',
                        'Accept': 'application/json;charset=utf-8, application/pdf',
                        'Access-Control-Allow-Origin': '*'
                    }
                });
            };
            
              felSrv.ejecutarPeticionPostPdfConstancia = function (param) {
                return  $http({
                    method: 'POST',
                    url: URL_API_REST + param.urlServicio,
                    data: param.data,
                    headers: {
                        'Content-Type': 'application/json;charset=utf-8',
                        'Accept': 'application/json;charset=utf-8, application/pdf',
                        'Access-Control-Allow-Origin': '*',
                        'Authorization': param.validacion
                    }
                });
            };
            
            felSrv.ejecutarPeticionPostDocumentos = function (param) {
                return  $http({
                    method: 'POST',
                    url: URL_API_REST + param.urlServicio,
                    headers: {
                        'Content-Type': 'application/json;charset=utf-8',
                        'Accept': 'application/json;charset=utf-8, application/pdf',
                        'Access-Control-Allow-Origin': '*',
                        'Authorization': param.validacion,
                        'Cadena': param.cadena,
                        'TipoDoc': param.tipoDoc
                    } 
                });
            };
            
            
            
            
//            felSrv.download = function () {
//                return $http({
//                    method: 'GET',
//                    url: 'http://localhost:8080/fel-rest/rest/publico/downloadPDF',
//                    responseType: 'arraybuffer',
//                    cache: true,
//                    headers: {
//                        'Accept': 'application/pdf;charset=utf-8',
//                        'Access-Control-Allow-Origin': '*'}});
//            };



            /**
             * Funcion que permite carga una pagina HTML como un panel modal.
             * 
             * @param {type} plantilla URL de la pagina HTML, debe de ser apartir de
             * resources/modales
             * @param {type} scope Scope en el que debe de existir la pagina
             * @param {type} funcionCerrar Funcion que se debe ejecutar despues de cerrar
             * el modal
             * @returns {undefined}
             */
            felSrv.mostrarPaginaModal = function (plantilla, scope) {
                var paginaModal = {
                    scope: scope,
                    templateUrl: '../modales' + plantilla,
                    backdropAnimation: 'am-fade',
                    title: 'title',
                    content: 'content',
                    show: true,
                    animation: 'am-fade',
                    // placement: 'center',

                    modalClass: 'modal',
                    keyboard: true,
                    backdrop: true,
                    windowClass: 'modal',
                    prefixClass: 'modal',
                    prefixEvent: 'modal',
                    contentTemplate: false,
                    container: false,
                    element: null,
                    html: false
                };



                $modal(paginaModal);
            };
            
              felSrv.b64toBlob = (b64Data, contentType = '', sliceSize = 512) => {
                    const byteCharacters = atob(b64Data);
                    const byteArrays = [];

                    for (let offset = 0; offset < byteCharacters.length; offset += sliceSize) {
                        const slice = byteCharacters.slice(offset, offset + sliceSize);

                        const byteNumbers = new Array(slice.length);
                        for (let i = 0; i < slice.length; i++) {
                            byteNumbers[i] = slice.charCodeAt(i);
                        }

                        const byteArray = new Uint8Array(byteNumbers);
                        byteArrays.push(byteArray);
                    }

                    const blob = new Blob(byteArrays, {type: contentType});
                    return blob;
                };
            /**
             * Funcion para procesar las respuestas de error de las peticiones HTTP.
             * 
             * @param {type} response ResponseBody de la peticion
             * @returns {undefined}
             */
            felSrv.errorGeneralPeticion = function (response) {

            };
            return felSrv;
        });