import { getToken } from "../../../common/common.js";

class TiradasAlernativas {

    constructor(functions = {}) {

        this.getDimensionLibro = functions.getDimensionLibro;

        this.csrf_token = getToken();
        this.csrf_hash = $('#mainContainer').find('input[name="' + this.csrf_token + '"]').val();

        this.addTirada = $('#add_tirada_alt');
        this.tirada = $('#tirada_alt');

        this.table = null;
    }

    init() {

        const self = this;

        this.addTirada.on('click', this.addTiradaAlt.bind(this));

        this.table = $('#tableTiradas').DataTable({

            "language": {
                "url": "/themes/vuexy/vendor/libs/datatables-sk/plugins/i18n/es-ES.json"
            },
            "paging": false,
            "info": false,
            "searching": false,
            "ordering": true,
            "autoWidth": false,
            "responsive": true,
            "columnDefs": [
                {
                    orderable: false,
                    searchable: false,
                    targets: [$('#tableTiradas').find("tr:first th").length - 1]
                },
            ],
            "columns": [
                { data: "tirada" },
                { data: 'coste_impresion' },
                {
                    data: 'coste_envio',
                    render: function (data, type, row) {
                        return parseFloat(data).toFixed(2);
                    },
                },
                {
                    data: 'margen',
                    render: function (data, type, row) {
                        return data + '%';
                    }
                },
                {
                    data: 'total_pedido',
                    render: function (data, type, row) {
                        return parseFloat(data).toFixed(2);
                    }
                },
                {
                    data: 'precio_unidad',
                    render: function (data, type, row) {
                        return parseFloat(data).toFixed(4);
                    }
                },
                {
                    data: function (row, type, set, meta) {
                        return `
                            <a href="javascript:void(0);"><i class="ti ti-check ti-sm comfirm-tirada-alt mx-2" ></i></a>
                            <a href="javascript:void(0);"><i class="ti ti-trash ti-sm btn-delete-tirada mx-2" F></i></a>
                                `;
                    },
                    className: 'row-edit dt-center'
                }
            ],
            order: [[0, 'asc']]
        });

        // Evento de borrado de una fila de la tabla de tiradas 
        $(document).on('click', '.btn-delete-tirada', function (e) {

            const row = $(this).closest('tr');
            $('#tableTiradas').DataTable().row(row)
                .remove()
                .draw();
            showBreadCrumbSaveButton(true);
        })

        $(document).on('click', '.comfirm-tirada-alt', function (e) {

            const row = $(this).closest('tr');
            const data = self.table.row(row).data();

            self.table.row(row).remove().draw();

            $('#tirada').val(data.tirada).trigger('change');

            $(document).trigger('update-envios', { tirada_inicial: $('#tirada').val(), tirada: data.tirada });
        });

        $(document).on('update-tiradas-alternativas', async function () {

            await self.updateTiradasAlternativas();

            $(document).trigger('update-tiradas-alternativas-completed');

        });
    }

    async updateTiradasAlternativas() {

        const self = this;

        if ($('#tableTiradas').DataTable().rows().count() > 0) {
            // se obtiene la primera columna de la tabla de tiradas
            const data = $('#tableTiradas').DataTable().rows().data().toArray();
            // se borra la tabla de tiradas
            $('#tableTiradas').DataTable().clear().draw();
            const tiradas = data.map(row => row.tirada);
            // por cada tirada, se añade una fila a la tabla de tiradas
            tiradas.forEach(function (tirada) {
                self.addTiradaAlt(tirada);
            });
        }
    }


    cargar(datos) {

        if (datos != null && datos != undefined && datos.length > 0) {
            this.table.clear().draw();
            this.table.rows.add(datos).draw();
        }
    }

    generate_json_tiradas() {
        
        const data = this.table.rows().data().toArray();
        return JSON.stringify(data);
    }    


    addTiradaAlt(tiradaExterna = null) {

        const self = this;
        const id = window.location.href.split('/').pop();

        const tirada = tiradaExterna === null ||  isNaN(tiradaExterna) ? parseInt(this.tirada.val()) : tiradaExterna;
        const tirada_ejemplo = parseInt($('#tirada').val());
        const POD = parseInt($('#POD').val());

        if ((tirada_ejemplo > POD && tirada <= POD) ||
            (tirada_ejemplo <= POD && tirada > POD)) {
            popErrorAlert('No se pueden mezclar tiradas POD y no POD', 'alert-tiradas_alt');
            return;
        }

        if (this.table.rows().count() > 0) {
            let tiradas = this.table.rows().data().toArray();
            if (tiradas.find(t => parseInt(t.tirada) == tirada)) {
                popErrorAlert('La tirada ya existe', 'alert-tiradas_alt');
                return;
            }
        }

        if(this.generate_json_lp() == "[]"){
            popErrorAlert('No hay líneas de presupuesto', 'alert-tiradas_alt');
            return;
        }

        const dimension = this.getDimensionLibro();

        const envios = JSON.stringify($('#tableOfDireccionesEnvio').DataTable().rows().data().toArray());

        let datos = {
            id: id,
            tirada: tirada,
            peso_libro: this.get_peso_libro(),
            tirada_base: $('#tirada').val(),
            paginas: $('#paginas').val(),
            merma: this.getMerma(tirada),
            tipo_impresion_id: $('#tipo_impresion_id').val(),
            json_tiradas: this.generate_json_lp(),
            json_acabados: this.generate_json_servicios('acabados'),
            json_encuadernaciones: this.generate_json_servicios('encuadernaciones'),
            json_manipulado: this.generate_json_servicios('manipulado'),
            json_presimpresion: this.generate_json_servicios('presimpresion'),
            json_extra: this.generate_json_servicios('extra'),
            json_envios: envios,
            ancho: dimension.ancho,
            alto: dimension.alto,
            cliente_id: $('#clienteId').find(":selected").val(),
            solapas_cubierta: $('#solapas').is(':checked') ? 1 : 0,
            solapas_cubierta_ancho: $('#solapas').is(':checked') ? parseInt($('#solapas_ancho').val()) : 0,
            solapas_sobrecubierta: $('#solapas_sobrecubierta').is(':checked') ? 1 : 0,
            solapas_sobrecubierta_ancho: $('#solapas_sobrecubierta').is(':checked') ? parseInt($('#solapas_ancho_sobrecubierta').val()) : 0,
            lomo: $('#lomo_cubierta').val(),
            faja_alto: $('#faja_alto').val(),
            solapas_faja: $('#faja_solapas_ancho').val(),
        };

        $.ajax({
            type: "POST",
            url: '/presupuestotiradasalternativas/datatable_2',
            data: datos,
            success: async function (data) {

                var coste_total = 0.0;
                var margen_total = 0.0;

                var costes_servicios = 0.0;
                var margen_servicios = 0.0;

                var coste_envio = 0.0;
                var margen_envio = 0.0;

                if (data.lineas.length > 0) {
                    // Se cogen los valores de la linea con los datos correspondientes
                    data.lineas.forEach(function (value) {
                        coste_total += value.total_coste;
                        margen_total += value.total_margen;
                    });

                    if (data.servicios) {
                        costes_servicios += data.servicios.coste;
                        margen_servicios += data.servicios.margen;

                    }
                    
                    if (data.envios) {
                        coste_envio += data.envios.coste;
                        margen_envio += data.envios.margen;

                    }

                    // Se añade la fila a la tabla de tiradas
                    self.table.row.add({
                        tirada: datos.tirada,
                        coste_impresion: coste_total.toFixed(2),
                        coste_envio: coste_envio.toFixed(2),
                        margen: ((margen_total + margen_servicios + margen_envio) / (coste_total + coste_envio) * 100.0).toFixed(2),
                        total_pedido: (coste_total + costes_servicios + coste_envio).toFixed(2),
                        precio_unidad: ((coste_total + costes_servicios + coste_envio) / datos.tirada).toFixed(4),

                    }).draw(false);
                }


            },
            error: function (e) { }
        });
    }

    generate_json_lp() {

        const data = $('#tableLineasPresupuesto').DataTable().data().toArray();

        let json = this.filterData(data,
            ['paginas',
                'numPagColor',
                'paginas_impresion',
                'papel', // papel generico
                'papel_impresion_id',
                'gramaje',
                'maquina_id',
                'aFavorFibra',
                'row_id',
                'check_papel_total',
                'check_impresion_total',
                'cobAmarillo', // tipologia de papel
                'cobCyan',
                'cobMagenta',
                'cobNegro',
                'cobCG',
                'gotaColor',
                'gotaNegro']);

        json.forEach(element => {
            element['check_papel_total'] = $('#' + element['row_id'] + '_checkPapel').is(':checked') ? 1 : 0;
            element['check_impresion_total'] = $('#' + element['row_id'] + '_checkClicks').is(':checked') ? 1 : 0;
        });
        return JSON.stringify(json);
    }

    generate_json_servicios(servicios) {

        let json = [];
        switch (servicios) {
            case 'acabados':
                $('#tableOfServiciosAcabado').DataTable().rows().every(function (rowIdx, tableLoop, rowLoop) {
                    var rowData = this.data();
                    json.push(rowData);
                });
                break;
            case 'encuadernaciones':
                $('#tableOfServiciosEncuadernacion').DataTable().rows().every(function (rowIdx, tableLoop, rowLoop) {
                    var rowData = this.data();
                    json.push(rowData);
                });
                break;
            case 'presimpresion':
                $('#tableOfServiciosPreimpresion').DataTable().rows().every(function (rowIdx, tableLoop, rowLoop) {
                    var rowData = this.data();
                    json.push(rowData);
                });
                break;
            case 'manipulado':
                $('#tableOfServiciosManipulado').DataTable().rows().every(function (rowIdx, tableLoop, rowLoop) {
                    var rowData = this.data();
                    json.push(rowData);
                });
                break;
            case 'extra':
                $('#tableOfServiciosExtra').DataTable().rows().every(function (rowIdx, tableLoop, rowLoop) {
                    var rowData = this.data();
                    json.push(rowData);
                });
                break;
        }
        return JSON.stringify(json);
    }

    get_peso_libro() {

        var peso_total_libro = 0.0
        $('#tableLineasPresupuesto').DataTable().rows().every(function (rowIdx, tableLoop, rowLoop) {
            var rowData = this.data();
            peso_total_libro += parseFloat(rowData.peso)
        })
        return peso_total_libro;
    }

    getMerma(tirada) {

        let merma = 0;

        if (tirada > parseInt($('#POD').val())) {

            merma = tirada * 0.1 <= 30 ? tirada * 0.1 : 30
        }
        else {
            let merma_lineas = []
            $('#tableLineasPresupuesto').DataTable().rows().every(function (rowIdx, tableLoop, rowLoop) {
                var rowData = this.data();
                if (rowData.row_id != 'lp_guardas' && rowData.row_id != 'lp_cubierta' && rowData.row_id != 'lp_sobrecubierta') {
                    const formas_linea = $('#isCosido').val() == 0 ? parseInt(rowData.formas) : parseInt(rowData.formas) / 2
                    if (formas_linea > tirada)
                        merma_lineas.push(formas_linea - tirada)
                    else
                        merma_lineas.push(tirada % formas_linea)
                }
            })

            if (merma_lineas.length > 0)
                merma = Math.max(...merma_lineas)
            else
                merma = 0
        }
        return merma;
    }

    filterData(data, keys) {

        return data.map(obj => {

            const newObj = {};
            keys.forEach(key => {
                if (obj.hasOwnProperty(key)) {
                    newObj[key] = obj[key];
                }
            });
            return newObj;
        });
    }
}

export default TiradasAlernativas;