/**
 * TEMPLATE: dataset-combo.js
 * =============================================
 * Snippet para popular combos (select) via dataset
 * no lado CLIENT-SIDE (custom.js).
 *
 * QUANDO USAR:
 * - Quando o select precisa de filtros dinamicos
 *   (ex: combo B depende da selecao do combo A)
 * - Quando precisa formatar as opcoes de modo especial
 * - Quando quer carregar sob demanda (lazy load)
 *
 * QUANDO NAO USAR:
 * - Para combos simples e estaticos, use o atributo
 *   dataset="..." direto no HTML do select:
 *   <select dataset="ds_nome" datasetkey="cod"
 *           datasetvalue="descricao" addBlankLine="true">
 *
 * PADRAO DE PRODUCAO (baseado em VIPal, BOMAG, PROLUX):
 * - Usa DatasetFactory no server-side (displayFields)
 *   para popular via form.setValue em selects hidden
 * - OU usa FLUIGC.dataService no client-side (custom.js)
 *   para popular selects com filtros dinamicos
 */

// =============================================
// OPCAO 1: CLIENT-SIDE COM FLUIGC.dataService
// Use no custom.js (roda no navegador)
// =============================================

/**
 * Popula um select com dados de um dataset Fluig.
 * @param {string} seletorSelect - Seletor jQuery do select (#id ou [name=...])
 * @param {string} datasetId - ID do dataset Fluig
 * @param {string} colValor - Coluna usada como value da option
 * @param {string} colTexto - Coluna usada como texto da option
 * @param {object} filtros - Objeto com filtros {campo: valor} (opcional)
 */
function popularComboDataset(seletorSelect, datasetId, colValor, colTexto, filtros) {
    var $select = $(seletorSelect);
    $select.empty().append('<option value="">Selecione</option>');

    var constraints = [];
    if (filtros) {
        for (var campo in filtros) {
            if (filtros.hasOwnProperty(campo)) {
                constraints.push(
                    DatasetFactory.createConstraint(
                        campo, filtros[campo], filtros[campo], ConstraintType.MUST
                    )
                );
            }
        }
    }

    var dataset = DatasetFactory.getDataset(
        datasetId,
        null,
        constraints.length > 0 ? constraints : null,
        null
    );

    if (dataset && dataset.values) {
        for (var i = 0; i < dataset.values.length; i++) {
            var row = dataset.values[i];
            var valor = row[colValor] || "";
            var texto = row[colTexto] || "";
            $select.append('<option value="' + valor + '">' + texto + '</option>');
        }
    }
}

// Exemplo de uso no $(document).ready:
// popularComboDataset('#centro_custo', 'ds_centros_custo', 'codigo', 'descricao');

// =============================================
// OPCAO 2: COMBO DEPENDENTE (cascata)
// Combo B recarrega quando Combo A muda
// =============================================

/**
 * Inicializa combo em cascata.
 * Quando comboPai muda, recarrega comboFilho filtrando pelo valor selecionado.
 *
 * @param {string} seletorPai - Seletor jQuery do combo pai
 * @param {string} seletorFilho - Seletor jQuery do combo filho
 * @param {string} datasetId - Dataset que alimenta o combo filho
 * @param {string} colFiltro - Coluna do dataset para filtrar
 * @param {string} colValor - Coluna usada como value
 * @param {string} colTexto - Coluna usada como texto
 */
function inicializarComboCascata(seletorPai, seletorFilho, datasetId, colFiltro, colValor, colTexto) {
    $(seletorPai).on('change', function () {
        var valorPai = $(this).val();
        var $filho = $(seletorFilho);

        $filho.empty().append('<option value="">Selecione</option>');

        if (!valorPai) return;

        var filtros = {};
        filtros[colFiltro] = valorPai;

        popularComboDataset(seletorFilho, datasetId, colValor, colTexto, filtros);
    });
}

// Exemplo de uso:
// inicializarComboCascata(
//     '#departamento',       // combo pai
//     '#centro_custo',       // combo filho
//     'ds_centros_custo',    // dataset
//     'cod_departamento',    // coluna de filtro
//     'codigo',              // coluna value
//     'descricao'            // coluna texto
// );

// =============================================
// OPCAO 3: SERVER-SIDE (displayFields.js)
// Popular select via customHTML.append
// =============================================

/**
 * COLE ESTE TRECHO DENTRO DO displayFields(form, customHTML)
 * para popular um select no servidor.
 *
 * Vantagem: o select ja vem populado quando a pagina abre.
 * Desvantagem: nao permite filtros dinamicos client-side.
 */

// --- INICIO: colar dentro de displayFields ---
//
// var dsCombo = DatasetFactory.getDataset(
//     "${DATASET_ID}",
//     null,
//     null,  // constraints (filtros)
//     null   // order
// );
//
// var options = "";
// for (var i = 0; i < dsCombo.rowsCount; i++) {
//     var val = dsCombo.getValue(i, "${COL_VALOR}");
//     var txt = dsCombo.getValue(i, "${COL_TEXTO}");
//     options += "<option value='" + val + "'>" + txt + "</option>";
// }
//
// customHTML.append("<script>");
// customHTML.append("$(document).ready(function(){");
// customHTML.append("  $('#${CAMPO_SELECT}').append('" + options + "');");
// customHTML.append("});");
// customHTML.append("</script>");
//
// --- FIM: colar dentro de displayFields ---

// =============================================
// OPCAO 4: RECARREGAR ZOOM COM FILTRO
// Util quando um zoom depende de outro campo
// =============================================

/**
 * Recarrega um campo zoom com novos filtros.
 * Use quando o filtro do zoom depende de outro campo.
 *
 * @param {string} nomeZoom - Name do campo zoom
 * @param {string} filtro - String no formato "campo,valor"
 */
function recarregarZoomComFiltro(nomeZoom, filtro) {
    // Limpa o zoom atual
    $('#' + nomeZoom).val('');

    // Recarrega com novo filtro
    reloadZoomFilterValues(nomeZoom, filtro);
}

// Exemplo: ao trocar departamento, recarrega zoom de funcionarios
// $('#departamento').on('change', function() {
//     var codDepto = $(this).val();
//     if (codDepto) {
//         recarregarZoomComFiltro('funcionario', 'cod_departamento,' + codDepto);
//     }
// });
