import ClassSelect from '../../components/select2.js';
import Ajax from '../../components/ajax.js';

class Importador {

    constructor() {

        this.cliente = new ClassSelect($("#clienteId"), '/importador/clientlist', "Seleccione un cliente");
        this.presupuesto = new ClassSelect($("#presupuesto"), '/importador/presupuestoslist', "Seleccione un presupuesto", false, { clienteId: () => $("#clienteId").val() });
        this.encuadernacion = new ClassSelect($("#encuadernacion"), '/importador/getencuadernacion', "Seleccione una encuadernación");

        this.compPapelNegroSelected = new ClassSelect($("#compPapelNegroSelected"), '/presupuestoadmin/papelgenerico', "Seleccione un papel", false,
            {

                tipo_impresion: () => this.encuadernacion.getVal(),
                tirada: () => $('#tirada').val(),
                ancho: () => this.getDimensionLibro().ancho,
                alto: () => this.getDimensionLibro().alto,
                sopalas: 0,
                lomo: 0,
                tipo: () => $('#isHq').val() ? 'negrohq' : 'negro',
            });
        this.compGramajeNegro = new ClassSelect($('#compGramajeNegro'), '/presupuestoadmin/papelgramaje', 'Seleccione un gramaje', false,
            {
                tipo_impresion: () => this.encuadernacion.getVal(),
                papel_generico: () => this.compPapelNegroSelected.getVal(),
                tirada: () => $('#tirada').val(),
                ancho: () => this.getDimensionLibro().ancho,
                alto: () => this.getDimensionLibro().alto,
                sopalas: 0,
                lomo: 0,
                tipo: () => $('#isHq').val() ? 'negrohq' : 'negro',
            });
        this.compPapelColorSelected = new ClassSelect($("#compPapelColorSelected"), '/presupuestoadmin/papelgenerico', "Seleccione un papel", false,
            {
                tipo_impresion: () => this.encuadernacion.getVal(),
                tirada: () => $('#tirada').val(),
                ancho: () => this.getDimensionLibro().ancho,
                alto: () => this.getDimensionLibro().alto,
                sopalas: 0,
                lomo: 0,
                tipo: () => $('#isHq').val() ? 'colorhq' : 'color',
            });
        this.compGramajeColor = new ClassSelect($('#compGramajeColor'), '/presupuestoadmin/papelgramaje', 'Seleccione un gramaje', false,
            {
                tipo_impresion: () => this.encuadernacion.getVal(),
                papel_generico: () => this.compPapelColorSelected.getVal(),
                tirada: () => $('#tirada').val(),
                ancho: () => this.getDimensionLibro().ancho,
                alto: () => this.getDimensionLibro().alto,
                sopalas: 0,
                lomo: 0,
                tipo: () => $('#isHq').val() ? 'colorhq' : 'color',
            });
        this.compPapelCubiertaSelected = new ClassSelect($("#compPapelCubiertaSelected"), '/presupuestoadmin/papelgenerico', "Seleccione un papel", false,
            {
                tipo_impresion: this.encuadernacion.getVal(),
                tirada: () => $('#tirada').val(),
                ancho: () => this.getDimensionLibro().ancho,
                alto: () => this.getDimensionLibro().alto,
                sopalas: () => $('#compSolapasCubierta').val(),
                lomo: () => 0,
                tipo: 'colorhq',
                uso: 'cubierta',
            });
        this.compGramajeCubierta = new ClassSelect($('#compGramajeCubierta'), '/presupuestoadmin/papelgramaje', 'Seleccione un gramaje', false,
            {
                tipo_impresion: () => this.encuadernacion.getVal(),
                papel_generico: () => this.compPapelCubiertaSelected.getVal(),
                tirada: () => $('#tirada').val(),
                ancho: () => this.getDimensionLibro().ancho,
                alto: () => this.getDimensionLibro().alto,
                sopalas: () => $('#compSolapasCubierta').val(),
                lomo: 0,
                tipo: 'colorhq',
            });
        this.compSobrecubiertaSelected = new ClassSelect($("#compPapelSobrecubiertaSelected"), '/presupuestoadmin/papelgenerico', "Seleccione un papel", false,
            {
                tipo_impresion: this.encuadernacion.getVal(),
                tirada: () => $('#tirada').val(),
                ancho: () => this.getDimensionLibro().ancho,
                alto: () => this.getDimensionLibro().alto,
                sopalas: () => $('#compSolapasSobrecubierta').val(),
                lomo: () => 0,
                tipo: 'colorhq',
                uso: 'sobrecubierta',
            });
        this.compGramajeSobrecubierta = new ClassSelect($('#compGramajeSobrecubierta'), '/presupuestoadmin/papelgramaje', 'Seleccione un gramaje', false,
            {
                tipo_impresion: () => this.encuadernacion.getVal(),
                papel_generico: () => this.compPapelCubiertaSelected.getVal(),
                tirada: () => $('#tirada').val(),
                ancho: () => this.getDimensionLibro().ancho,
                alto: () => this.getDimensionLibro().alto,
                sopalas: () => $('#compSolapasSobrecubierta').val(),
                lomo: 0,
                tipo: 'colorhq',
            });

        this.acabadoCubierta = new ClassSelect($("#compAcabadoCubiertaSelected"),
            '/serviciosacabados/getacabados',
            '',
            false,
            {
                "cubierta": 1
            }
        );
        this.acabadosSobrecubierta = new ClassSelect($("#compAcabadoSobrecubiertaSelected"),
            '/serviciosacabados/getacabados',
            '',
            false,
            {
                "sobrecubierta": 1
            }
        );


        this.openBtn = $('#openOld');
        this.initImport = $('#initImport');
        this.makeImport = $('#makeImport');

    }

    init() {

        // Fuerza el foco en el campo de búsqueda de select2
        $(document).on('select2:open', () => {
            document.querySelector('.select2-search__field').focus();
        });

        this.cliente.init();
        this.presupuesto.init();
        this.encuadernacion.init();

        this.compPapelNegroSelected.init();
        this.compGramajeNegro.init();
        this.compPapelColorSelected.init();
        this.compGramajeColor.init();
        this.compPapelCubiertaSelected.init();
        this.compGramajeCubierta.init();
        this.compSobrecubiertaSelected.init();
        this.compGramajeSobrecubierta.init();

        this.acabadoCubierta.init();
        this.acabadosSobrecubierta.init();

        this.cliente.item.on('change', () => {
            this.presupuesto.item.val('').trigger('change');
            this.presupuesto.item.prop('disabled', false);
            this.openBtn.prop('disabled', true);
            this.initImport.prop('disabled', true);
        });


        this.presupuesto.item.on('change', () => {
            this.openBtn.prop('disabled', false);
            this.initImport.prop('disabled', false);
        });


        this.openBtn.on('click', function () {
            if ($("#clienteId").val() != '' && $("#presupuesto").val() != '') {

                window.open('https://gestion.safekat.es/presupuesto/edit/' + $("#presupuesto").val());
            }
        });

        this.initImport.on('click', () => {
            if ($("#clienteId").val() != '' && $("#presupuesto").val() != '') {
                this.getPresupuestoData.bind(this)();
            }
        });

        this.makeImport.on('click', this.importPresupuesto.bind(this));

        $(document).on('change', '.warning-change', function () {
            $(this).addClass('bg-warning');
            let select2Container = $(this).next('.select2').find('.select2-selection');
            select2Container.addClass('bg-warning');
        });
    }

    importPresupuesto() {

        if ($("#clienteId").val() != '' && $("#presupuesto").val() != '') {
            let data = this.collectData();
            new Ajax(
                '/importador/importar',
                data,
                {},
                (response) => {
                    if (response.success) {
                        const urlObj = new URL(window.location.href);
                        Swal.fire({
                            title: 'Atención!',
                            text: 'Esto es una importación básica, por favor revisa los datos para comprobar que no hay errores. ' +
                                'Tenga en cuenta que no todos los servicios se pueden importar.',
                            icon: 'warning',
                            showCancelButton: false,
                            confirmButtonColor: '#3085d6',
                            confirmButtonText: 'Ok',
                            customClass: {
                                confirmButton: 'btn btn-primary me-1',
                            },
                            buttonsStyling: false
                        }).then(() => {
                            window.open(`${urlObj.origin}` + '/presupuestoadmin/edit/' + response.id);
                        });
                    }
                    else {
                        Swal.fire({
                            title: 'Error',
                            text: 'No ha sido posible importar el presupuesto. Póngase en contacto con el administrador.',
                            icon: 'error',
                            customClass: {
                                confirmButton: 'btn btn-primary'
                            },
                            buttonsStyling: false
                        });

                    }
                },
                (error) => {
                    Swal.fire({
                        title: 'Error',
                        text: 'Ha habido un error al intentar importar el presupuesto. Asegúrese de que están todos los campos rellenos.',
                        icon: 'error',
                        customClass: {
                            confirmButton: 'btn btn-primary'
                        },
                        buttonsStyling: false
                    });
                }
            ).post();
        }

    }

    collectData() {

        let data = {};

        data.id = $("#presupuesto").val();
        data.cliente_id = $("#clienteId").val();

        data.paginas = $('#paginas').val();
        data.tirada = $('#tirada').val();
        data.papel_formato_id = $('#tamanio').val();
        data.papel_formato_personalizado = $('#papelFormatoPersonalizado').prop('checked') ? 1 : 0;
        data.papel_formato_ancho = $('#papelFormatoAncho').val();
        data.papel_formato_alto = $('#papelFormatoAlto').val();

        data.encuadernacion = this.encuadernacion.getVal();
        data.isHq = $('#isHq').val();

        data.paginas_bn = $('#compPaginasNegro').val();
        data.papel_bn = this.compPapelNegroSelected.getVal();
        data.gramaje_bn = this.compGramajeNegro.getVal();

        data.paginas_color = $('#compPaginasColor').val();
        data.papel_color = this.compPapelColorSelected.getVal();
        data.gramaje_color = this.compGramajeColor.getVal();

        data.paginas_cubierta = $('#compCarasCubierta').val();
        data.papel_cubierta = this.compPapelCubiertaSelected.getVal();
        data.gramaje_cubierta = this.compGramajeCubierta.getVal();
        data.solapas_cubierta = $('#compSolapasCubierta').val();
        data.acabado_cubierta = this.acabadoCubierta.getVal();

        data.sobrecubierta = $('#compSobrecubierta').val();
        data.papel_sobrecubierta = this.compSobrecubiertaSelected.getVal();
        data.gramaje_sobrecubierta = this.compGramajeSobrecubierta.getVal();
        data.solapas_sobrecubierta = $('#compSolapasSobrecubierta').val();
        data.acabado_sobrecubierta = this.acabadosSobrecubierta.getVal();

        data.servicios = {
            marcapaginas: $('#marcapaginas').prop('checked') ? 1 : 0,
            serviciosExtra: []
        };

        if ($('#ferro').prop('checked')) {
            data.servicios.serviciosExtra.push(30);
        }
        if ($('#ferroDigital').prop('checked')) {
            data.servicios.serviciosExtra.push(29);
        }
        if ($('#prototipo').prop('checked')) {
            data.servicios.serviciosExtra.push(9);
        }

        return data;
    }



    getPresupuestoData() {

        new Ajax(
            '/importador/getpresupuestodata',
            { id: $("#presupuesto").val() },
            {},
            (response) => {
                if (response.success) {

                    this.fillInitialData(response.data);
                    $('.bg-warning').removeClass('bg-warning');
                }
            },
            (error) => {
                console.error(error);
            }
        ).get();
    }


    getDimensionLibro() {
        let ancho = 0;
        let alto = 0;
        if ($('#papelFormatoPersonalizado').prop('checked')) {
            ancho = $('#papelFormatoAncho').val();
            alto = $('#papelFormatoAlto').val();
        }
        else {
            const text = $('#tamanio').text();
            ancho = text.split('x')[0];
            alto = text.split('x')[1];
        }
        return { ancho, alto };
    }


    fillInitialData(data) {

        $('#paginas').val(data.datosGenerales.paginas);
        $('#tirada').val(data.datosGenerales.tirada);
        if (data.datosGenerales.papel_formato_personalizado) {
            $('#papelFormatoPersonalizado').prop('checked', true);
            $('#tamanio').addClass('d-none');
            $('#formatoPersonalizado').removeClass('d-none');
            $('#papelFormatoAncho').val(data.datosGenerales.papel_formato_ancho);
            $('#papelFormatoAlto').val(data.datosGenerales.papel_formato_alto);
        }
        else {
            $('#tamanio').removeClass('d-none');
            $('#formatoPersonalizado').addClass('d-none');
            $('#papelFormatoPersonalizado').prop('checked', false);
            $('#tamanio').append('<option value="' + data.datosGenerales.papel_formato_id + '" selected>' + data.datosGenerales.papel_formato_texto + '</option>');
            $('#tamanio').val(data.datosGenerales.papel_formato_id).trigger('change');
        }

        if (data.encuadernacion) {
            $('#encuadernacion_old').val(data.encuadernacion.encuadernacionOld);
            // check if data.encuadernacion.encuadernacion exists and is not empty
            if (data.encuadernacion.encuadernacion) {
                this.encuadernacion.setOption(data.encuadernacion.encuadernacion.id, data.encuadernacion.encuadernacion.encuadernacion);
            }
        }

        if (data.lineas) {
            if (data.lineas.isHq) {
                $('#isHq').val(data.lineas.isHq);
            }
            else {
                $('#isHq').val(0);
            }

            if (data.lineas.bn && data.lineas.bn.paginas) {
                $('#compPaginasNegro').val(data.lineas.bn.paginas);
                $('#compPapelNegroOrigen').val(data.lineas.bn.papel_nombre);
                this.compGramajeNegro.setOption(parseFloat(data.lineas.bn.gramaje).toFixed(0), parseFloat(data.lineas.bn.gramaje).toFixed(0));
                this.compPapelNegroSelected.item.prop('disabled', false);
                this.compPapelNegroSelected.setOption(data.lineas.bn.new_papel_id, data.lineas.bn.new_papel_nombre);
            }
            else {
                $('#compPaginasNegro').val(0);
                $('#compPapelNegroOrigen').val("");
                this.compGramajeNegro.empty();
                this.compPapelNegroSelected.empty();
                this.compPapelNegroSelected.item.prop('disabled', true);
                this.compGramajeNegro.item.prop('disabled', true);
            }

            if (data.lineas.color && data.lineas.color.paginas) {
                $('#compPaginasColor').val(data.lineas.color.paginas);
                $('#compPapelColorOrigen').val(data.lineas.color.papel_nombre);
                this.compGramajeColor.setOption(parseFloat(data.lineas.color.gramaje).toFixed(0), parseFloat(data.lineas.color.gramaje).toFixed(0));
                this.compPapelColorSelected.item.prop('disabled', false);
                this.compPapelColorSelected.setOption(data.lineas.color.new_papel_id, data.lineas.color.new_papel_nombre);
            }
            else {
                $('#compPaginasColor').val(0);
                $('#compPapelColorOrigen').val("");
                this.compGramajeColor.empty();
                this.compPapelColorSelected.empty();
                this.compPapelColorSelected.item.prop('disabled', true);
            }

            if (data.lineas.cubierta && data.lineas.cubierta.paginas) {
                $('#compPaginasCubierta').val(data.lineas.cubierta.paginas);
                $('#compPapelCubiertaOrigen').val(data.lineas.cubierta.papel_nombre);
                this.compGramajeCubierta.setOption(parseFloat(data.lineas.cubierta.gramaje).toFixed(0), parseFloat(data.lineas.cubierta.gramaje).toFixed(0));
                $('#compSolapasCubierta').val(parseFloat(data.lineas.cubierta.solapas).toFixed(0));
                this.compPapelCubiertaSelected.item.prop('disabled', false);
                this.compPapelCubiertaSelected.setOption(data.lineas.cubierta.new_papel_id, data.lineas.cubierta.new_papel_nombre);
            }
            else {
                $('#compPaginasCubierta').val(0);
                $('#compPapelCubiertaOrigen').val("");
                this.compGramajeCubierta.empty();
                $('#compSolapasCubierta').val("");
                this.compPapelCubiertaSelected.empty();
                this.compPapelCubiertaSelected.item.prop('disabled', true);
            }

            if (data.lineas.sobrecubierta && data.lineas.sobrecubierta.paginas) {
                $('#compSobrecubierta').val(1);
                $('#compPapelSobrecubiertaOrigen').val(data.lineas.sobrecubierta.papel_nombre);
                this.compGramajeSobrecubierta.setOption(parseFloat(data.lineas.sobrecubierta.gramaje).toFixed(0), parseFloat(data.lineas.sobrecubierta.gramaje).toFixed(0));
                $('#compSolapasSobrecubierta').val(parseFloat(data.lineas.sobrecubierta.solapas).toFixed(0));
                this.compSobrecubiertaSelected.item.prop('disabled', false);
                this.compSobrecubiertaSelected.setOption(data.lineas.sobrecubierta.new_papel_id, data.lineas.sobrecubierta.new_papel_nombre);
            }
            else {
                $('#compSobrecubierta').val(0);
                $('#compPapelSobrecubiertaOrigen').val("");
                this.compGramajeSobrecubierta.empty();
                $('#compSolapasSobrecubierta').val("");
                this.compSobrecubiertaSelected.empty();
                this.compSobrecubiertaSelected.item.prop('disabled', true);
            }

            if (data.acabados) {
                if (data.acabados.cubierta && data.acabados.cubierta.acabadoOld) {
                    $('#compAcabadoCubiertaOrigen').val(data.acabados.cubierta.acabadoOld);
                    this.acabadoCubierta.setOption(data.acabados.cubierta.acabado.id, data.acabados.cubierta.acabado.name);
                    this.acabadoCubierta.item.prop('disabled', false);
                }
                else {
                    $('#compAcabadoCubiertaOrigen').val("");
                    this.acabadoCubierta.empty();
                    this.acabadoCubierta.item.prop('disabled', true);
                }

                if (data.acabados.sobrecubierta && data.acabados.sobrecubierta.acabadoOld) {
                    $('#compAcabadoSobrecubiertaOrigen').val(data.acabados.sobrecubierta.acabadoOld);
                    this.acabadosSobrecubierta.setOption(data.acabados.sobrecubierta.acabado.id, data.acabados.sobrecubierta.acabado.name);
                    this.acabadosSobrecubierta.item.prop('disabled', false);
                }
                else {
                    $('#compAcabadoSobrecubiertaOrigen').val("");
                    this.acabadosSobrecubierta.empty();
                    this.acabadosSobrecubierta.item.prop('disabled', true);
                }
            }

            if (data.servicios.ferro == 1) {
                $('#ferro').prop('checked', true);
            }
            else {
                $('#ferro').prop('checked', false);
            }
            if (data.servicios.ferroDigital == 1) {
                $('#ferroDigital').prop('checked', true);
            }
            else {
                $('#ferroDigital').prop('checked', false);
            }
            if (data.servicios.marcapaginas == 1) {
                $('#marcapaginas').prop('checked', true);
            }
            else {
                $('#marcapaginas').prop('checked', false);
            }
            if (data.servicios.prototipo == 1) {
                $('#prototipo').prop('checked', true);
            }
            else {
                $('#prototipo').prop('checked', false);
            }
        }
        this.makeImport.prop('disabled', false);
    }
}

document.addEventListener('DOMContentLoaded', function () {

    let importador = new Importador();
    importador.init();
});

export default Importador;