// Global parameters
var _isCosido = true;
var pvObj;

var sangradoTexto = "Sangrado 5 mm";
var sangradoValor = parseFloat(5);  // mm
var offsetSolapaValor = parseFloat(0);  // mm


function previewInteriorPlana(lpTagName) {

    // Local parameters
    let guardaV = 0;
    guardaH = 0;
    let styleText = {size: 12, family: 'Public Sans'};

    // Get the preview Object parameters
    getObjetoLP(lpTagName);

    // Configuracion de las guardas
    // Guarda vertical
    if (pvObj.nFormasV > 1) {
        guardaV = 3;
    }
    // Guarda horizontal
    if (pvObj.nFormasH > 1) {
        guardaH = 3;
    }
    // Constantes relativas a las dimnesiones de la forma
    let LVo = pvObj.altoForma / 2;
    let LHo = pvObj.anchoForma / 2;

    // Clear the canvas element
    $('#pv_' + pvObj.idIndex + '_shape').empty();
    // Get the element for placing the graphical elements
    var divPlana = document.getElementById('pv_' + pvObj.idIndex + '_shape');
    var _pvPlana = new Two({fitted: true}).appendTo(divPlana);
    // Calculate the center of the canvas element
    var origenPlana = new Two.Vector(_pvPlana.width / 2, _pvPlana.height / 2);

    var areaMaquinaPlana = _pvPlana.makeRectangle(
        origenPlana.x,
        origenPlana.y,
        pvObj.anchoMaquina,
        pvObj.altoMaquina);
    areaMaquinaPlana.stroke = 'black';
    areaMaquinaPlana.fill = '#E69F6E';
    areaMaquinaPlana.linewidth = 1;

    var areaImpresionPlana = _pvPlana.makeRectangle(
        origenPlana.x,
        origenPlana.y,
        pvObj.anchoImpresion,
        pvObj.altoImpresion);
    areaImpresionPlana.stroke = 'red';
    areaImpresionPlana.fill = '#FCEAF1';
    areaImpresionPlana.linewidth = 1;

    var formas = [];

    for (let iV = 0; iV < pvObj.nFormasV; iV++) {

        for (let iH = 0; iH < pvObj.nFormasH; iH++) {

            let _offsetX = ((((pvObj.nFormasH - 1) - 2 * iH) * LHo) + (((pvObj.nFormasH - 1) / 2 - iH) * guardaH));
            let _offsetY = ((((pvObj.nFormasV - 1) - 2 * iV) * LVo) + (((pvObj.nFormasV - 1) / 2 - iV) * guardaV));

            formas[iV + iH] = _pvPlana.makeRectangle(
                origenPlana.x + _offsetX,
                origenPlana.y + _offsetY,
                pvObj.anchoForma,
                pvObj.altoForma);
            formas[iV + iH].stroke = 'grey';
            formas[iV + iH].fill = '#F4F8F2';
            formas[iV + iH].linewidth = 1;

            // Texts
            _pvPlana.makeText(pvObj.altoForma, (origenPlana.x + _offsetX) + (pvObj.anchoForma / 2 - 25), (origenPlana.y + _offsetY), styleText);
            _pvPlana.makeText(pvObj.anchoForma, (origenPlana.x + _offsetX), (origenPlana.y + _offsetY) + (pvObj.altoForma / 2 - 15), styleText);

        }
    }
    _pvPlana.update();
}

function previewRotativa(lpTagName) {

    // Local parameters
    let styleText = {size: 12, family: 'Public Sans'};
    let margenTop = 3;
    let guardaV = 0;
    let guardaH = 0;

    // Get the preview Object parameters
    getObjetoLP(lpTagName);

    // Calculos
    // Configuracion de las guardas
    // Guarda vertical
    if (pvObj.nFormasV > 1) {
        guardaV = 3;
    }
    // Guarda horizontal
    if (pvObj.nFormasH > 1) {
        guardaH = 3;
    }
    // Constantes relativas al libro
    let LVo = pvObj.altoForma / 2;
    let LHo = pvObj.anchoForma / 2;

    // offset Y
    let nTopForms = (pvObj.altoImpresion / 2.0 - margenTop) / (LVo + guardaV);
    let yOffset = LVo * getDecimalPart(nTopForms);

    //console.log(yOffset);

    // Clear the canvas element
    $('#pv_' + pvObj.idIndex + '_shape').empty();
    // Get the element for placing the graphical elements
    var divRotativa = document.getElementById('pv_' + pvObj.idIndex + '_shape');
    var _pvRotativa = new Two({fitted: true}).appendTo(divRotativa);
    // Calculate the center of the canvas element
    var origenRotativa = new Two.Vector(_pvRotativa.width / 2, _pvRotativa.height / 2);

    var areaMaquinaRotativa = _pvRotativa.makeRectangle(
        origenRotativa.x,
        origenRotativa.y,
        pvObj.anchoMaquina,
        pvObj.altoMaquina);
    areaMaquinaRotativa.stroke = 'black';
    areaMaquinaRotativa.fill = '#E69F6E';
    areaMaquinaRotativa.linewidth = 1;

    var areaImpresionRotativa = _pvRotativa.makeRectangle(
        origenRotativa.x,
        origenRotativa.y,
        pvObj.anchoImpresion,
        pvObj.altoImpresion);
    areaImpresionRotativa.stroke = 'red';
    areaImpresionRotativa.fill = '#FCEAF1';
    areaImpresionRotativa.linewidth = 1;

    var areaClickRotativa = _pvRotativa.makeRectangle(
        origenRotativa.x,
        origenRotativa.y - (pvObj.altoImpresion / 2 - pvObj.altoClick / 2),
        pvObj.anchoImpresion - 10,
        pvObj.altoClick);
    areaClickRotativa.stroke = 'blue';
    //areaClickRotativa.fill = '#FCEAF1';
    areaClickRotativa.linewidth = 2;

    var formas = [];

    for (let iV = 0; iV < pvObj.nFormasV; iV++) {

        for (let iH = 0; iH < pvObj.nFormasH; iH++) {

            let _offsetX = ((((pvObj.nFormasH - 1) - 2 * iH) * LHo) + (((pvObj.nFormasH - 1) / 2 - iH) * guardaH));
            let _offsetY = ((((pvObj.nFormasV - 1) - 2 * iV) * LVo) + (((pvObj.nFormasV - 1) / 2 - iV) * guardaV));

            formas[iV + iH] = _pvRotativa.makeRectangle(
                origenRotativa.x + _offsetX,
                (origenRotativa.y - yOffset) + _offsetY,
                pvObj.anchoForma,
                pvObj.altoForma);
            formas[iV + iH].stroke = 'grey';
            formas[iV + iH].fill = '#F4F8F2';
            formas[iV + iH].linewidth = 1;

            // Texts
            _pvRotativa.makeText(pvObj.altoForma, (origenRotativa.x + _offsetX) + (pvObj.anchoForma / 2 - 25), ((origenRotativa.y - yOffset) + _offsetY), styleText);
            _pvRotativa.makeText(pvObj.anchoForma, (origenRotativa.x + _offsetX), ((origenRotativa.y - yOffset) + _offsetY) + (pvObj.altoForma / 2 - 15), styleText);

        }

    }

    _pvRotativa.update();

}

function getDecimalPart(floatNumber) {
    let int_part = Math.trunc(floatNumber);
    let float_part = Number((floatNumber - int_part).toFixed(2));
    return float_part;
}


function previewEsquemaCubierta(lpTagName) {

    // Variables locales
    let altoLibro, anchoLibro, lomoLibro, anchoSolapa, anchoCubierta, altoSangrado, anchoSangrado;
    let styleCotas = {size: 12, family: 'Public Sans'};

    // Get the preview Object parameters
    getObjetoLP(lpTagName);

    // Definicion de los parametros del Esquema de Cubierta (EC)
    if (pvObj.anchoSolapa == 0) {
        anchoSangrado = 600;    // px
        altoSangrado = (anchoSangrado * 0.647 > 350) ? anchoSangrado * 0.647 : 350; // px
        altoLibro = altoSangrado * 0.97;
        anchoLibro = anchoSangrado * 0.419;
        anchoSolapa = 0;
        lomoLibro = anchoSangrado * 0.133;
        anchoCubierta = (2 * anchoLibro) + (2 * anchoSolapa) + lomoLibro;

    } else {
        anchoSangrado = 600;    // px
        altoSangrado = (anchoSangrado * 0.418 > 350) ? anchoSangrado * 0.418 : 350; // px
        altoLibro = altoSangrado * 0.95;
        anchoLibro = anchoSangrado * 0.28;
        anchoSolapa = anchoSangrado * 0.163;
        lomoLibro = anchoSangrado * 0.09;
        anchoCubierta = (2 * anchoLibro) + (2 * anchoSolapa) + lomoLibro;
    }

    // Clear the canvas element
    $('#pv_ec_shape').empty();
    // Get the element for placing the graphical elements
    var divEC = document.getElementById('pv_ec_shape');
    var previewEC = new Two({fitted: true}).appendTo(divEC);
    // Calculate the center of the canvas element
    var origenEC = new Two.Vector(previewEC.width / 2, previewEC.height / 2);

    var sangrado = previewEC.makeRectangle(
        origenEC.x,
        origenEC.y,
        anchoSangrado,
        altoSangrado
    );
    sangrado.stroke = 'black';
    sangrado.dashes = [5, 5];
    sangrado.fill = '#FCEAF1';
    sangrado.linewidth = 1;

    if (pvObj.anchoSolapa != 0) {
        var solapas = previewEC.makeRectangle(
            origenEC.x,
            origenEC.y,
            anchoCubierta,
            altoLibro);
        solapas.stroke = 'black';
        solapas.linewidth = 1;

        // Cotas Solapas
        var cotaSolapa2 = previewEC.makeDobleArrow(
            origenEC.x - anchoCubierta / 2,
            origenEC.y - (altoLibro / 3),
            origenEC.x - anchoLibro - lomoLibro / 2,
            origenEC.y - (altoLibro / 3),
            10);
        cotaSolapa2.linewidth = 2;
        var cotaSolapa1 = previewEC.makeDobleArrow(
            origenEC.x + anchoCubierta / 2,
            origenEC.y - (altoLibro / 3),
            origenEC.x + anchoLibro + lomoLibro / 2,
            origenEC.y - (altoLibro / 3),
            10);
        cotaSolapa1.linewidth = 2;

        // Textos Solapas
        let stylesSolapa = {size: 18, family: 'Public Sans'};
        previewEC.makeText("Solapa 1", origenEC.x + anchoLibro + (lomoLibro + anchoSolapa) / 2, origenEC.y, stylesSolapa);
        previewEC.makeText("Solapa 2", origenEC.x - anchoLibro - (lomoLibro + anchoSolapa) / 2, origenEC.y, stylesSolapa);
        // Textos Cotas Solapas
        previewEC.makeText(pvObj.anchoSolapa + " mm", origenEC.x - anchoLibro - (lomoLibro + anchoSolapa) / 2, origenEC.y - (altoLibro / 3) + 15, styleCotas);
        previewEC.makeText(pvObj.anchoSolapa + " mm", origenEC.x + anchoLibro + (lomoLibro + anchoSolapa) / 2, origenEC.y - (altoLibro / 3) + 15, styleCotas);

    }

    var libro = previewEC.makeRectangle(
        origenEC.x,
        origenEC.y,
        ((2 * anchoLibro) + lomoLibro),
        altoLibro);
    libro.stroke = 'black';
    libro.linewidth = 1;

    var lomo = previewEC.makeRectangle(
        origenEC.x,
        origenEC.y,
        lomoLibro,
        altoLibro);
    lomo.stroke = 'black';
    lomo.fill = '#F4F8F2';
    lomo.linewidth = 1;

    // Cotas
    var cotaAnchoCubierta = previewEC.makeDobleArrow(
        origenEC.x - (anchoSangrado / 2),
        origenEC.y + (altoLibro / 2) + 35,
        origenEC.x + (anchoSangrado / 2),
        origenEC.y + (altoLibro / 2) + 35,
        10);
    cotaAnchoCubierta.linewidth = 2;
    var cotaAltoLibro = previewEC.makeDobleArrow(
        origenEC.x + (anchoCubierta / 2) + 35,
        origenEC.y + (altoSangrado / 2),
        origenEC.x + (anchoCubierta / 2) + 35,
        origenEC.y - (altoSangrado / 2),
        10);
    cotaAltoLibro.linewidth = 2;
    var cotaLomo = previewEC.makeDobleArrow(
        origenEC.x - (lomoLibro / 2),
        origenEC.y + (altoLibro / 3),
        origenEC.x + (lomoLibro / 2),
        origenEC.y + (altoLibro / 3),
        10);
    cotaLomo.linewidth = 2;
    var cotaContraportada = previewEC.makeDobleArrow(
        origenEC.x - (lomoLibro / 2 + anchoLibro),
        origenEC.y - (altoLibro / 3),
        origenEC.x - (lomoLibro / 2),
        origenEC.y - (altoLibro / 3),
        10);
    cotaContraportada.linewidth = 2;
    var cotaPortada = previewEC.makeDobleArrow(
        origenEC.x + (lomoLibro / 2),
        origenEC.y - (altoLibro / 3),
        origenEC.x + (lomoLibro / 2 + anchoLibro),
        origenEC.y - (altoLibro / 3),
        10);
    cotaPortada.linewidth = 2;


    // Textos:
    // Titulos generales
    let stylesEC = {size: 22, weight: 'bold', family: 'Public Sans'};
    previewEC.makeText("Portada", origenEC.x + (lomoLibro + anchoLibro) / 2, origenEC.y, stylesEC);
    previewEC.makeText("Contraportada", origenEC.x - (lomoLibro + anchoLibro) / 2, origenEC.y, stylesEC);
    let a = previewEC.makeText("Lomo", origenEC.x, origenEC.y, stylesEC).rotation = -Math.PI / 2;
    // Sangrados
    let styleSangrado = {size: 10, family: 'Public Sans', style: 'italic', fill: 'red'};
    previewEC.makeText(sangradoTexto, origenEC.x, origenEC.y + (altoLibro / 2 + 20), styleSangrado);
    previewEC.makeText(sangradoTexto, origenEC.x, origenEC.y - (altoLibro / 2 + 20), styleSangrado);
    previewEC.makeText(sangradoTexto, origenEC.x + (lomoLibro / 2 + anchoLibro + anchoSolapa + 20), origenEC.y, styleSangrado).rotation = -Math.PI / 2;
    previewEC.makeText(sangradoTexto, origenEC.x - (lomoLibro / 2 + anchoLibro + anchoSolapa + 20), origenEC.y, styleSangrado).rotation = -Math.PI / 2;
    // Cotas
    previewEC.makeText(pvObj.lomoLibro + " mm", origenEC.x, origenEC.y + (altoLibro / 3) + 15, styleCotas);
    previewEC.makeText(pvObj.anchoLibro + offsetSolapaValor + " mm", origenEC.x - (lomoLibro / 2 + anchoLibro / 2), origenEC.y - (altoLibro / 3) + 15, styleCotas);
    previewEC.makeText(pvObj.anchoLibro + offsetSolapaValor + " mm", origenEC.x + (lomoLibro / 2 + anchoLibro / 2), origenEC.y - (altoLibro / 3) + 15, styleCotas);
    previewEC.makeText(pvObj.altoLibro + (2 * sangradoValor) + " mm", origenEC.x + (lomoLibro / 2 + anchoLibro + anchoSolapa) + 50, origenEC.y, styleCotas).rotation = -Math.PI / 2;
    previewEC.makeText((2 * pvObj.anchoLibro) + (2 * (pvObj.anchoSolapa + offsetSolapaValor)) + pvObj.lomoLibro + (2 * sangradoValor) + " mm",
        origenEC.x,
        origenEC.y + (altoLibro / 2) + 50,
        styleCotas);

    previewEC.update();

}

function getLomoLibro() {
    let _anchoLomo = 0;
    $("#tableLineasPresupuesto tbody tr:visible td input[id*='_lomo']").each(function () {
        _anchoLomo += parseFloat($(this).val());
    });

    return parseFloat(_anchoLomo.toFixed(2));
}


function getObjetoLP(lpName) {

    let rowData = null;

    $('#tableLineasPresupuesto').DataTable().rows().every(function (rowIdx, tableLoop, rowLoop) {

        let lineaPresupuestoId = this.data().row_id;

        switch (lpName) {
            case 'bn':
            case 'bnhq':
            case 'color':
            case 'colorhq':
            case 'cubierta':
            case 'rot_bn':
            case 'rot_color':
                if (lineaPresupuestoId.indexOf(lpName) >= 0) {
                    rowData = this.data();
                }
                break;
            case 'ec':
                if (lineaPresupuestoId.indexOf('cubierta') >= 0) {
                    rowData = this.data();
                }
                break;
            default:
                //console.log(lineaPresupuestoId);
                break;
        }

        //console.log(rowData);
    });


    pvObj = {
        idIndex: lpName,
        gramajeLibro: parseInt(rowData.gramaje),
        manoLP: parseFloat(rowData.lomo),
        lomoLibro: getLomoLibro(),
        anchoSolapa: parseFloat($('#solapas_ancho').val()),
        nFormas: parseInt(rowData.formas),
        nFormasH: parseInt(rowData.formas_v),
        nFormasV: parseInt(rowData.formas_h),
        orientacionFormas: rowData.formas_orientacion,
        altoMaquina: parseFloat(rowData.maquina_alto),
        anchoMaquina: parseFloat(rowData.maquina_ancho),
        altoImpresion: parseFloat(rowData.maquina_impresion_alto),
        anchoImpresion: parseFloat(rowData.maquina_impresion_ancho),
        altoLibro: getDimensionLibro().alto,
        anchoLibro: getDimensionLibro().ancho
    };

    // Printing shape definition
    pvObj.anchoForma = (_isCosido) ? 2 * pvObj.anchoLibro : pvObj.anchoLibro;
    pvObj.altoForma = pvObj.altoLibro;

    // Update preview info fields
    let pvName = '#pv_' + lpName;
    $(pvName + '_pg').attr("href", $(pvName + '_pg').attr('sk-url') + rowData.papel);
    $(pvName + '_pi').attr("href", $(pvName + '_pi').attr('sk-url') + rowData.papel_impresion_id);
    $(pvName + '_mi').attr("href", $(pvName + '_mi').attr('sk-url') + rowData.maquina_id);

    $(pvName + '_gramaje').text(pvObj.gramajeLibro);
    $(pvName + '_mano').text(pvObj.manoLP);
    $(pvName + '_solapas').text(pvObj.anchoSolapa);
    $(pvName + '_maquina').text(pvObj.anchoMaquina + "x" + pvObj.altoMaquina);
    $(pvName + '_maquina_impresion').text(pvObj.anchoImpresion + "x" + pvObj.altoImpresion);
    $(pvName + '_libro').text(pvObj.anchoLibro + "x" + pvObj.altoLibro);
    $(pvName + '_forma').text(pvObj.anchoForma + "x" + pvObj.altoForma);
    $(pvName + '_nFormas').text(pvObj.nFormas);

    if (pvObj.anchoSolapa != 0) {
        $('.pv-solapas').show();
        offsetSolapaValor = parseFloat(3); // 3mm

    } else {
        $('.pv-solapas').hide();
        offsetSolapaValor = parseFloat(0);  // No offset
    }

    // Custom overwrites
    switch (pvObj.idIndex) {
        case 'cubierta':
            pvObj.anchoForma = ((2 * pvObj.anchoLibro) + (2 * (pvObj.anchoSolapa + offsetSolapaValor)) + pvObj.lomoLibro);
            $(pvName + '_forma').text(pvObj.anchoForma + "x" + pvObj.altoForma);
            break;
        case 'ec':
            $(pvName + '_pg').attr("href", $(pvName + '_pg').attr('sk-url') + rowData.papel);
            $(pvName + '_pi').attr("href", $(pvName + '_pi').attr('sk-url') + rowData.papel_impresion_id);
            $(pvName + '_mi').attr("href", $(pvName + '_mi').attr('sk-url') + rowData.maquina_id);
            $('#pv_ec_lomo').text(pvObj.lomoLibro);
            break;

        case 'rot_bn':
        case 'rot_color':
            if ((pvObj.anchoImpresion / pvObj.altoForma) > (pvObj.anchoImpresion / pvObj.anchoForma)) {
                let auxReg = pvObj.anchoForma;
                pvObj.anchoForma = pvObj.altoForma;
                pvObj.altoForma = auxReg;
            }
            $(pvName + '_forma').text(pvObj.anchoForma + "x" + pvObj.altoForma);
            pvObj.altoClick = isNaN(parseFloat(rowData.alto_click))?305:parseFloat(rowData.alto_click);
            pvObj.nFormasH = Math.trunc(pvObj.anchoImpresion / pvObj.anchoForma);
            pvObj.nFormasV = Math.trunc((pvObj.altoImpresion - 3) / (pvObj.altoForma + 4));
            break;

        case 'bn':
        case 'bnhq':
        case 'color':
        case 'colorhq':
            // Conditional assignements depending on rotation of the printing shape
            if (pvObj.orientacionFormas == 'v') {
                let auxReg = pvObj.altoForma;
                pvObj.altoForma = pvObj.anchoForma;
                pvObj.anchoForma = auxReg;
            }
            $(pvName + '_forma').text(pvObj.anchoForma + "x" + pvObj.altoForma);
            break;

        default:
            break;
    }
}


function getVisibleTabs() {

    // Clear all existing tabs
    $('*[id*=tab-pv-]').each(function () {
        $(this).hide();
        $(this).children('.active').each(function () {
            $(this).removeClass('active');
        });

        $('*[id*=pv_]').each(function () {
            $(this).removeClass("active show");
        });

    });

    // Enable active tabs
    $('#tableLineasPresupuesto').DataTable().rows().every(function (rowIdx, tableLoop, rowLoop) {
        let lpName = this.data().row_id.replace('lp_', '');
        let tabName = lpName.replace('_', '-');
        //console.log(lpName);
        switch (lpName) {
            case 'bn':
            case 'bnhq':
            case 'color':
            case 'colorhq':
            case 'rot_bn':
            case 'rot_color':
                $("#tab-pv-" + tabName).show();
                break;

            case 'cubierta':
                $("#tab-pv-" + tabName).show();
                $("#tab-pv-esquema-" + tabName).show();
                break;

            default:
                break;
        }

    });


}


