import ClassSelect from '../../../components/select2.js';
import { getToken } from '../../../common/common.js';

class DatosLibro {

    constructor(domItem, cargando, functions = {}) {

        this.domItem = domItem;

        this.checkPaginasPresupuesto = functions.checkPaginasPresupuesto;
        this.getDimensionLibro = functions.getDimensionLibro;
        this.calcularSolapas = functions.calcularSolapas;

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

        this.paginas = this.domItem.find('#paginas');
        this.tirada = this.domItem.find('#tirada');
        this.tamanio = new ClassSelect($("#papelFormatoId"), '/papel-formato/getSelect2', window.language.Presupuestos.formatoLibro);
        this.tamanioPersonalizado = this.domItem.find('#papelFormatoPersonalizado');
        this.anchoPersonalizado = this.domItem.find('#papelFormatoAncho');
        this.altoPersonalizado = this.domItem.find('#papelFormatoAlto');
        this.merma = this.domItem.find('#merma');
        this.mermaCubierta = this.domItem.find('#mermacubierta');
        this.solapasCubierta = this.domItem.find('#solapas');
        this.solapasSobrecubierta = this.domItem.find('#solapas_sobrecubierta');
        this.anchoSolapasCubierta = this.domItem.find('#solapas_ancho');
        this.anchoSolapasSobrecubierta = this.domItem.find('#solapas_ancho_sobrecubierta');

        this.divSolapasCubierta = this.domItem.find('#div_solapas_ancho');
        this.divSolapasSobrecubierta = this.domItem.find('#div_solapas_ancho_sobrecubierta');

        this.acabadoCubierta = new ClassSelect($("#acabado_cubierta_id"),
            '/serviciosacabados/getacabados',
            '',
            false,
            {
                [this.csrf_token]: this.csrf_hash,
                "cubierta": 1
            }
        );
        this.acabadoSobrecubierta = new ClassSelect($("#acabado_sobrecubierta_id"),
            '/serviciosacabados/getacabados',
            '',
            false,
            {
                [this.csrf_token]: this.csrf_hash,
                "sobrecubierta": 1
            }
        );
        this.acabadoFaja = new ClassSelect($("#acabado_faja_id"),
            '/serviciosacabados/getacabados',
            '',
            false,
            {
                [this.csrf_token]: this.csrf_hash,
                "sobrecubierta": 1
            }
        );

        this.retractilado = this.domItem.find('#retractilado');
        this.retractilado5 = this.domItem.find('#retractilado5');
        this.prototipo = this.domItem.find('#prototipo');
        this.ferro = this.domItem.find('#ferro');
        this.ferroDigital = this.domItem.find('#ferroDigital');
        this.marcapaginas = this.domItem.find('#marcapaginas');

        this.faja = this.domItem.find('#faja');
        this.fajaAlto = this.domItem.find('#faja_alto');
        this.fajaSolapasAncho = this.domItem.find('#faja_solapas_ancho');
        this.div_faja = this.domItem.find('.faja-div');

        this.cargando = cargando;
    }

    init() {

        const self = this;

        this.tamanio.init();
        this.acabadoCubierta.init();
        this.acabadoSobrecubierta.init();
        this.acabadoFaja.init();

        this.acabadoCubierta.item.on('select2:select', function () {

            if (this.cargando){
                return;
            }

            if (self.acabadoCubierta.getVal() == 0) {
                $(document).trigger('remove-servicio-lineas', 'acabadoCubierta');
            }
            else {
                const table = $('#tableLineasPresupuesto').DataTable();
                const rows = table.rows().data();
                for (let i = 0; i < rows.length; i++) {
                    const rowData = rows[i];
                    if (rowData.row_id === 'lp_cubierta') {
                        $(document).trigger('add-servicio-lineas', 'acabadoCubierta');
                        break;
                    }
                }
            }
        });

        this.acabadoSobrecubierta.item.on('select2:select', function () {

            if (this.cargando){
                return;
            }                

            if (self.acabadoCubierta.getVal() == 0) {
                $(document).trigger('remove-servicio-lineas', 'acabadoSobrecubierta');
            }
            else {
                const table = $('#tableLineasPresupuesto').DataTable();
                const rows = table.rows().data();
                for (let i = 0; i < rows.length; i++) {
                    const rowData = rows[i];
                    if (rowData.row_id === 'lp_sobrecubierta') {
                        $(document).trigger('add-servicio-lineas', 'acabadoSobrecubierta');
                        break;
                    }
                }
            }
        });
        
        this.acabadoFaja.item.on('select2:select', function () {

            if (this.cargando)
                return;

            if (self.acabadoFaja.getVal() == 0) {
                $(document).trigger('remove-servicio-lineas', 'acabadoFaja');
            }
            else {
                const table = $('#tableLineasPresupuesto').DataTable();
                const rows = table.rows().data();
                for (let i = 0; i < rows.length; i++) {
                    const rowData = rows[i];
                    if (rowData.row_id === 'lp_faja') {
                        $(document).trigger('add-servicio-lineas', 'acabadoFaja');
                        break;
                    }
                }
            }
        });

        if (window.location.href.includes("edit")) {
            this.retractilado.on('change', this.checkRetractilado.bind(this));
            this.retractilado5.on('change', this.checkRetractilado.bind(this));
            this.ferro.on('change', this.changeFerro.bind(this));
            this.prototipo.on('change', this.changePrototipo.bind(this));
            this.ferroDigital.on('change', this.changeFerroDigital.bind(this));

            this.tamanio.item.on('select2:select', this.changeFormato.bind(this));
            $('.formato_libro').on('change', this.changeFormato.bind(this));

            if ($('#tipo_impresion_id').val() != 1 && $('#tipo_impresion_id').val() != 3 &&
                $('#tipo_impresion_id').val() != 5 && $('#tipo_impresion_id').val() != 7) {
                this.solapasCubierta.on('change', this.changeSolapasCubierta.bind(this));
            }

            this.solapasSobrecubierta.on('change', this.changeSolapasSobrecubierta.bind(this));
            this.tamanioPersonalizado.on('change', this.changeTipoTamanio.bind(this));

            this.anchoSolapasCubierta.on('change', this.changeAnchoSolapasCubierta.bind(this));
            this.anchoSolapasSobrecubierta.on('change', this.changeAnchoSolapasSobrecubierta.bind(this));
            this.fajaSolapasAncho.on('change', this.changeAnchoSolapasFaja.bind(this));

            this.paginas.on('change', this.changePaginas.bind(this));
            this.tirada.on('change', this.changeTirada.bind(this));

            this.anchoSolapasCubierta.on('focusout', this.checkMinMaxInput.bind(this));
            this.anchoSolapasSobrecubierta.on('focusout', this.checkMinMaxInput.bind(this));
            this.fajaSolapasAncho.on('focusout', this.checkMinMaxInput.bind(this));
            this.fajaAlto.on('focusout', this.checkMinMaxInput.bind(this));

            this.faja.on('change', this.changeFaja.bind(this));
        }
    }

    changeFaja() {

        if (this.faja.prop('checked')) {
            this.div_faja.removeClass('d-none');
            $('#compFaja').val(1).trigger('change');

            if (this.cargando)
                return;

            $(document).trigger('add-servicio-lineas', 'solapas_faja');
            $('.acabado-faja').removeClass('d-none');
        }
        else {
            this.div_faja.addClass('d-none');
            $('#compFaja').val(0).trigger('change');
            $('.acabado-faja').addClass('d-none');

            if (this.cargando)
                return;

            $(document).trigger('remove-servicio-lineas', 'acabadoFaja');
            $(document).trigger('remove-servicio-lineas', 'solapas_faja');
            $(document).trigger('remove-servicio-lineas', 'solapas_grandes_faja');

        }
    }

    checkMinMaxInput(event) {

        if (this.cargando)
            return;

        const el = event.target;
        if (el.value != "") {
            if (parseInt(el.value) < parseInt(el.min)) {
                el.value = el.min;
            }
            if (parseInt(el.value) > parseInt(el.max)) {
                el.value = el.max;
            }
        }
        else {
            el.value = el.min;
        }
    }


    changeFerro() {

        if (this.cargando)
            return;

        if (this.ferro.prop('checked')) {
            $(document).trigger('add-servicio-lineas', 'ferro');
        }
        else {
            $(document).trigger('remove-servicio-lineas', 'ferro');
        }
    }

    changeFerroDigital() {

        if (this.cargando)
            return;

        if (this.ferro.prop('checked')) {
            $(document).trigger('add-servicio-lineas', 'ferroDigital');
        }
        else {
            $(document).trigger('remove-servicio-lineas', 'ferroDigital');
        }
    }

    changePrototipo() {

        if (this.cargando)
            return;

        if (this.prototipo.prop('checked')) {
            $(document).trigger('add-servicio-lineas', 'prototipo');
        }
        else {
            $(document).trigger('remove-servicio-lineas', 'prototipo');
        }
    }


    checkRetractilado(event) {

        if (this.cargando)
            return;

        switch (event.currentTarget.id) {
            case 'retractilado':
                if ($('#' + event.currentTarget.id).prop('checked')) {
                    $('#retractilado5').prop('checked', false);
                    $(document).trigger('remove-servicio-lineas', 'retractilado5');
                    $(document).trigger('add-servicio-lineas', 'retractilado');
                }
                else
                    $(document).trigger('remove-servicio-lineas', 'retractilado');
                break;
            case 'retractilado5':
                if ($('#' + event.currentTarget.id).prop('checked')) {
                    $('#retractilado').prop('checked', false);
                    $(document).trigger('remove-servicio-lineas', 'retractilado');
                    $(document).trigger('add-servicio-lineas', 'retractilado5');
                }
                else
                    $(document).trigger('remove-servicio-lineas', 'retractilado5');
                break;
            default:
                break;
        }

    }


    changeFormato() {

        // Si es negro o color
        if ($('#tipoImpresion').select2('data')[0].id == 'negro' ||
            $('#tipoImpresion').select2('data')[0].id == 'color') {
            $('#compPaginasNegro').trigger('change')
        }
        // Si es negrohq o colorhq
        if ($('#tipoImpresion').select2('data')[0].id == 'negrohq' ||
            $('#tipoImpresion').select2('data')[0].id == 'colorhq') {
            $('#compPaginasNegrohq').trigger('change');
        }

        $('.solapas_cubierta').trigger('change');
        $('.solapas_sobrecubierta').trigger('change');

        this.checkPaginasPresupuesto();

        this.calcularSolapas();
        if ($('#faja_alto').length > 0 && $('#faja_alto').attr('max') != this.getDimensionLibro().alto) {
            $('#faja_alto').attr('max', this.getDimensionLibro().alto);
            $('#faja_alto').trigger('change');
            $('#faja_alto').closest('.mb-1').find('.form-text').text('Entre 50 y ' + this.getDimensionLibro().alto + ' mm');
        }

        $(document).trigger('update-presupuesto', {
            update_lineas: true,
            update_servicios: true,
            update_envios: true,
            update_resumen: true,
            update_tiradas_alternativas: true
        });
    }


    changeTipoTamanio() {

        if (this.tamanioPersonalizado.prop('checked')) {
            $('.tamanio-personalizado').removeClass('d-none');
            $('.tamanio-estandar').addClass('d-none');
            this.tamanio.setVal('');
            $("#label_papelFormatoId").text(
                window.language.Presupuestos.papelFormatoId + " (" +
                window.language.Presupuestos.papelFormatoAncho + " x " + window.language.Presupuestos.papelFormatoAncho + ")*");
        }
        else {
            this.anchoPersonalizado.val("");
            this.altoPersonalizado.val("");
            $('.tamanio-personalizado').addClass('d-none');
            $('.tamanio-estandar').removeClass('d-none');
            $("#label_papelFormatoId").text(
                window.language.Presupuestos.papelFormatoId + '*');
        }

        $(document).trigger('update-presupuesto', {
            update_lineas: true,
            update_servicios: false,
            update_envios: false,
            update_resumen: false,
            update_tiradas_alternativas: false
        });
    }


    changeSolapasCubierta() {

        setTimeout(() => {
            if (this.solapasCubierta.prop('checked')) {
                $('#div_solapas_ancho').removeClass('d-none');
                if (this.cargando)
                    return;
                $(document).trigger('add-servicio-lineas', 'solapas_cubierta');
            }
            else {
                $('#div_solapas_ancho').addClass('d-none');
                if (this.cargando)
                    return;
                $(document).trigger('remove-servicio-lineas', 'solapas_cubierta');
                $(document).trigger('remove-servicio-lineas', 'solapas_grandes_cubierta');
            }
        }, 100);

        // para que se actualice el comparador
        $('#compCarasCubierta').trigger('change');
    }

    changeAnchoSolapasCubierta() {

        // para que se actualice el comparador
        $('#compCarasCubierta').trigger('change');

        if (this.cargando)
            return;

        if (this.checkSolapasGrandes('cubierta')) {
            $(document).trigger('add-servicio-lineas', 'solapas_grandes_cubierta');
        }
        else {

            $(document).trigger('remove-servicio-lineas', 'solapas_grandes_cubierta');
        }
    }


    changeSolapasSobrecubierta() {

        if (this.solapasSobrecubierta.prop('checked')) {
            this.divSolapasSobrecubierta.removeClass('d-none');
            if (this.cargando)
                return;
            $(document).trigger('add-servicio-lineas', 'solapas_sobrecubierta');
        }
        else {
            this.divSolapasSobrecubierta.addClass('d-none');
            if ($('#compSobrecubierta').length) {
                $('#compSobrecubierta').val(0).trigger('change');
            }
            if (this.cargando)
                return;
            $(document).trigger('remove-servicio-lineas', 'solapas_sobrecubierta');
            $(document).trigger('remove-servicio-lineas', 'solapas_grandes_sobrecubierta');
        }
    }


    changeAnchoSolapasSobrecubierta() {


        // para que se actualice el comparador
        if ($('#compGramajeSobrecubierta').select2('data') && $('#compGramajeSobrecubierta').select2('data').length > 0)
            $('#compGramajeSobrecubierta').trigger('change');

        if (this.cargando)
            return;

        if (this.checkSolapasGrandes('sobrecubierta')) {
            $(document).trigger('add-servicio-lineas', 'solapas_grandes_sobrecubierta');
        }
        else {
            $(document).trigger('remove-servicio-lineas', 'solapas_grandes_sobrecubierta');
        }
    }


    changeAnchoSolapasFaja() {

        // para que se actualice el comparador
        if ($('#compGramajeFaja').select2('data') && $('#compGramajeFaja').select2('data').length > 0) {
            $('#compGramajeFaja').trigger('change');
        }

        if (this.cargando)
            return;

        if (this.checkSolapasGrandes('faja')) {
            $(document).trigger('add-servicio-lineas', 'solapas_grandes_faja');
        }
        else {
            $(document).trigger('remove-servicio-lineas', 'solapas_grandes_faja');
        }
    }

    checkSolapasGrandes(elemento) {

        const ancho_libro = 2 * this.getDimensionLibro().ancho;
        let ancho_solapas = 0.0;
        let lomo = 0.0;
        if (elemento == 'cubierta') {
            ancho_solapas = 2 * parseFloat($('#solapas_ancho').val());
            lomo = parseFloat($('#lomo_cubierta').val());
        }
        else if (elemento == 'sobrecubierta') {
            ancho_solapas = 2 * parseFloat($('#solapas_ancho_sobrecubierta').val());
            lomo = parseFloat($('#lomo_sobrecubierta').val());
        }
        else if (elemento == 'faja') {
            ancho_solapas = 2 * parseFloat($('#faja_solapas_ancho').val());
            lomo = parseFloat($('#lomo_sobrecubierta').val());
        }
        else
            return false;

        if (ancho_libro + ancho_solapas + lomo > 630)
            return true;
        else
            return false
    }

    changePaginas() {

        if ($('#tipo_impresion_id').val() == 21) {
            if (parseInt($('#paginas').val()) > 80) {
                $('#paginas').val(80)
            }
        }

        if (window.location.href.includes('edit')) {

            this.checkPaginasPresupuesto();

            // Si es negro o color
            if ($('#tipoImpresion').select2('data')[0].id == 'negro' ||
                $('#tipoImpresion').select2('data')[0].id == 'color') {
                $('#compPaginasNegro').val(parseInt($('#paginas').val()) - parseInt($('#compPaginasColor').val()));
                $('#compPaginasNegro').trigger('change')
            }
            // Si es negrohq o colorhq
            if ($('#tipoImpresion').select2('data')[0].id == 'negrohq' ||
                $('#tipoImpresion').select2('data')[0].id == 'colorhq') {
                $('#compPaginasNegrohq').val(parseInt($('#paginas').val()) - parseInt($('#compPaginasColorhq').val()));
                $('#compPaginasNegrohq').trigger('change');
            }


            $(document).trigger('update-presupuesto', {
                update_lineas: true,
                update_servicios: true,
                update_envios: true,
                update_resumen: true,
                update_tiradas_alternativas: true
            });

        }
    }

    updateComparador() {

        if ($("#compPaginasNegro").hasClass('d-none')) {
            $('#compPaginasNegrohq').trigger('change');
        }
        else {
            $('#compPaginasNegro').trigger('change');
        }
        $('#compCarasCubierta').trigger('change');

        if ($('#compSobrecubierta').length) {
            $('#compSobrecubierta').trigger('change');
        }
        if ($('#compCarasGuardas').length) {
            $('#compCarasGuardas').trigger('change');
        }
    }

    changeTirada(update_tiradas_alternativas = true) {

        this.calcular_mermas();

        this.updateComparador();

        const url = window.location.href;
        

        if (url.includes('edit')) {
            $(document).trigger('update-presupuesto', {
                update_lineas: true,
                update_servicios: true,
                update_envios: false,
                update_resumen: false,
                update_tiradas_alternativas: false
            });

            $(document).trigger('ckeck-lineas-envios');
        }
    }

    calcular_mermas() {

        const tirada = parseInt($('#tirada').val());
        const POD = parseInt($('#POD').val());
        let merma = 0;
        let htmlString = '';

        if (tirada > POD) {
            merma = tirada * 0.1 <= POD ? tirada * 0.1 : POD;
        }
        else {
            let merma_lineas = []
            const table = $('#tableLineasPresupuesto').DataTable();
            const rows = table.rows().data();
            for (let i = 0; i < rows.length; i++) {
                const rowData = rows[i];
                if (rowData.row_id != 'lp_guardas' && rowData.row_id != 'lp_cubierta' && rowData.row_id != 'lp_sobrecubierta') {
                    const formas_linea = parseInt($('#isCosido').val()) == 0 ? parseInt(rowData.formas) : parseInt(rowData.formas) / 2;
                    if (formas_linea > tirada)
                        merma_lineas.push(formas_linea - tirada);
                    else {
                        var total_pliegos = Math.ceil(1.0 * tirada / formas_linea);
                        var total_formas = total_pliegos * formas_linea;
                        merma_lineas.push(total_formas - tirada);

                    }
                }
            }


            if (merma_lineas.length > 0)
                merma = Math.max(...merma_lineas)
            else {
                htmlString = `
                    <div class="alert alert-warning d-flex align-items-baseline" role="alert">
                        <span class="alert-icon alert-icon-lg text-primary me-2">
                            <i class="ti ti-bell ti-sm"></i>
                        </span>
                        <div class="d-flex flex-column ps-1">
                            <h5 class="alert-heading mb-2">` +
                    window.language.Presupuestos.validation.no_lp_for_merma +
                    `</h5>
                        </div>
                    </div>`;


                merma = 0

            }

        }
        $('#mermacubierta').val(parseInt(merma))
        $('#merma').val(parseInt(merma))
        $('#alert-datosLibro').html(htmlString)
    }


    cargarDatos(datos) {

        this.paginas.val(datos.paginas);
        this.tirada.val(datos.tirada);
        this.calcular_mermas();
        if (datos.papelFormatoPersonalizado) {
            this.tamanioPersonalizado.prop('checked', true);
            $(".tamanio-personalizado").removeClass('d-none');
            $(".tamanio-estandar").addClass('d-none');
            this.anchoPersonalizado.val(datos.papelFormatoAncho);
            this.altoPersonalizado.val(datos.papelFormatoAlto);
        }
        else {
            $(".tamanio-personalizado").addClass('d-none');
            $(".tamanio-estandar").removeClass('d-none');
            this.tamanio.setOption(datos.papelFormatoId, datos.papelFormatoNombre);
        }

        this.merma.val(datos.merma);
        this.mermaCubierta.val(datos.mermaCubierta);

        if ($('#tipo_impresion_id').val() == 1 || $('#tipo_impresion_id').val() == 3 ||
            $('#tipo_impresion_id').val() == 5 || $('#tipo_impresion_id').val() == 7) {
            $(".solapas-cubierta-div").addClass('d-none');
        }
        else {
            if (datos.solapasCubierta) {
                this.solapasCubierta.prop('checked', true);
                this.anchoSolapasCubierta.val(datos.solapasCubiertaAncho);
                this.divSolapasCubierta.removeClass('d-none');
            }
            else {
                this.solapasCubierta.prop('checked', false);
                this.anchoSolapasCubierta.val(60);
                this.divSolapasSobrecubierta.addClass('d-none');
            }
        }
        if (datos.solapasSobrecubierta) {
            this.solapasSobrecubierta.prop('checked', true);
            this.anchoSolapasSobrecubierta.val(datos.solapasSobrecubiertaAncho);
            $('#div_solapas_ancho_sobrecubierta').removeClass('d-none');
        }
        else {
            this.solapasSobrecubierta.prop('checked', false);
            this.anchoSolapasSobrecubierta.val(60);
            $('#div_solapas_ancho_sobrecubierta').addClass('d-none');
        }

        this.faja.prop('checked', datos.fajaColor);
        if (datos.fajaColor) {
            this.div_faja.removeClass('d-none');
            this.fajaAlto.val(datos.fajaColorAlto).trigger('change');
            this.fajaSolapasAncho.val(datos.fajaColorSolapasAncho).trigger('change');
            $('.acabado-faja').removeClass('d-none');
        }


        this.acabadoCubierta.setOption(datos.acabadoCubierta.id, datos.acabadoCubierta.text);

        if ($('#tipo_impresion_id').val() == 5 || $('#tipo_impresion_id').val() == 6 ||
            $('#tipo_impresion_id').val() == 7 || $('#tipo_impresion_id').val() == 8
            || $('#tipo_impresion_id').val() == 21) {
            $(".impresion-con-sobrecubierta").addClass('d-none');
        }
        else {

            this.acabadoSobrecubierta.setOption(datos.acabadoSobrecubierta.id, datos.acabadoSobrecubierta.text);
        }

        this.acabadoFaja.setOption(datos.acabadoFaja.id, datos.acabadoFaja.text);

        this.retractilado.prop('checked', datos.retractilado);
        this.retractilado5.prop('checked', datos.retractilado5);
        this.prototipo.prop('checked', datos.prototipo);
        this.ferro.prop('checked', datos.ferro);
        this.ferroDigital.prop('checked', datos.ferroDigital);
        this.marcapaginas.prop('checked', datos.marcapaginas);
    }
}


export default DatosLibro;