var env = $('meta[name="env"]').attr('content');
var lang = $('html')[0].lang;

moment.locale('es');

toastr.options = {
  'closeButton': true,
  'debug': false,
  'newestOnTop': true,
  'progressBar': true,
  'positionClass': 'toast-top-center',
  'preventDuplicates': true,
  'showDuration': '500',
  'hideDuration': '1000',
  'timeOut': '5000',
  'extendedTimeOut': '1000',
  'showEasing': 'swing',
  'hideEasing': 'linear',
  'showMethod': 'fadeIn',
  'hideMethod': 'fadeOut'
};

ERPSystem = { 
    
    reportError: (title = '', text = '', url = false) => {

        console.log('reportError', url);

        let report = '<a href="' + $('meta[name="error-url"]').attr('content') 
                    + '" target="_blank" class="font-weight-bold"><i class="fa-solid fa-arrow-up-right-from-square text-primary"></i> Ir a reportar</a>';
        
        if(!url){
            Swal.fire({
                title: title,
                html: text,
                footer: report
            });    
        }else{
            Swal.fire({
                title: title,
                html: text,
                icon: 'error',
                footer: report,
                showCancelButton: true,
                cancelButtonText: 'Ok',
                confirmButtonText: 'Ir',
            }).then((result) => {
              /* Read more about isConfirmed, isDenied below */
              if (result.isConfirmed) {
                window.open(url, '_blank');                
              } else if (result.isDenied) {
                // Swal.fire("Changes are not saved", "", "info");
              }
            });
        }
    },

    errInputs: (jsonResponse, title = '') => {

        title = (jsonResponse.hasOwnProperty('message')) ? jsonResponse.message : '';
        let url = (jsonResponse.hasOwnProperty('url')) ? jsonResponse.url : false;
        let msg = (jsonResponse.hasOwnProperty('msg')) ? jsonResponse.msg + '</br>' : '';

        if(jsonResponse.errors) {
            let errors = jsonResponse.errors;

            if (env != 'production')
                console.log({errors});

            $('.is-invalid').removeClass('is-invalid');
            $('.invalid-feedback').remove();
            
            $.each(errors, function( key, value ) {
                $ele = $(':input[name="' + key + '"]');

                if($ele.length){
                    $ele.addClass('is-invalid');
                    $ele.parent().append('<div class="invalid-feedback">' + value[0] + '</div>');   
                } else {
                    msg += value[0] + '</br>';
                }
            }); 
        }

        ERPSystem.reportError(title, msg, url);
    },

    getPetition: (path, params, type = 'POST', async = true) => {

        return getPetition = new Promise((resolve, reject) => {

            let token = $('meta[name="csrf-token"]').attr('content');
            let active_warehouse = $('meta[name="active-warehouse"]').attr('content'); 
            let _token = { '_token': token, 'api' : true, 'active_warehouse' : active_warehouse };
            $.extend( true, params, _token );

            if(!path.includes('http')){
                let url = $('meta[name="app-url"]').attr('content');
                if(!path.startsWith('/'))
                    url = url + '/';
                path = url + path;
            }

            if (env != 'production')
                console.log("WEBSERVICE [" + type + "]: \n" + path + "\nTOKEN [" + token + "] \n" + ( (params) ? JSON.stringify(params, null, 2) : ''));

            $.ajaxSetup({
                headers: {
                    'X-Requested-With': 'XMLHttpRequest',
                    'Accept': 'application/json',
                    'X-Active-Warehouse' : $('meta[name="active-warehouse"]').attr('content'),
                    'X-CSRF-TOKEN': token
                }
            });

            $.ajax({
                type: type,
                async: async,
                url: path,
                dataType: 'json',
                data: params,
                success:(data) => {
                    $('.loadsubmit').removeClass('kt-spinner kt-spinner--right kt-spinner--md kt-spinner--light').attr('disabled', false);
                    resolve(data);
                },
                error: (err) => { 
                    $('.loadsubmit').removeClass('kt-spinner kt-spinner--right kt-spinner--md kt-spinner--light').attr('disabled', false);
                    if(err.status == 422) {
                        ERPSystem.errInputs(err.responseJSON);
                    } else if(err.status == 404) {
                        ERPSystem.reportError('', 'Registro no encontrado.')
                    } else if(err.status == 401) {
                        ERPSystem.reportError('', 'Permisos insuficientes.')
                    } else {
                        reject(err); 
                    }
                },
                beforeSend: function(){
                    KTApp.blockPage(ktblock);
                },
                complete: function(){
                    setTimeout(function () { KTApp.unblockPage(); }, 2000);
               }
            });
        });
    },

    getPetitionFile: (path, params, type = 'POST') => {
        return getPetition = new Promise((resolve, reject) => {

            let token = $('meta[name="csrf-token"]').attr('content');
            let active_warehouse = $('meta[name="active-warehouse"]').attr('content'); 
            //let _token  = { '_token': token, 'api' : true, 'active_warehouse' : active_warehouse };
            params.append('_token', token);
            params.append('api' , true);
            params.append('active_warehouse' , active_warehouse);
            //$.extend( true, params, _token );
            if(!path.includes('http')){
                let url = $('meta[name="app-url"]').attr('content');
                if(!path.startsWith('/'))
                    url = url + '/';
                path = url + path;
            }

            console.log("WEBSERVICE [" + type + "]: \n" + path + "\nTOKEN [" + token + "] \n" + JSON.stringify(params, null, 2));

            $.ajaxSetup({
                headers: {
                    'X-Requested-With': 'XMLHttpRequest',
                    'Accept': 'application/json',
                    'X-Active-Warehouse' : $('meta[name="active-warehouse"]').attr('content'),
                    'X-CSRF-TOKEN': token
                }
            });

            $.ajax({
                type: type,
                url: path,
                enctype: 'multipart/form-data',
                data: params,
                processData: false,
                contentType: false,
                success:(data) => {
                    $('.loadsubmit').removeClass('kt-spinner kt-spinner--right kt-spinner--md kt-spinner--light').attr('disabled', false);
                    resolve(data);
                },
                error: (err) => { 
                    $('.loadsubmit').removeClass('kt-spinner kt-spinner--right kt-spinner--md kt-spinner--light').attr('disabled', false);
                    if(err.status == 422) {
                        ERPSystem.errInputs(err.responseJSON);
                    } else if(err.status == 404) {
                        ERPSystem.reportError('', 'Registro no encontrado.')
                    } else {
                        reject(err); 
                    }
                },
                beforeSend: function(){
                    KTApp.blockPage(ktblock);
                },
                complete: function(){
                    setTimeout(function () { KTApp.unblockPage(); }, 2000);
               }
            });
        });
    },

    deletePetition: (model, id) => {
        return deletePetition = new Promise((resolve, reject) => {

            let url   = $('meta[name="api"]').attr('content'); //|| 'http://127.0.0.1:8000';
            let token = $('meta[name="csrf-token"]').attr('content');
            let path  = url + '/' + model +'/' + id;
            let type  = 'DELETE';
            
            swal.fire({
                title: '¿Estas seguro que desea eliminar el registro?',
                type: 'warning',
                showCancelButton: true,
                confirmButtonColor: "#CC0E0E", 
                confirmButtonText: 'Si, eliminarlo',
                cancelButtonText: 'No, cancelar',
                reverseButtons: true
            }).then(function(result){
                if(result.value){

                    if (env != 'production')
                        console.log("WEBSERVICE [" + type + "]: \n" + path + "\nTOKEN [" + token + "]");

                    $.ajaxSetup({
                        headers: {
                            'X-Requested-With': 'XMLHttpRequest',
                            'Accept': 'application/json',
                            'X-Active-Warehouse' : $('meta[name="active-warehouse"]').attr('content'),
                            'X-CSRF-TOKEN': token
                        }
                      });

                    $.ajax({
                        type: type,
                        url: path,
                        dataType: 'json',
                        success:(data) => {
                            if(data.money_entry)
                                $('#money_entry').html(formatCurrency(data.money_entry));
                            resolve(data);      
                        },
                        error: (err) => { 
                            if(err.status == 422) {
                                ERPSystem.errInputs(err.responseJSON, err.message);
                            } else {
                                reject(err); 
                            }
                        }
                    });
                }
            });
       });
    },

    /** Para utilizar esta funciÃ³n, el name y el id del input deben ser iguales **/
    ajaxForm: ($form, params = false, path = false, type = false) => {
        return ajaxForm = new Promise((resolve, reject) => {
    
            let token   = $('meta[name="csrf-token"]').attr('content');
            if (!token)
                token   = $('input[name="_token"]').val();

            let active_warehouse   = $('meta[name="active-warehouse"]').attr('content');

            let _token  = { '_token': token, 'api' : true, 'active_warehouse' : active_warehouse };

            if (!params)
                params  = $form.serializeObject();
            
            $.extend( true, params, _token );

            if (!path)
                path    = $form.attr('action');
            else
                path    = $('meta[name="api"]').attr('content') + path;

            if (!type)
                type    = $form.attr('method');
                        
            if (env != 'production')
                console.log("WEBSERVICE [" + type + "]: \n" + path + "\nTOKEN [" + token + "] \n" + JSON.stringify(params, null, 2));

            $.ajaxSetup({
                headers: {
                    'X-Requested-With': 'XMLHttpRequest',
                    'Accept': 'application/json',
                    'X-Active-Warehouse' : $('meta[name="active-warehouse"]').attr('content'),
                    'X-CSRF-TOKEN': token
                }
            });

            $.ajax({
                type: type,
                url: path,
                dataType: 'json',
                data: params,
                success:(response) => {
                    if ($form) {
                        let elements = $form.find('.is-invalid');
                        $.each( elements, function( key, value ) { 
                            if(value.id != ""){
                                $ele = $("#"+value.id);
                                $ele.removeClass('is-invalid');
                                $ele.parent().find('.invalid-feedback').remove();
                                $ele.addClass('is-valid');
                            }
                        });
                    }

                    resolve(response);      
                },
                error: (response) => {
                    
                    if(response.status == 422 || response.status == 429) {                        
                        ERPSystem.errInputs(response.responseJSON, response.message);

                    } else if(response.status == 404) {
                        let responseJSON = response.responseJSON;

                        if(jsonResponse.hasOwnProperty('message')){
                            ERPSystem.reportError(jsonResponse.message);
                        } else if(jsonResponse.hasOwnProperty('msg')){
                            ERPSystem.reportError(responseJSON.msg);
                        } else {
                            ERPSystem.reportError('No se encuentra el ID');
                        }
                    
                    } else if(response.status == 419) {

                         $.notify({ message: 'Tu sesión ha terminado.' },{ type: 'danger' });
                         setTimeout(function () { window.location.href = '/login'; }, 1001);

                    } else {
                        reject(response);
                    }
                },
                beforeSend: function(){
                    KTApp.blockPage(ktblock);
                    if ($form)
                        $form.find(':submit').addClass('kt-spinner kt-spinner--right kt-spinner--md kt-spinner--light').attr('disabled', true);
                },
                complete: function(response){
                    if ($form)
                        $form.find(':submit').removeClass('kt-spinner kt-spinner--right kt-spinner--md kt-spinner--light').attr('disabled', false);
                    setTimeout(function () { KTApp.unblockPage(); }, 2000);
               }
            });
       });
    },

    /** Notificaciones */
    checkNotifications: () => {
        ERPSystem.getPetition('/api/user/check-notifications', {}).then(notifications => { 
            if (env != 'production')
                console.log({notifications});
            if(notifications.count > 0){
                // $('.new-notifications').html(notifications.count + ' nuevas');
                $('.btn-notifications').addClass('pulse pulse-danger');   
            }
        }, err => { 
            console.log('error:', err);
            ERPSystem.reportError(err.msg);
        });   
    },

    triggerResponse(response){
        if (!response.error){

            if (env != 'production')
                console.table(response);
            
            if(response.message)
                toastr.success(response.message);

            if(response.msg)
                toastr.success(response.msg);

            if(response.reload){
                setTimeout(function () { location.reload(); }, 1001);
            } else if(response.redirect) {
                window.location.href = response.redirect;
            }
            if(response.datatable){
                $(response.datatable).DataTable().ajax.reload();
            }
            if(response.modal)
            {
                $.each( $('#form-' + response.modal +' :input'), function( key, input ) {

                    $ele = $('#form-' + response.modal +' :input[name="' + input.name + '"]');

                    if($ele.length){
                        let t = $ele.attr('type');
                        if(t == 'text' || t == 'hidden' || t == 'number') {
                            $ele.val('');
                        }else if($ele[0].localName == "select"){
                            $('#' + $ele[0].id).val(null).trigger('change'); 
                        }else if($ele[0].localName == "textarea"){
                            $ele.html('');
                        }else if(t == 'radio') {
                            $ele.prop('checked', false);
                        }
                    }
                });

                $('#modal-' + response.modal).modal('hide');

            }

            if(response._blank)
                window.open(response._blank, '_blank');
        }else{
            ERPSystem.reportError(response.message);
        }
    },
};


var ktblock = {
    overlayColor: 'red',
     opacity: 0.1,
     state: 'info' // a bootstrap color
};

$.fn.serializeObject = function()
{
    var o = {};
    var a = this.serializeArray();
    o['api'] = true;

    $.each(a, function() {
        if (o[this.name] !== undefined) {
            if (!o[this.name].push) {
                o[this.name] = [o[this.name]];
            }
            o[this.name].push(this.value || '');
        } else {
            o[this.name] = this.value || '';
        }
    });
    return o;
};

jQuery(document).ready(function () {

    $('.automatic-submit').submit(function( event ) {
        event.preventDefault();

        ERPSystem.ajaxForm($(this)).then(response => {
            if (!response.error){

                toastr.success(response.message);
                if(response.reload){
                    setTimeout(function () { location.reload(); }, 1001);
                } else if(response.redirect) {
                    window.location.href = response.redirect;
                }

                if(response._blank)
                    window.open(response._blank, '_blank');
                if(response.reload_ktdatable)
                    $(response.reload_ktdatable).KTDatatable('reload');
                if(response.reload_ktdatable_2)
                    $(response.reload_ktdatable_2).KTDatatable('reload');
                if(response.clean)
                    $(response.clean).val("");
                if(response.modal)
                {
                    $(response.modal).modal('hide');
                    clearForm($(this));
                }

            }else{
                
                ERPSystem.reportError(response.message);
            }
        }).catch((e) => {
            console.log('Error', e)
        });
    });

    $('.automatic-select').submit(function( event ) {
        event.preventDefault();

        ERPSystem.ajaxForm($(this)).then(response => {
            if (!response.error){

                toastr.success(response.message);

                if(response.reload){
                    setTimeout(function () { location.reload(); }, 1001);
                } else if(response.redirect) {
                    window.location.href = response.redirect;
                }

                if(response._blank)
                    window.open(response._blank, '_blank');
                if(response.reload_ktdatable)
                    $(response.reload_ktdatable).KTDatatable('reload');
                if(response.clean)
                    $(response.clean).val("");
                if(response.modal)
                {
                    $(response.modal).modal('hide');
                    clearForm($(this));
                }
                if(response.input_name){
                    console.log(response.items)
                    $('#'+response.input_name).selectpicker('destroy');
                    $('#'+response.input_name).html('');
                    $.each(response.items, function(index, ele) {
                       
                        if(ele.id == response.item_saved_id){
                            $('#'+response.input_name).append($('<option>', { 
                                value: ele.id,
                                text : ele.raw_text 
                            }).attr("selected",true));
                        }else{
                            $('#'+response.input_name).append($('<option>', { 
                                value: ele.id,
                                text : ele.raw_text 
                            }));
                        }
                    });
                    $('#'+response.input_name).selectpicker('refresh');
                }
                if(response.input)
                    $('#'+response.input.name).val(response.input.value);

            }else{
                ERPSystem.reportError(response.message);
            }
            
        }).catch((e) => {
            console.log('Error', e)
        });
    });

    $('.automatic-archive').submit(function(event)
    {
        event.preventDefault();
        let $form = $(this);
        let params = ERPUtils.getFormData($form);
        let modal_id = '#' + $form.attr('id');

        var formData = new FormData();
        $.each(params, function(key, value) {
            formData.append(key,value);
        });

        if($(modal_id +' #image').length)
            formData.append('image', $(modal_id +' #image')[0].files[0]);
        if( $(modal_id +' #archive').length)
            formData.append('archive', $(modal_id +' #archive')[0].files[0]);
        
        console.log(formData);

        ERPSystem.getPetitionFile($form.attr('action'), formData).then(response => {
            if (!response.error){
                console.log(response.message);
                toastr.success(response.message);

                if(response.modal)
                {
                    $(response.modal).modal('hide');
                    clearForm($(this));
                }
                if(response.items){
                    $('#archive_id').empty();
                    response.items.forEach(item => {
                        $('#archive_id').append($('<option>', { 
                            value: item.id,
                            text : item.key 
                        }));
                    });
                    console.log(response.data.id);
                    $("#archive_id").val(response.data.id);
                    $("#archive_id").selectpicker("refresh");
                }
                

            }else{
                ERPSystem.reportError(response.message);
            }
        }).catch((e) => {
            console.log('Error', e)
        });
    });

    $('body').on('click', '.btn-get', function ()
    {
        let $btn  = $(this);
        let path  = $btn.data('url');
        let title  = ($btn.data('title')) ? $btn.data('title') : '¿Desea procesar este registro?';
        let method  = ($btn.data('method')) ? $btn.data('method') : 'GET';

        if(!path)
            toastr.error('No se ha seleccioando una ruta');

        swal.fire({
            title: title,
            type: 'warning',
            showCancelButton: true,
            confirmButtonColor: "#2CA329", 
            confirmButtonText: 'Si',
            cancelButtonText: 'No',
            reverseButtons: true
        }).then(function(result){
            if(result.value){

                ERPSystem.getPetition(path, {}, method).then(response => { 
                    
                    if(!response.error){
                    
                        toastr.success(response.message);

                        if(response.remove_btn)
                            $btn.remove();

                        if(response.redirect)
                            window.location.href = response.redirect;
                        if(response.reload)
                            setTimeout(function () { location.reload(); }, 1001);
                        if(response._blank)
                            window.open(response._blank, '_blank');
                        if(response.reload_ktdatable)
                            $(response.reload_ktdatable).KTDatatable('reload');

                    }else{
                        ERPSystem.reportError(message);
                    }
                }, err => { 
                    console.log('error:', err);
                    toastr.error(err.msg);
                });   
            }
        });
    });

    $('body').on('click', '.btn-edit', function (){
        let $btn  = $(this);
        let path  = $btn.data('url');
        if(!path)
            return toastr.error('No se ha seleccioando una ruta');

        ERPSystem.getPetition(path, {}, 'GET').then(response => { 
            
            if(!response.error){
            
                toastr.success(response.message);

                if(response.modal){
                    $('#'+response.record).val(response.data.id);
                    $.each( response.data, function( key, value ) {
                        $ele = $('#form-' + response.modal +' :input[name="' + key + '"]');
                        if($ele.length){
                            let t = $ele.attr('type');
                            if(t == 'text' || t == 'hidden' || t == 'number' || t == 'date') {
                                $ele.val(value);   
                            }else if(t == 'datetime-local'){
                                if (value != null) {
                                    var date = new Date(value);
                                    var year = date.getFullYear();
                                    var month = (date.getMonth() + 1).toString().padStart(2, '0');
                                    var day = date.getDate().toString().padStart(2, '0');
                                    var hours = date.getHours().toString().padStart(2, '0');
                                    var minutes = date.getMinutes().toString().padStart(2, '0');
                                    var dateFormat = `${year}-${month}-${day}T${hours}:${minutes}`;
                                }
                                $ele.val(dateFormat);
                            }else if($ele[0].localName == "select"){
                                $ele.val(value);   
                                $ele.selectpicker("refresh");
                            }else if(t == 'radio' || t == 'checkbox') {
                                $ele.filter('[value="' + value + '"]').prop('checked', true);
                            }
                        }
                    });
                    if (response.hide) {
                        $('#'+response.hide).hide();
                    }
                    if (response.show) {
                        $('#'+response.show).show();
                    }
                    $('#modal-'+response.modal).modal('show');
                }

            }else{
                ERPSystem.reportError(message);    
            }
        }, err => { 
            console.log('error:', err);
            toastr.error(err.msg);
        });   
    });

    $('body').on('click', '.btn-del', function (){

        let model = $(this).parent().data('model');
        let id = $(this).parent().data('id');
        let code = $(this).parent().data('code');
        let type = $(this).parent().data('type');

        let url = false;
        if(id){
            url  = '/'+model+'/'+id;
        }else if(code){
            url  = '/'+model+'/'+code;
        }

        if(!url)
            return toastr.error('No se ha seleccionado una ruta');

        swal.fire({
            title: '¿Desea eliminar este registro?',
            type: 'warning',
            showCancelButton: true,
            confirmButtonColor: "#CC0D0D", 
            confirmButtonText: 'Si',
            cancelButtonText: 'No',
            reverseButtons: true
        }).then(function(result){
            if(result.value){

                ERPSystem.getPetition(window.location.origin + '/api' 
                    + url, {'id': id, 'model' : model, 'type' : type}, 'DELETE').then(response => { 
                    
                    if(!response.error){
                    
                        toastr.success(response.message);

                        if(response.redirect)
                            window.location.href = response.redirect;
                        if(response.reload)
                            setTimeout(function () { location.reload(); }, 1001);
                        if(response._blank)
                            window.open(response._blank, '_blank');
                        if(response.reload_ktdatable)
                            $(response.reload_ktdatable).KTDatatable('reload');
                        if(response.modal)
                            if($('#'+response.modal).length)
                                $('#'+response.modal).modal('hide');
                        if(response.remove)
                            $('#'+response.remove).remove();
                        
                        if($('#settlement').length && response.data.shift_id)
                            SettlementFunctions.getSettlement(response.data.shift_id);
                    }else{
                        ERPSystem.reportError(response.message);
                    }
                }, err => { 
                    if(err.status == 404) {

                        if(!err.responseJSON.msg)
                            $.notify({ message: 'No se encuentra disponible en este momento.' },{ type: 'danger' });
                        else
                            $.notify({ message: err.responseJSON.msg },{ type: 'danger' });
                    }else{
                        toastr.error(err.msg);
                    }
                });
            }
        });
    });

    $('body').on('click', '.btn-delete', function (){

        let path = $(this).data('url');

        if(!path || path == '//')
            toastr.error('No se ha seleccionado una ruta');

        swal.fire({
            title: '¿Desea eliminar este registro?',
            type: 'danger',
            showCancelButton: true,
            confirmButtonColor: "#CC0D0D", 
            confirmButtonText: 'Si',
            cancelButtonText: 'No',
            reverseButtons: true
        }).then(function(result){
            if(result.value){

                ERPSystem.getPetition(path, {}, 'DELETE').then(response => { 
                    
                    if(!response.error){
                    
                        toastr.success(response.message);

                        if(response.redirect)
                            window.location.href = response.redirect;
                        if(response.reload)
                            setTimeout(function () { location.reload(); }, 1001);
                        if(response._blank)
                            window.open(response._blank, '_blank');
                        if(response.reload_ktdatable)
                            $(response.reload_ktdatable).KTDatatable('reload');
                        if(response.modal)
                            $('#'+response.modal).modal('hide');
                        if(response.remove)
                            $('#'+response.remove).remove();
                    }else{
                        ERPSystem.reportError(response.message);    
                    }
                }, err => { 
                    if(err.status == 404) {

                        if(!err.responseJSON.msg)
                            $.notify({ message: 'No se encuentra disponible en este momento.' },{ type: 'danger' });
                        else
                            $.notify({ message: err.responseJSON.msg },{ type: 'danger' });
                    }else{
                        toastr.error(err.msg);
                    }
                });
            }
        });
    });

    $('body').on('click', '#btn-update-superadmin', function (){

        let path = $(this).data('url');

        if(!path || path == '//')
            return toastr.error('No se ha seleccionado una ruta');

        swal.fire({
            title: '¿Desea actualizar superadmin?',
            type: 'danger',
            showCancelButton: true,
            confirmButtonColor: "#33A9C2", 
            confirmButtonText: 'Si',
            cancelButtonText: 'No',
            reverseButtons: true
        }).then(function(result){
            if(result.value){

                ERPSystem.getPetition(path, {}, 'POST').then(response => { 
                    
                    if(!response.error){
                    
                        toastr.success(response.message);

                        if(response.redirect)
                            window.location.href = response.redirect;
                        if(response.reload)
                            setTimeout(function () { location.reload(); }, 1001);
                        if(response._blank)
                            window.open(response._blank, '_blank');
                        if(response.reload_ktdatable)
                            $(response.reload_ktdatable).KTDatatable('reload');
                        if(response.modal)
                            $('#'+response.modal).modal('hide');
                        if(response.remove)
                            $('#'+response.remove).remove();
                    }else{
                        ERPSystem.reportError(response.message);    
                    }
                }, err => { 
                    if(err.status == 404) {

                        if(!err.responseJSON.msg)
                            $.notify({ message: 'No se encuentra disponible en este momento.' },{ type: 'danger' });
                        else
                            $.notify({ message: err.responseJSON.msg },{ type: 'danger' });
                    }else{
                        toastr.error(err.msg);
                    }
                });
            }
        });
    });

    function clearForm ($form)
    {
        $form[0].reset();
        $('input[type=file]').val();
        $('.selectpicker').selectpicker('refresh');
    }

    function getStrAfterChar(str, char = '=') {
        return str.split(char)[1];
    }

    $('body').on('click', '#btn-datatable_export, .btn-excel', function (){

        let url = $(this).data('url');

        if (url == '')
            return toastr.error('Falta la url para obtener el archivo.');
            
        let payment_method = [];
        $('input[name="kt_datatable_search_payment_method"]:checked').each(function(key, ele) {
            payment_method.push(ele.value);
        });
        let sale_point_types = [];
        $('input[name="kt_datatable_search_sale_point_types"]:checked').each(function(key, ele) {
            sale_point_types.push(ele.value);
        })

        let data = {
            'search' : $('#kt_datatable_search_query').val(), 
            'client_id' : $('#kt_datatable_search_client').val(), 
            'supplier_id' : $('#kt_datatable_search_supplier').val(),
            'status_id' : $('#kt_datatable_search_status').val(),
            'project_id' : $('#kt_datatable_search_project').val(),
            'priority_id' : $('#kt_datatable_search_priority').val(),
            'warehouses' : $('#kt_datatable_search_warehouses').val(), 
            'filter' : $('input[type=radio][name=kt_datatable_filter]:checked').val(),
            'billed' : $('input[type=radio][name=kt_datatable_billed]:checked').val(),
            'date_range' : $('#kt_datatable_search_date_range').val(),
            'amount': $('#kt_datatable_search_amount').val(),
            'movement': $('#kt_datatable_search_movement').val(),
            'reference': $('#kt_datatable_search_reference').val(),
            'branch_no': $('#kt_datatable_search_branch_no').val(),
            'transaction_type_id': $('#kt_datatable_search_transaction_type_id').val(),
            'checkboxNotReconciled': $('#checkboxNotReconciled').is(':checked') ? 'checked' : 'unchecked',
            'year' : $('#kt_datatable_search_year').val(),
            'sale_point_id' : $('#kt_datatable_search_sale_point_id').val(),
            'number_pva' : $('#kt_datatable_search_number').val(),
            'type_pva' : $('#kt_datatable_search_type').val(),
            'active_pva' : $('#kt_datatable_search_active').val(),
            query: {
                'date_range' : $('#kt_datatable_search_date_range').val(),
                'payment_method' : payment_method,
                'sale_point_types' : sale_point_types
            }
        };

        let token   = $('meta[name="csrf-token"]').attr('content');

        if (env != 'production')
            console.log("WEBSERVICE [EXPORT]: \n" + url + "\nTOKEN [" + token + "] \n" + JSON.stringify(data, null, 2));

        $.ajaxSetup({
            headers: {
                'X-Requested-With': 'XMLHttpRequest',
                'Accept': 'application/json',
                'X-Active-Warehouse' : $('meta[name="active-warehouse"]').attr('content'),
                'X-CSRF-TOKEN': token
            }
        });

        $.ajax({
            xhrFields: {
                responseType: 'blob',
            },
            type: 'POST',
            url: url,
            data: data,
            success: function(result, status, xhr) {

                let dt = new Date();
                let currentime = dt.getFullYear() + (dt.getMonth()+1) + dt.getDate() + dt.getHours() + dt.getMinutes() + dt.getSeconds();

                let disposition = xhr.getResponseHeader('content-disposition');
                let docName = getStrAfterChar(disposition);
                let validFileName = /^[^*&%\s]+\.(xls|xlsx)$/;
                let filename = (docName.match(validFileName) ? docName : currentime + '.xlsx');

                // download
                let blob = new Blob([result], {
                    type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
                });
                let link = document.createElement('a');
                link.href = window.URL.createObjectURL(blob);
                link.download = filename;

                document.body.appendChild(link);

                link.click();
                document.body.removeChild(link);
            },
            error: (response) => {        
                $.notify({ message: 'Ha ocurrido un error al crear el reporte.' },{ type: 'danger' });
            },
            beforeSend: function(){
                KTApp.blockPage(ktblock);
            },
            complete: function(){
                setTimeout(function () { KTApp.unblockPage(); }, 2000);
           }
        });
    });
    
    $('body').on('click', '.btn-pdf', function (){

        let url = $(this).data('url');
        let name = $(this).data('name');

        if (url == '')
            return toastr.error('Falta la url para obtener el archivo.');

        let token   = $('meta[name="csrf-token"]').attr('content');

        $.ajaxSetup({
            headers: {
                'X-Requested-With': 'XMLHttpRequest',
                'Accept': 'application/pdf',
                'X-CSRF-TOKEN': token
            }
        });

        $.ajax({
            xhrFields: {
                responseType: 'blob',
            },
            type: 'GET',
            url: url,
            success: function(result, status, xhr) {

                let dt = new Date();
                let currentime = dt.getFullYear().toString() + (dt.getMonth()+1).toString() + dt.getDate().toString() + dt.getHours().toString() + dt.getMinutes().toString() + dt.getSeconds().toString();
                let filename = name + '_' + currentime + '.pdf';

                // download
                let blob = new Blob([result], {
                    type: 'application/pdf'
                });
                
                let link = document.createElement('a');
                link.href = window.URL.createObjectURL(blob);
                link.download = filename;

                document.body.appendChild(link);

                link.click();
                document.body.removeChild(link);
            },
            error: (response) => {        
                $.notify({ message: 'Ha ocurrido un error al crear el archivo PDF.' },{ type: 'danger' });
            },
            beforeSend: function(){
                KTApp.blockPage(ktblock);
            },
            complete: function(){
                setTimeout(function () { KTApp.unblockPage(); }, 2000);
           }
        });
    });

    $('body').on('click', '.btn-export-pdf', function(){
        let url = $(this).data('url');
        let id = $(this).data('id');
        ERPSystem.getPetition(url, {id: id}).then(response => {
            if (!response.error){
                var byteCharacters = atob(response.data);
                var byteNumbers = new Array(byteCharacters.length);
                for (var i = 0; i < byteCharacters.length; i++) {
                    byteNumbers[i] = byteCharacters.charCodeAt(i);
                }
                var byteArray = new Uint8Array(byteNumbers);
                var blob = new Blob([byteArray], { type: 'application/pdf' });
                
                // Generar la URL del Blob
                var blobUrl = URL.createObjectURL(blob);
                
                // Abrir el PDF en una nueva ventana
                window.open(blobUrl, '_blank');
            } else{
                toastr.error(response.msg);
            }
        }, err => { 
            console.log({err});
            toastr.error(err.msg);
        });
      });

    $('body').on('click', '.btn-close_session', function (){
        event.preventDefault(); document.getElementById('logout-form').submit();
    });
    
    if($('.select2').length) {
        $('.select2').select2({
            placeholder: 'Seleccionar...',
        });
    }

    // Initialice
    if($('.kt-datepicker').length){
        $.fn.datepicker.dates['es'] = {
            days: ["Domingo", "Lunes", "Martes", "MiÃ©rcoles", "Jueves", "Viernes", "SÃ¡bado"],
            daysShort: ["Dom", "Lun", "Mar", "Mie", "Jue", "Vie", "Sab"],
            daysMin: ["Do", "Lu", "Ma", "Mi", "Ju", "Vi", "Sa"],
            months: ["Enero", "Febrero", "Marzo", "Abril", "Mayo", "Junio", "Julio", "Agosto", "Septiembre", "Octubre", "Noviembre", "Diciembre"],
            monthsShort: ["Ene", "Feb", "Mar", "Abr", "May", "Jun", "Jul", "Ago", "Sep", "Oct", "Nov", "Dic"],
            today: "Hoy",
            clear: "Limpiar",
            format: "mm/dd/yyyy",
            titleFormat: "MM yyyy", /* Leverages same syntax as 'format' */
            weekStart: 0
        };

        $('.kt-datepicker').datepicker({
            todayHighlight: true,
            format: 'dd/mm/yyyy',
            language: 'es',
            orientation: 'bottom left',
            templates: {
               leftArrow: '<i class="la la-angle-left"></i>',
               rightArrow: '<i class="la la-angle-right"></i>'
              }
        });
    }

    if($('.kt-daterangepicker').length){
        moment.locale('es');
        let init_date = ($('#init_date').length) ? $('#init_date').val() : null;
        let end_date = ($('#end_date').length) ? $('#end_date').val() : null;
        let start = (init_date) ? init_date : moment().subtract(30, 'days').format('L');
        let end = (end_date) ? end_date : moment().format('L');

        $('.kt-daterangepicker').daterangepicker({
            todayHighlight: true,
            autoApply: true,
            minYear: 2023,
            maxYear: 2024,
            startDate: start,
            endDate: end,
            locale: {
                language: 'es',
                format: 'DD/MM/YYYY'
            },
            buttonClasses: ' btn',
            applyClass: 'btn-primary',
            cancelClass: 'btn-secondary',
        });

        $('.cancelBtn').html('Cancelar');
        $('.applyBtn').html('Aplicar');
    }

    if($('.kt-daterangepicker-no-auto-date').length){
        moment.locale('es');
        let init_date = ($('#init_date').length) ? $('#init_date').val() : null;
        let start = (init_date) ? init_date : moment().subtract(30, 'days').format('L');
        let end = moment().format('L');

        $('.kt-daterangepicker-no-auto-date').daterangepicker({
            todayHighlight: true,
            autoApply: true,
            minYear: 2023,
            maxYear: 2024,
            locale: {
                language: 'es',
                format: 'DD/MM/YYYY'
            },
            buttonClasses: ' btn',
            applyClass: 'btn-primary',
            cancelClass: 'btn-secondary',
        });

        $('.cancelBtn').html('Cancelar');
        $('.applyBtn').html('Aplicar');
    }


    if($('.daterange-picker').length){
        moment.locale('es');
        let date = $(this).val();
        let start = moment().startOf('month').format('L');
        let end = moment().format('L');
        // console.log('start', start);
        // console.log('end', end);

        $('.daterange-picker').daterangepicker({
            todayHighlight: true,
            autoApply: true,
            minYear: 2023,
            maxYear: 2024,
            startDate: start,
            endDate: end,
            locale: {
                language: 'es',
                format: 'DD/MM/YYYY'
            },
            buttonClasses: ' btn',
            applyClass: 'btn-primary',
            cancelClass: 'btn-secondary',
        });

        $('.cancelBtn').html('Cancelar');
        $('.applyBtn').html('Aplicar');
    }

    if($('.kt-timepicker').length)
        $('.kt-timepicker').timepicker({
            minuteStep: 1,
            defaultTime: '',
            showSeconds: false,
            showMeridian: false,
            snapToStep: true
        });

    $('body').on('click', '.btn-notifications', function (){
        ERPSystem.getPetition('/api/user/get-notifications', {}).then(response => { 
            console.log({response});
            let notifications = ''; 
            
            $.each( response.notifications, function( key, notification ) {
                let data = notification.data;
                let title = (data.subject) ? data.subject : data.greeting;
                console.log('notification', data.greeting);
                notifications += `<a href="${data.url}" class="navi-item btn btn-link text-left btn-block read-notification" data-id="${notification.id}">
                    <div class="navi-link" >
                        <div class="navi-text">
                            <div class="font-weight-bold">
                                ${title}
                            </div>
                            <div class="text-muted">
                                ${ERPUtils.formatGSDateTime(notification.updated_at)}
                            </div>
                        </div>
                    </div>
                </a>`;
            });
            
            if($('#notifications-list').length)
                $('#notifications-list').html(notifications);

            let logs = ''; 
            $.each( response.logs, function( key, log ) {
                logs += `<a href="" class="navi-item btn btn-link text-left btn-block read-log" data-id="${log.id}">
                    <div class="navi-link " >
                        <div class="navi-text">
                            <div class="font-weight-bold">
                                ${log.comment}
                            </div>
                            <div class="text-muted">
                                ${ERPUtils.formatGSDateTime(log.created_at)}
                            </div>
                        </div>
                    </div>
                </a>`;
            });

            if($('#logs-list').length)
                $('#logs-list').html(logs);

        }, err => { 
            console.log('error:', err);
            toastr.error(err.msg);
        });   
    });

    $('body').on('click', '.see-text', function (){
        
        let password = ($(this).siblings('input[type="password"]').length) ? $(this).siblings('input[type="password"]')[0] : false;
        let icon = ($(this).find("span > i").length) ? $(this).find("span > i")[0] : false;

        if(password && icon){    
            if(icon.classList.contains('fa-eye-slash')){
                password.type = 'text';
                icon.classList.remove('fa-eye-slash');
                icon.classList.add('fa-eye');
            }else{
                password.type = 'password';
                icon.classList.remove('fa-eye');
                icon.classList.add('fa-eye-slash');
            }   
        }
    });

    //Set #id #model #type obteniendo valores de list js
    $('body').on('click', '.btn-set-data', function (){
        let $btn  = $(this);
        let model = $btn.parent().data('model');
        let id = $btn.parent().data('id');
        let type = $btn.parent().data('type');
    
        $('#id').val(id);
        $('#model').val(model);
        $('#type').val(type);
    
      });
});

jQuery.fn.display = function(show = true) {
    if(show){
        if(this.hasClass('d-none'))
            this.removeClass('d-none');
    } else { 
        if(!this.hasClass('d-none'))
            this.addClass('d-none');
    }
}