   /* global loader, dataRequest */

   let tableCursos

   const helpers = {
      tblCursosCharge() {
         tableCursos.destroy()
         initComponents.listarCursos()
      },
      tblCursosRefresh() {
         tableCursos.ajax.reload();
      }
   }

   const httpRequest = {
      listarCurso(json) {
         return new Promise((resolve, reject) => {
            $.ajax({
               type: 'POST',
               url: "../CursoServlet?accion=listarCurso",
               dataType: "json",
               data: {
                  json: JSON.stringify(json)
               },
               success: function (data, textStatus, jqXHR) {
                  resolve(data)
               }, error: function (jqXHR, textStatus, errorThrown) {
                  reject('Error en la petición')
               }
            })
         })
      },
      listarNivel() {
         return new Promise((resolve, reject) => {
            $.ajax({
               type: 'POST',
               url: "../UsuarioServlet?accion=listarNivel",
               dataType: "json",
               success: function (data, textStatus, jqXHR) {
                  resolve(data)
               }, error: function (jqXHR, textStatus, errorThrown) {
                  reject('Error en la petición')
               }
            })
         })
      },
      listarGrado(json) {
         return new Promise((resolve, reject) => {
            $.ajax({
               type: 'POST',
               url: "../UsuarioServlet?accion=listarGrado",
               dataType: "json",
               data: {
                  json: JSON.stringify(json)
               },
               success: function (data, textStatus, jqXHR) {
                  resolve(data)
               }, error: function (jqXHR, textStatus, errorThrown) {
                  reject('Error en la petición')
               }
            })
         })
      },
      eliminarCurso(json) {
         return new Promise((resolve, reject) => {
            $.ajax({
               type: 'POST',
               url: "../CursoServlet?accion=eliminarCurso",
               dataType: "json",
               data: {
                  json: JSON.stringify(json)
               },
               success: function (data, textStatus, jqXHR) {
                  resolve(data)
               }, error: function (jqXHR, textStatus, errorThrown) {
                  reject('Error en la petición')
               }
            })
         })
      },
      asignarCurso(json) {
         return new Promise((resolve, reject) => {
            $.ajax({
               type: 'POST',
               url: "../CursoServlet?accion=asignarCurso",
               dataType: "json",
               data: {
                  json: JSON.stringify(json)
               },
               success: function (data, textStatus, jqXHR) {
                  resolve(data)
               }, error: function (jqXHR, textStatus, errorThrown) {
                  reject('Error en la petición')
               }
            })
         })
      }
   }

   const DOMEvents = {
      checkSelects() {
         $('#cboNivel').change(() => {
            var cboNivel = $('#cboNivel').val()
            if (cboNivel !== '') {
               if (cboNivel !== '3') {
                  $('#cboGrado').attr('disabled', false)
                  initRequest.cargarGrado()
               } else {
                  $("#cboGrado").attr('disabled', true)
                  $('#cboGrado').html('<option value="3" selected=true>Academias</option>')
                  $("#cboGrado").change()
               }
            } else {
               $("#cboGrado").attr('disabled', true)
               $('#cboGrado').val('')
            }
         })
         $('#cboGrado').change(() => {
            var cboGrado = $('#cboGrado').val()
            if (cboGrado !== '') {
               $('#cboCurso').attr('disabled', false)
               initRequest.cargarCurso()
            } else {
               $("#cboCurso").attr('disabled', true)
               $('#cboCurso').val('')
            }
         })
      },
      tblCursosEliminar() {
         $('#tblCursos tbody').on('click', '.eliminar', (e) => {
            let thisNode = e.currentTarget;
            var data = tableCursos.row($(thisNode).parents('tr')).data();
            console.log(data);
            msnConfirm('¿Está seguro de eliminar este curso?', (option) => {
               if (option) {
                  httpRequest.eliminarCurso(data)
                          .then((data) => {
                             if (data.status) {
                                helpers.tblCursosRefresh()
                                msnSuccess("Curso correctamente eliminado")
                             } else {
                                if ((data.message).includes('--->')) {
                                   msnError("Ha ocurrido un error")
                                } else {
                                   msnError(data.message)
                                }
                             }
                          })
                          .catch(err => console.log(err))
               }
            })
         })
      },
      registrarCurso() {
         $('#btnRegistrar').click(() => {
            var valRegCurso = $("#frmBusqRequ").validate({
               rules: {
                  cboNivel: {required: true},
                  cboGrado: {required: true},
                  cboCurso: {required: true}
               },
               messages: {
                  cboNivel: {required: "<b>&times;</b>&nbsp;Este campo es requerido"},
                  cboGrado: {required: "<b>&times;</b>&nbsp;Este campo es requerido"},
                  cboCurso: {required: "<b>&times;</b>&nbsp;Este campo es requerido"}
               }
            });
            if (valRegCurso.form()) {
               let json = {
                  codigoUsuario: dataRequest.codigoUsuario,
                  codigoGrado: $('#cboGrado').val(),
                  codigoCurso: $('#cboCurso').val()
               }
               httpRequest.asignarCurso(json)
                       .then((data) => {
                          if (data.status) {
                             helpers.tblCursosRefresh()
                             msnSuccess("Curso(s) correctamente agregado(s)")
                          } else {
                             if ((data.message).includes('--->')) {
                                msnError("Ha ocurrido un error")
                             } else {
                                msnError(data.message)
                             }
                          }
                       })
                       .catch(err => console.log(err))
               console.log("Todo chevere");
            }
         })
      },
      limpiarRegistro() {
         $('#btnLimpiar').click(() => {
            $('#cboNivel').val('')
            $('#cboGrado').val('')
            $('#cboCurso').val('')
         })
      }
   }

   const initRequest = {
      cargarNivel() {
         httpRequest.listarNivel()
                 .then((data) => {
                    if (data.status) {
                       var print = " <option value=''>[SELECCIONE]</option> "
                       var lista = data.results
                       for (var i in lista) {
                          print += " <option value ='" + lista[i].codigoNivel + "' " + "" + ">" + lista[i].nombreNivel + "</option> "
                       }
                       $("#cboNivel").html(print)
                    } else {
                       var print = " <option  value=''>No hay contenido</option> "
                       $("#cboNivel").html(print)
                    }
                 })
                 .catch(err => console.log(err))
      },
      cargarGrado() {
         let json = {
            parent: $("#cboNivel").val()
         }
         httpRequest.listarGrado(json)
                 .then((data) => {
                    if (data.status) {
                       var print = " <option value=''>[SELECCIONE]</option> "
                       var lista = data.results
                       for (var i in lista) {
                          print += " <option value ='" + lista[i].codigoGrado + "' " + "" + ">" + lista[i].nombreGrado + "</option> "
                       }
                       $("#cboGrado").html(print)
                    } else {
                       var print = " <option  value=''>No hay contenido</option> "
                       $("#cboGrado").html(print)
                    }
                 })
                 .catch(err => console.log(err))
      },
      cargarCurso() {
         let json = {
            parent: $("#cboGrado").val()
         }
         httpRequest.listarCurso(json)
                 .then((data) => {
                    if (data.status) {
                       var print = " <option value=''>[SELECCIONE]</option> "
                       print += " <option  value='0' class='text-semibold'>TODOS</option> "
                       var lista = data.results
                       for (var i in lista) {
                          print += " <option value ='" + lista[i].codigoCurso + "' " + "" + ">" + lista[i].nombreCurso + "</option> "
                       }
                       $("#cboCurso").html(print)
                    } else {
                       var print = " <option  value=''>No hay contenido</option> "
                       $("#cboCurso").html(print)
                    }
                 })
                 .catch(err => console.log(err))
      }
   }

   const initComponents = {
      listarCursos() {
         json = {
            codigoUsuario: dataRequest.codigoUsuario
         }
         tableCursos = $("#tblCursos").DataTable({
            "language": {
               "lengthMenu": "Mostrar: _MENU_",
               "zeroRecords": "&nbsp;&nbsp;&nbsp; No se encontraron resultados",
               "info": "&nbsp;&nbsp;&nbsp; Mostrando del _START_ al _END_ de un total de _TOTAL_ registros",
               "infoEmpty": "&nbsp;&nbsp;&nbsp; Mostrando 0 de 0 registros",
               "search": "Filtrar:",
               "loadingRecords": "Cargando...",
               "processing": '<span style="width:100%;"><img src="http://www.snacklocal.com/images/ajaxload.gif"></span>',
               "paginate": {
                  "first": "First",
                  "last": "Last",
                  "next": "Siguiente",
                  "previous": "Anterior"
               }
            },
            dom: '<"datatable-scroll"t> < "datatable-footers"ip > ',
            "ajax": {
               type: 'POST',
               url: "../CursoServlet?accion=listarCursos",
               data: {
                  json: JSON.stringify(json)
               }
            },
            "bSort": false,
            "bFilter": false,
            "serverSide": true,
            "processing": true,
            "aaSorting": [],
            "ordering": false,
            "bLengthChange": false,
            "bInfo": true,
            "paging": true,
            "iDisplayLength": 20,
            "columnDefs": [
               {targets: 0, orderable: false, width: "5%", className: "text-center"},
               {targets: 1, orderable: false, width: "15%", className: "text-center"},
               {targets: 2, orderable: false, width: "15%", className: "text-center"},
               {targets: 3, orderable: false, width: "7%", className: "text-center"}
            ],
            "columns": [
               {"data": "numeral"},
               {"data": "nombreGrado", "render": (data, type, row) => {
                     return capitalizeWords(data);
                  }
               },
               {"data": "nombreCurso", "render": (data, type, row) => {
                     return capitalizeWords(data)
                  }
               },
               {"data": null, "render": (data, type, row) => {
                     var actions = "";
                     actions += `<span data-toggle="tooltip" data-placement="left" title="Eliminar" style="cursor: pointer"> <i class='eliminar glyphicon glyphicon-trash text-danger-700'></i></span>`
                     return actions;
                  }
               }
            ],
            fnDrawCallback: () => {
               loader.terminarLoader();
            }
         });
      }
   }

   initialize = () => {
      initComponents.listarCursos()
      initRequest.cargarNivel()
      DOMEvents.checkSelects()
      DOMEvents.tblCursosEliminar()
      DOMEvents.registrarCurso()
      DOMEvents.limpiarRegistro()
   }

   initialize()