const { 
    id_cliente, id_producto, cantidad, numero_documento, telefono, nombre_completo, hora_inicio, hora_fin, guaje,
    id, idClienteDB, total_fake, dinero_entregado, devuelta, tipo_venta, id_mecanico, placa, tipo_pago, precio
} = document.datos;

const lavado = 1;
const producto = 2;
const servicio = 3;

const formatter = (n, d = 2) => new Intl.NumberFormat('es-MX').format(n);

function actualizarInforme() {
    $('#informeCompra').html(PCO_ObtenerContenidoAjax(0, 'index.php',
        'Presentar_FullScreen=1&Precarga_EstilosBS=0&PCO_Accion=PCO_CargarObjeto&PCO_Objeto=inf:11:0&id=' + id.value)
    );
}

function cargarDatosFE(resp) {
    const { total, iva } = resp;
    total_fake.value = formatter(total).replace('$','');
    // iva_fake.value = formatter(iva).replace('$','');
    /* if(!id.value && resp.id)
        id.value = resp.id; */
    actualizarInforme();
}

function calcularTiempo() {
    const horaInicio = $('#hora_inicio').val();
    const horaFin = $('#hora_fin').val();
    if (!horaInicio || !horaFin) return;
    const hiMom = moment(horaInicio, "hh:mm:ss");
    const hfMom = moment(horaFin, "hh:mm:ss");
    const duration = moment.duration(hfMom.diff(hiMom));
    const minutes = duration.asHours() || 0;
    $('#cantidad').val((minutes).toFixed(2));
}

function consultarTotalVenta() {
    const resp = JSON.parse(PCO_ObtenerContenidoAjax(0,
        'index.php', 'Presentar_FullScreen=1&Precarga_EstilosBS=0&PCO_Accion=VENTA_consultarTotalVenta' +
            '&id=' + id.value
        )
    );
    if(resp.success) {
        cargarDatosFE(resp);
    }
    else {
        PCOJS_MostrarMensaje("Aviso del sistema", resp.msg);
    }    
}

function FrmAutoRun()
    {
        document.title = "Realizar venta";
        $('#PCOContenedor_id_mecanico').hide();
        $('#PCOContenedor_hora_inicio').hide();
        $('#PCOContenedor_hora_fin').hide();
        $('#PCOContenedor_guaje').hide();
        $('#PCOContenedor_factura_pagada').hide();
        $('#PCOContenedor_firma').hide();
        if($('#id').val()) {
            //$('#add_product').hide();
            $('#PCOContenedor_clientesSubForm').hide();
            // $('#id_cliente').val(idClienteDB.value);
            // PCOJS_ActualizarComboBox('id_cliente');
           actualizarInforme();
          if($('#id_cliente').val() == 1) {
                $('#PCOContenedor_placa').show();
            } else {
                $('#PCOContenedor_placa').hide();
            }
            onChangeTipoProducto();
            consultarTotalVenta();
        }
        else {
            $('#finalizar_venta').hide();
            $('#btn_update').hide();
            $('#PCOContenedor_placa').hide();
        }
        
    }

 function onchangeCliente(){
    $('#PCOContenedor_placa').show();
    if($('#id_cliente').val() == 1) {
        $('#PCOContenedor_placa').show();
    } 
} 

function agregarProducto() {
    if(validarDatosCompra()) {
        if(!id.value) {
            document.datos.PCO_Accion.value = 'VENTA_agregarProductoCrearOC';
            document.datos.Precarga_EstilosBS.value = 1;
            document.datos.Presentar_FullScreen.value = 0;
            document.datos.target = '_self';
        	document.datos.submit();
        }
        else {
            const resp = JSON.parse(PCO_ObtenerContenidoAjax(0,
                'index.php', 'Presentar_FullScreen=1&Precarga_EstilosBS=0&PCO_Accion=VENTA_agregarProducto' +
                    '&id=' + id.value + 
                    '&id_cliente=' + id_cliente.value +
                    '&id_producto=' + id_producto.value +
                    '&cantidad=' + cantidad.value +
                    '&precioVenta=' + precio.value +
                    '&nombre_completo=' + nombre_completo.value +
                    '&telefono=' + telefono.value +
                    '&hora_inicio=' + hora_inicio.value +
                    '&hora_fin=' + hora_fin.value +
                    '&guaje=' + guaje.value +
                    '&numero_documento=' + numero_documento.value
                )
            );
            if(resp.success) {
                cargarDatosFE(resp);
                $('#finalizar_venta').show();
                $('#id_producto').val('');
                PCOJS_ActualizarComboBox('id_producto');
                $('#precio').val('');
                $('#cantidad').val('1');
            }
            else {
                PCOJS_MostrarMensaje("Aviso del sistema", resp.msg);
            }
        }
    }
}

function mostrarMensajePopUp(TituloPopUp, Mensaje) {
    $('#modalMensajeTitulo').html(TituloPopUp);
	$('#modalMensajeCuerpo').html(Mensaje);

    //Retira cualquier clase preexistente o remanente de cualquier personalizacion previa y agrega las clases base
    $("#modalMensaje").removeClass();
    $( "#modalMensaje" ).addClass( "modal" );
    $( "#modalMensaje" ).addClass( "fade" );
    $( "#modalMensaje" ).addClass( "oculto_impresion" );

    //Agrega las clases personalizadas por el usuario
    /* if (ClasesAdicionales!="")
        $( "#modalMensaje" ).addClass( ClasesAdicionales ); */

	// Se muestra el cuadro modal
	$('#modalMensaje').modal('show');

	//Hacer que la ventana este siempre por encima
	$("#modalMensaje").css("z-index", "1500");
}

function editProduct() {
    const product = document.FRMBASEINFORME.PCO_Valor.value;
    const [idVent,cant,prec] = product.split('|');
    /* PCOJS_MostrarMensajeCargando("Editar producto", PCO_ObtenerContenidoAjax(0, 'index.php', 'Presentar_FullScreen=1&Precarga_EstilosBS=0&PCO_Accion=PCO_CargarObjeto&PCO_Objeto=frm:7:1'+
        '&id2=' + idVent +
        '&cantidad2=' + cant +
        '&precio2=' + prec
    )); */
    mostrarMensajePopUp('Editar producto', PCO_ObtenerContenidoAjax(0, 'index.php', 'Presentar_FullScreen=1&Precarga_EstilosBS=0&PCO_Accion=PCO_CargarObjeto&PCO_Objeto=frm:7:1'+
        '&id2=' + idVent +
        '&cantidad2=' + cant +
        '&precio2=' + prec
    ));

}

function finalizarEdicionProducto() {
    $('#modalMensaje').modal('hide');
	$('#modalMensaje').hide();
    consultarTotalVenta();
    actualizarInforme();
}

function actualizarProducto2()
    {
        if(!$('#id2').val()) {
            PCOJS_MostrarMensaje("Alerta Venta", "No estas trabajando sobre una venta");
            return;
        }
        if(!$('#cantidad2').val()) {
            PCOJS_MostrarMensaje("Alerta Cantidad", "La cantidad es obligatoria");
            return;
        }
        if(!$('#precio2').val()) {
            PCOJS_MostrarMensaje("Alerta Precio", "El precio es obligatorio");
            return;
        }
        const resp = JSON.parse(PCO_ObtenerContenidoAjax(0,
            'index.php', 'Presentar_FullScreen=1&Precarga_EstilosBS=0&PCO_Accion=VENTA_actualizarProductoVenta' +
                '&id=' + $('#id2').val() + 
                '&id_producto=' + $('#id_producto2').val()  +
                '&cantidad=' + $('#cantidad2').val() +
                '&precio=' + $('#precio2').val()
            )
        );
        finalizarEdicionProducto();
    }

function finalizarCompra() {
    /* if(dinero_entregado.value < total_fake.value) {
        PCOJS_MostrarMensaje("Editar producto", "El valor a pagar es menor al total!");
        return;
    } */
    //Actualiza
        /*document.datos.PCO_Accion.value = 'PCO_ActualizarDatosFormulario';
        document.datos.id_registro_datos.value = id.value;
        document.datos.Precarga_EstilosBS.value = 0;
        document.datos.Presentar_FullScreen.value = 1;
    	document.datos.target = '_blank';
    	document.datos.submit();*/
    //Abre la venta para imprimirla
        /*document.datos.PCO_Accion.value = 'VENTA_imprimirFactura';
        document.datos.id_registro_datos.value = id.value;
        document.datos.Precarga_EstilosBS.value = 0;
        document.datos.Presentar_FullScreen.value = 1;
    	document.datos.target = '_blank';
    	document.datos.submit();*/

    document.datos.PCO_Accion.value='PCO_ActualizarDatosFormulario';
    PCOJS_ValidarCamposYProcesarFormulario('datos');
}

function eliminar_producto() {
    const product = document.FRMBASEINFORME.PCO_Valor.value;
    const [idVent] = product.split('|');
    const resp = JSON.parse(PCO_ObtenerContenidoAjax(0,
        'index.php', 'Presentar_FullScreen=1&Precarga_EstilosBS=0&PCO_Accion=VENTA_eliminarProducto' +
            '&id_venta=' + id.value +
            '&id_venta_detalle=' + idVent
        )
    );
    cargarDatosFE(resp);
}

function validarDatosCompra() {
    if(!id_cliente.value && !nombre_completo.value && !numero_documento.value && !telefono.value && id_cliente.value != 1) {
        PCOJS_MostrarMensaje("Aviso del sistema", "Debes seleccionar o ingresar un cliente!");
        return false;
    }
    if(!cantidad.value || isNaN(cantidad.value) || cantidad.value < 1) {
        PCOJS_MostrarMensaje("Aviso del sistema", "Debes ingresar una cantidad válida!");
        return false;
    }
    if(!id_producto.value) {
        PCOJS_MostrarMensaje("Aviso del sistema", "Debes seleccionar un producto");
        return false;
    }
    if(id_cliente.value == 1 && !placa.value) {
        PCOJS_MostrarMensaje("Aviso del sistema", "Debes ingresar una placa");
        return false;
    }
    if(tipo_venta.value == servicio && !id_mecanico.value) {
        PCOJS_MostrarMensaje("Aviso del sistema", "Debes seleccionar un mecánico");
        return false;
    }
    if(tipo_venta.value == lavado && (!hora_inicio.value || !hora_fin.value)) {
        PCOJS_MostrarMensaje("Aviso del sistema", "Debes agregar una hora inicio y hora fin");
        return false;
    }
    if(tipo_venta.value == lavado && !guaje.value) {
        PCOJS_MostrarMensaje("Aviso del sistema", "Debes seleccionar un guaje");
        return false;
    }
    if(!precio.value) {
        PCOJS_MostrarMensaje("Aviso del sistema", "Debes agregar un precio al producto");
        return false;
    }
    return true;
}

const convertToInt = (n) => parseInt(n.replace(/,/g, ""));

function calcularDevuelta() {
    devuelta.value = '';
    if(dinero_entregado.value && total_fake.value) {
        dinero_entregado.value = dinero_entregado.value.replace(/\D/g, "")
            .replace(/\B(?=(\d{3})+(?!\d)\.?)/g, ",");
        const diff = convertToInt(dinero_entregado.value) - convertToInt(total_fake.value);
        //console.log({diff});
        devuelta.value = formatter(diff).replace('$', '');
    }
}
/*
        $(event.target).val(function (index, value ) {
            return value.replace(/\D/g, "")
                        .replace(/([0-9])([0-9]{2})$/, '$1.$2')
                        .replace(/\B(?=(\d{3})+(?!\d)\.?)/g, ",");
*/

const origenListaOpciones = ({ PCO_TablaConsulta, PCO_ListaCamposRetorno, PCO_ListaCamposBusqueda, PCO_CondicionFiltrado }) => ({
      values: "a, b, c",
      ajax: {
        url: "index.php",
        type: "POST",
        dataType: "json",
        data: {
          q: "{{{q}}}",
          PCO_Accion: "PCO_ObtenerOpcionesAjaxSelect",
          Presentar_FullScreen: "1",
          PCO_TablaConsulta,
          PCO_ListaCamposRetorno,
          PCO_ListaCamposBusqueda,
          PCO_CondicionFiltrado
        }
      },
      minLength: 3,
      locale: {
        emptyTitle: "Seleccione y digite para buscar",
        statusInitialized: "Empiece a digitar para recuperar registros",
        statusSearching: "Cargando...",
        currentlySelected: "Actualmente seleccionado(s):",
        errorText: "No se pueden recuperar registros",
        statusTooShort: "Ingrese al menos tres caracteres",
        statusNoResults: "No se encuentran resultados",
        searchPlaceholder: "Buscar..."
      },
      log: 0,
      preprocessData: (data) => data.length ? data.map(({ T: text, V: value, S: subtext, I: icon }) => ({
        text,
        value,
        data: {
          subtext,
          icon,
        }
        })) : []
});

function onChangeTipoProducto() {
    $('#PCOContenedor_id_mecanico').hide();
    if(tipo_venta.value == servicio) $('#PCOContenedor_id_mecanico').show();

    $('#PCOContenedor_hora_inicio').hide();
    $('#PCOContenedor_hora_fin').hide();
    $('#PCOContenedor_guaje').hide();
    if(tipo_venta.value == lavado) {
        $('#PCOContenedor_hora_fin').show();
        $('#PCOContenedor_hora_inicio').show();
        $('#PCOContenedor_guaje').show();
    }

    // const filtradoProductos = tipo_venta.value == 2 ? " AND inventario>0" : "";
    $("#id_producto").selectpicker().ajaxSelectPicker(
        origenListaOpciones({ 
            PCO_TablaConsulta: "app_productos",
            PCO_ListaCamposRetorno: "id,CONCAT(codigo,' | ',nombre)",
            PCO_ListaCamposBusqueda: "codigo,nombre",
            PCO_CondicionFiltrado: "AND tipo_producto="+tipo_venta.value,
        }));
    $("#id_producto").trigger("change");
}

function getProduct() {
    if(!id_producto.value || tipo_venta.value != lavado) return;
    const resp = JSON.parse(PCO_ObtenerContenidoAjax(0,
        'index.php', 'Presentar_FullScreen=1&Precarga_EstilosBS=0&PCO_Accion=PRODUCTOS_getProductById' +
            '&id=' + $('#id_producto').val()
        )
    );
    $('#precio').val(resp.precio_venta || "")
}

function onchangeTipoPago() {
    $('#PCOContenedor_factura_pagada').hide();
    $('#PCOContenedor_firma').hide();
    if(tipo_pago.value == "Credito") {
        $('#PCOContenedor_factura_pagada').show();
        $('#PCOContenedor_firma').show();
    }
}

$('#DatePicker_hora_inicio').on('dp.change', function(e){ calcularTiempo(); });

$('#DatePicker_hora_fin').on('dp.change', function(e){ calcularTiempo(); });


/* $(document).ready(() => {
    $("#id_producto").selectpicker().ajaxSelectPicker(
        origenListaOpciones({ 
            PCO_TablaConsulta: "app_productos",
            PCO_ListaCamposRetorno: "id,CONCAT(codigo,' | ',nombre,' | ',precio_venta)",
            PCO_ListaCamposBusqueda: "codigo,nombre",
            // PCO_CondicionFiltrado: "tipo_producto="+$('#tipo_venta').val()+filtradoProductos,
        }));
    $("#id_producto").trigger("change");
});*/