import { toastPresupuestoSummary } from "../../../components/alerts/sweetAlert.js";

class Resumen {

    constructor() {

    }

    init() {

        const self = this;
        this.toastPresupuestoTotal = null
        $(".update-totales").on("change", function () {
            self.updateTotales(null, { updateLP: true, updateServicios: true, updateEnvio: true });
        });

        $(document).on('update-totales', async function () {
            await self.updateTotales();
            $(document).trigger('update-totales-completed');
        });
        $("#totalDespuesDecuento").on('change', this.updateToastSummary.bind(this))
    }

    cargar(resumen) {

        // Mapear los valores a los elementos HTML por ID
        $("#totalCostePapel").val(resumen.total_coste_papel || 0);
        $("#totalCostePapel").html(resumen.total_coste_papel || 0);
        $("#porcentajeMargenPapel").val(resumen.total_margenPercent_papel ? resumen.total_margenPercent_papel : 0);
        $("#porcentajeMargenPapel").html(resumen.total_margenPercent_papel ? resumen.total_margenPercent_papel : 0);
        $("#margenPapel").val(resumen.total_margen_papel || 0);
        $("#margenPapel").html(resumen.total_margen_papel || 0);

        $("#totalCosteImpresion").val(resumen.total_coste_impresion || 0);
        $("#totalCosteImpresion").html(resumen.total_coste_impresion || 0);
        $("#porcentajeMargenImpresion").val(resumen.total_margenPercent_impresion ? resumen.total_margenPercent_impresion : 0);
        $("#porcentajeMargenImpresion").html(resumen.total_margenPercent_impresion ? resumen.total_margenPercent_impresion : 0);
        $("#margenImpresion").val(resumen.total_margen_impresion || 0);
        $("#margenImpresion").html(resumen.total_margen_impresion || 0);

        $("#totalServicios").html(resumen.total_coste_servicios || 0);
        $("#totalServicios").val(resumen.total_coste_servicios || 0);
        $("#porcentajeMargenServicios").val(resumen.total_margenPercent_servicios ? resumen.total_margenPercent_servicios : 0);
        $("#porcentajeMargenServicios").html(resumen.total_margenPercent_servicios ? resumen.total_margenPercent_servicios : 0);
        $("#margenServicios").val(resumen.total_margen_servicios || 0);
        $("#margenServicios").html(resumen.total_margen_servicios || 0);

        $("#costeEnvios").html(resumen.total_coste_envios || 0);
        $("#costeEnvios").val(resumen.total_coste_envios || 0);
        $("#precioEnvios").html(resumen.total_precio_envios || 0);
        $("#precioEnvios").val(resumen.total_precio_envios || 0);
        $("#margenEnvios").html(resumen.total_margen_envios || 0);
        $("#margenEnvios").val(resumen.total_margen_envios || 0);

        $("#totalCostes").html(resumen.total_costes || 0).val();
        $("#porcentajeMargen").html(resumen.porcentajeMargen ? resumen.porcentajeMargen : 0);
        $("#totalMargenes").html(resumen.total_margenes || 0);
        $("#totalCostes").val(resumen.total_costes || 0);
        $("#porcentajeMargen").val(resumen.porcentajeMargen ? resumen.porcentajeMargen : 0);
        $("#totalMargenes").val(resumen.total_margenes || 0);

        $("#totalAntesDescuento").html(resumen.total_antes_descuento || 0);
        $("#total_descuentoPercent").val(resumen.total_descuentoPercent || 0);
        $("#descuentoTotal").html(resumen.total_descuento || 0);
        $("#totalDespuesDecuento").html(resumen.total_presupuesto || 0).trigger("change")
        $("#precioUnidadPresupuesto").html(resumen.total_precio_unidad || 0);
        $("#factor").html(resumen.total_factor || 0);
        $("#factor_ponderado").html(resumen.total_factor_ponderado || 0);
        $("#totalAntesDescuento").val(resumen.total_antes_descuento || 0);
        $("#descuentoTotal").val(resumen.total_descuento || 0);
        $("#totalDespuesDecuento").val(resumen.total_presupuesto || 0).trigger("change")
        $("#precioUnidadPresupuesto").val(resumen.total_precio_unidad || 0);
        $("#factor").val(resumen.total_factor || 0);
        $("#factor_ponderado").val(resumen.total_factor_ponderado || 0);

        if (resumen.total_aceptado !== undefined) {
            $("#totalAceptado").html(resumen.total_aceptado || 0);
            $("#totalAceptado").val(resumen.total_aceptado || 0);
        }

        $('#ivaReducido').val(resumen.iva_reducido ? 1 : 0);

        AutoNumeric.multiple('.autonumeric-resumen-currency', { decimalPlaces: 2, currencySymbol: '€', currencySymbolPlacement: 's', digitGroupSeparator: '.', decimalCharacter: ',' });
        AutoNumeric.multiple('.autonumeric-resumen-currency-4', { decimalPlaces: 4, currencySymbol: '€', currencySymbolPlacement: 's', digitGroupSeparator: '.', decimalCharacter: ',' });
        AutoNumeric.multiple('.autonumeric-resumen-percent', { decimalPlaces: 0, currencySymbol: '%', currencySymbolPlacement: 's', digitGroupSeparator: '.', decimalCharacter: ',' });
        AutoNumeric.multiple('.autonumeric-resumen-2', { decimalPlaces: 2, digitGroupSeparator: '.', decimalCharacter: ',' });

    }

    update() {


    }



    async updateTotales(data = {}, ajustar = false) {

        const self = this;

        let updateLP = data.updateLP || true;
        let updateServicios = data.updateServicios || true;
        let updateEnvio = data.updateEnvio || true;
        let totalPapel = 0;
        let margenPapel = 0;

        let totalImpresion = 0;
        let totalImpresionforMargen = 0;
        let margenImpresion = 0;

        let totalServicios = parseFloat(0);
        let margenServicios = parseFloat(0);

        let totalEnvios = 0;
        let totalEnvios_base = 0;
        let margenEnvios = 0;

        let sumForFactor = 0.0;
        let sumForFactorPonderado = 0.0;


        let costeMaquinaHoras = 0.0;
        let margenPorHoras = 0.0;

        if (updateLP) {

            if (typeof $("#tableLineasPresupuesto").DataTable() !== 'undefined') {
                $("#tableLineasPresupuesto").DataTable().rows().every(function (rowIdx, tableLoop, rowLoop) {
                    let rowData = this.data();

                    if (rowData.check_papel_total) {
                        totalPapel += parseFloat($('#' + rowData.row_id + '_totalPapelPedido').val())
                        margenPapel += parseFloat($('#' + rowData.row_id + '_margenPapelPedido').val())

                        //sumForFactor += parseFloat($('#' + rowData.row_id + '_totalPapelPedido').val())
                        //sumForFactor -= parseFloat($('#' + rowData.row_id + '_margenPapelPedido').val())

                    }
                    if (rowData.check_impresion_total) {

                        costeMaquinaHoras += parseFloat($('#' + rowData.row_id + '_precioImpresion').val())
                        margenPorHoras += parseFloat($('#' + rowData.row_id + '_margenImpresion').val())
                        totalImpresion += parseFloat($('#' + rowData.row_id + '_totalClicks').val())
                        margenImpresion += parseFloat($('#' + rowData.row_id + '_margenClicks').val())

                        //sumForFactor += parseFloat($('#' + rowData.row_id + '_totalClicks').val())

                        if (rowData.maquinaTipo == 'inkjet') {
                            totalImpresion += parseFloat(rowData.totalTinta)
                            totalImpresion += parseFloat(rowData.totalCorte) ?? 0;
                            //sumForFactor += (parseFloat(rowData.totalTinta) + parseFloat(rowData.totalCorte))
                        }

                        //sumForFactor -= parseFloat($('#' + rowData.row_id + '_margenClicks').val())

                        /*if (!isNaN(parseFloat($('#' + rowData.row_id + '_totalTinta').val()))) {
                            totalImpresion += parseFloat($('#' + rowData.row_id + '_totalTinta').val())
                            sumForFactor += parseFloat($('#' + rowData.row_id + '_totalTinta').val())
                        }*/
                    }
                })
            }

            totalImpresion -= parseFloat(margenImpresion);
            totalPapel -= parseFloat(margenPapel);

            margenImpresion += parseFloat(margenPorHoras) + parseFloat(costeMaquinaHoras);

            sumForFactor += totalImpresion;
            sumForFactor += totalPapel;

            let porcentajeMargenPapel = isNaN(margenPapel / (totalPapel) * 100.0) ? 0 : margenPapel / (totalPapel) * 100.0
            $('#porcentajeMargenPapel').html(porcentajeMargenPapel)
            $('#porcentajeMargenPapel').val(porcentajeMargenPapel)
            $('#totalCostePapel').val(totalPapel.toFixed(2))
            $('#totalCostePapel').html(totalPapel)
            $('#margenPapel').val(margenPapel.toFixed(2))
            $('#margenPapel').html(margenPapel)

            let porcentajeMargenImpresion = isNaN(margenImpresion / (totalImpresion) * 100.0) ? 0 : margenImpresion / (totalImpresion) * 100.0
            $('#porcentajeMargenImpresion').html(porcentajeMargenImpresion).val(porcentajeMargenImpresion.toFixed(2))
            $('#totalCosteImpresion').html(totalImpresion).val(totalImpresion.toFixed(2))
            $('#margenImpresion').html(margenImpresion).val(margenImpresion.toFixed(2))


        }
        else {
            totalPapel = parseFloat($('#totalCostePapel').attr('val'))
            margenPapel = parseFloat($('#margenPapel').attr('val'))
            totalImpresion = parseFloat($('#totalCosteImpresion').attr('val'))
            margenImpresion = parseFloat($('#margenImpresion').attr('val'))
        }

        sumForFactorPonderado = sumForFactor;

        if (updateServicios) {

            const total = parseInt($('#tirada').val()) + parseInt($('#merma').val());

            if (typeof $("#tableOfServiciosEncuadernacion").DataTable() !== 'undefined' && $("#tableOfServiciosEncuadernacion").DataTable().rows().count() > 0) {
                $('#tableOfServiciosEncuadernacion').DataTable().rows().every(function (rowIdx, tableLoop, rowLoop) {
                    let rowData = this.data();
                    let total_servicio = self.roundToTwoDecimals(parseFloat(rowData.precio_total));
                    let margen_servicio = parseFloat(rowData.margen);
                    totalServicios += total_servicio
                    let base = self.roundToTwoDecimals(total_servicio / (1 + margen_servicio / 100.0));
                    base = self.roundToTwoDecimals(base / total) * total;
                    margenServicios += self.roundToTwoDecimals(parseFloat(total_servicio - base));
                });
            }

            if (typeof $("#tableOfServiciosAcabado").DataTable() !== 'undefined' && $("#tableOfServiciosAcabado").DataTable().rows().count() > 0) {
                $('#tableOfServiciosAcabado').DataTable().rows().every(function (rowIdx, tableLoop, rowLoop) {
                    let rowData = this.data();
                    let total_servicio = self.roundToTwoDecimals(parseFloat(rowData.precio_total));
                    let margen_servicio = parseFloat(rowData.margen);
                    totalServicios += total_servicio
                    let base = self.roundToTwoDecimals(total_servicio / (1 + margen_servicio / 100.0));
                    base = self.roundToTwoDecimals(base / total) * total;
                    margenServicios += self.roundToTwoDecimals(parseFloat(total_servicio - base));
                });
            }

            if (typeof $("#tableOfServiciosPreimpresion").DataTable() !== 'undefined' && $("#tableOfServiciosPreimpresion").DataTable().rows().count() > 0) {
                $('#tableOfServiciosPreimpresion').DataTable().rows().every(function (rowIdx, tableLoop, rowLoop) {
                    let rowData = this.data();
                    let total_servicio = self.roundToTwoDecimals(parseFloat(rowData.precio));
                    let base = (parseFloat(rowData.precio / (1 + parseFloat(rowData.margen) / 100.0)).toFixed(2));
                    base = self.roundToTwoDecimals(base / total) * total;
                    margenServicios += self.roundToTwoDecimals(parseFloat(total_servicio - base));
                    totalServicios += total_servicio
                });
            }

            if (typeof $("#tableOfServiciosExtra").DataTable() !== 'undefined' && $("#tableOfServiciosExtra").DataTable().rows().count() > 0) {
                $('#tableOfServiciosExtra').DataTable().rows().every(function (rowIdx, tableLoop, rowLoop) {
                    let rowData = this.data();
                    let total_servicio = self.roundToTwoDecimals(parseFloat(rowData.precio));
                    let base = (parseFloat(rowData.precio / (1 + parseFloat(rowData.margen) / 100.0)).toFixed(2));
                    base = self.roundToTwoDecimals(base / total) * total;
                    margenServicios += self.roundToTwoDecimals(parseFloat(total_servicio - base));
                    totalServicios += total_servicio;
                });
            }

            if (typeof $("#tableOfServiciosManipulado").DataTable() !== 'undefined' && $("#tableOfServiciosManipulado").DataTable().rows().count() > 0) {
                $('#tableOfServiciosManipulado').DataTable().rows().every(function (rowIdx, tableLoop, rowLoop) {
                    let rowData = this.data();
                    let total_servicio = self.roundToTwoDecimals(parseFloat(rowData.precio_total));
                    let margen_servicio = parseFloat(rowData.margen);
                    totalServicios += total_servicio
                    let base = self.roundToTwoDecimals(total_servicio / (1 + margen_servicio / 100.0));
                    base = self.roundToTwoDecimals(base / total) * total;
                    margenServicios += self.roundToTwoDecimals(parseFloat(total_servicio - base));
                });
            }

            totalServicios -= margenServicios;

            sumForFactorPonderado += totalServicios;

            let porcentajeMargenServicios = margenServicios / (totalServicios) * 100
            $('#porcentajeMargenServicios').html(isNaN(porcentajeMargenServicios) ? 0 : porcentajeMargenServicios)
            $('#porcentajeMargenServicios').val(isNaN(porcentajeMargenServicios) ? 0 : porcentajeMargenServicios)
            $('#totalServicios').html(totalServicios).val(totalServicios.toFixed(2))
            $('#margenServicios').html(margenServicios).val(margenServicios.toFixed(2))

        }
        else {

            totalServicios = parseFloat($('#totalServicios').attr('val'))
            margenServicios = parseFloat($('#margenServicios').attr('val'))

            sumForFactorPonderado += totalServicios;
        }

        if (updateEnvio) {

            totalEnvios_base = parseFloat($('#envio_base').val());
            if (typeof $('#tableOfDireccionesEnvio').DataTable() !== 'undefined' && $('#tableOfDireccionesEnvio').DataTable().rows().count() > 0) {
                $('#tableOfDireccionesEnvio').DataTable().rows().every(function (rowIdx, tableLoop, rowLoop) {
                    // el primer envio es el base, y no se debe de cobrar
                    if (rowIdx != 0) {

                        let data = this.data()
                        totalEnvios += parseFloat(data.precio)
                        margenEnvios += parseFloat((data.precio) * data.margen / 100)
                    }
                });
            }

            //totalEnvios -= margenEnvios // el precio de los envios es ya coste
            $('#precioEnvios').html(totalEnvios_base).val(totalEnvios_base.toFixed(2))
            $('#costeEnvios').html(totalEnvios).val(totalEnvios.toFixed(2))
            $('#margenEnvios').html(margenEnvios).val(margenEnvios.toFixed(2))
        }
        else {
            totalEnvios = parseFloat($('#precioEnvios').attr('val'))
            margenEnvios = parseFloat($('#margenEnvios').attr('val'))
        }

        let totalCostes = parseFloat(totalPapel.toFixed(2)) + parseFloat(totalImpresion.toFixed(2))
            + parseFloat(totalServicios.toFixed(2)) + parseFloat(totalEnvios.toFixed(2))

        let totalMargenes = parseFloat(margenPapel.toFixed(2)) + parseFloat(margenImpresion.toFixed(2)) + parseFloat(margenServicios.toFixed(2)) + parseFloat(margenEnvios.toFixed(2))

        let autoTotalAceptado = AutoNumeric.getAutoNumericElement($('#total_aceptado_revisado')[0]);
        let total_aceptado_revisado = autoTotalAceptado.getNumber();

        if (ajustar) {
            if (total_aceptado_revisado && total_aceptado_revisado != 0) {
                const nuevoTotal = totalCostes + totalEnvios_base;


                if (total_aceptado_revisado < nuevoTotal) {
                    
                    if($('#total_aceptado')){
                        $('#div_ajustar_error').removeClass('d-none');
                        $('#error_recalcular_margen').hide().empty().
                            html('El presupuesto está confirmado y el total coste + precio de envio es menor que el total aceptado y revisado').
                            fadeIn("slow", function(){
                            setTimeout(function(){
                                $('#div_ajustar_error').addClass('d-none');
                            }, 5000);
                        });
                        
                    }
                    else{
                        autoTotalAceptado.set(nuevoTotal);
                        total_aceptado_revisado = nuevoTotal;
                    }
                    

                    
                }

                if(!($('#total_aceptado') && total_aceptado_revisado < nuevoTotal)){
                    totalMargenes = total_aceptado_revisado - nuevoTotal;
                }
            }
        }

        let porcentajeMargen = totalCostes > 0 ? (100 * totalMargenes / (totalCostes)).toFixed(0) : 0
        $('#totalCostes').html(totalCostes).val(totalCostes.toFixed(2))
        $('#totalMargenes').html(totalMargenes).val(totalMargenes.toFixed(2))
        $('#porcentajeMargen').html(porcentajeMargen).val(porcentajeMargen)

        if ($('#total_descuentoPercent').val() < 0) {
            $('#total_descuentoPercent').val(0)
        }
        let totalAntesDescuento = totalCostes + totalMargenes + totalEnvios_base;
        let totalDescuento = totalAntesDescuento * parseInt($('#total_descuentoPercent').val() || 0) / 100
        let totalPresupuesto = totalAntesDescuento - totalDescuento; // para el calculo del precio_u solo se tiene en cuenta el base
        let precioUnidad = totalPresupuesto / parseInt($('#tirada').val())

        $('#totalAntesDescuento').html(totalAntesDescuento).val(totalAntesDescuento.toFixed(2))
        $('#descuentoTotal').html(totalDescuento).val(totalDescuento.toFixed(2))
        $('#totalDespuesDecuento').html(totalPresupuesto).val(totalPresupuesto.toFixed(2))
        $('#precioUnidadPresupuesto').html(precioUnidad).val(precioUnidad.toFixed(4))
        $('#totalDespuesDecuento').trigger("change")

        $('#factor').html(((totalPresupuesto - totalEnvios - totalEnvios_base - margenEnvios) / sumForFactor))
        $('#factor').val(((totalPresupuesto - totalEnvios - totalEnvios_base - margenEnvios) / sumForFactor).toFixed(2))
        $('#factor_ponderado').html(((totalPresupuesto - totalEnvios - totalEnvios_base - margenEnvios) / sumForFactorPonderado))
        $('#factor_ponderado').val(((totalPresupuesto - totalEnvios - totalEnvios_base - margenEnvios) / sumForFactorPonderado).toFixed(2))

        AutoNumeric.multiple('.autonumeric-resumen-currency', { decimalPlaces: 2, currencySymbol: '€', currencySymbolPlacement: 's', digitGroupSeparator: '.', decimalCharacter: ',' });
        AutoNumeric.multiple('.autonumeric-resumen-currency-4', { decimalPlaces: 4, currencySymbol: '€', currencySymbolPlacement: 's', digitGroupSeparator: '.', decimalCharacter: ',' });
        AutoNumeric.multiple('.autonumeric-resumen-percent', { decimalPlaces: 0, currencySymbol: '%', currencySymbolPlacement: 's', digitGroupSeparator: '.', decimalCharacter: ',' });
        AutoNumeric.multiple('.autonumeric-resumen-2', { decimalPlaces: 2, digitGroupSeparator: '.', decimalCharacter: ',' });
    }


    getData() {

        let data = {
            'total_coste_papel': $('#totalCostePapel').val(),
            'total_margen_papel': $('#margenPapel').val(),
            'total_margenPercent_papel': $('#porcentajeMargenPapel').val(),

            'total_coste_impresion': $('#totalCosteImpresion').val(),
            'total_margen_impresion': $('#margenImpresion').val(),
            'total_margenPercent_impresion': $('#porcentajeMargenImpresion').val(),

            'total_coste_servicios': $('#totalServicios').val(),
            'total_margen_servicios': $('#margenServicios').val(),
            'total_margenPercent_servicios': $('#porcentajeMargenServicios').val(),

            'total_coste_envios': $('#costeEnvios').val(),
            'total_margen_envios': $('#margenEnvios').val(),

            'total_costes': $('#totalCostes').val(),
            'total_margenes': $('#totalMargenes').val(),

            'total_antes_descuento': $('#totalAntesDescuento').val(),
            'total_descuento': $('#descuentoTotal').val(),
            'total_descuentoPercent': $('#total_descuentoPercent').val(),
            'total_presupuesto': $('#totalDespuesDecuento').val(),
            'total_precio_unidad': $('#precioUnidadPresupuesto').val(),

            'total_factor': $('#factor').val(),
            'total_factor_ponderado': $('#factor_ponderado').val(),

            'iva_reducido': $('#ivaReducido').val()
        };

        if ($('#confirmar_presupuesto').prop('checked')) {
            data.confirmar = '1';
            data.total_aceptado = $('#totalDespuesDecuento').val();
        }

        let autoTotalAceptado = AutoNumeric.getAutoNumericElement($('#total_aceptado_revisado')[0]);
        let total_aceptado_revisado = autoTotalAceptado.getNumber();
        if (total_aceptado_revisado && total_aceptado_revisado != 0) {
            data.total_aceptado_revisado = total_aceptado_revisado;
        }
        else{
            data.total_aceptado_revisado = data.total_aceptado;
        }

        return data;
    }

    updateFromTotalAceptadoRevisado() {
    }

    roundToTwoDecimals(num) {
        return parseFloat(num.toFixed(2));
    }
    updateToastSummary() {
        if (this.toastPresupuestoTotal) {
            this.toastPresupuestoTotal.close()
        }

        this.toastPresupuestoTotal = toastPresupuestoSummary($("#totalDespuesDecuento").html() ?? 0)
        this.toastPresupuestoTotal.fire().then((result) => {
            if (result.isDismissed && result.dismiss == 'close') {
                this.updateToastSummary()
                $('html, body').animate(
                    {
                        scrollTop: $("#totalDespuesDecuento").offset().top
                    },
                    1000)
            }
        })

    }
}

export default Resumen;