/**
 * Dataset: ds_colaboradores
 * Tipo: JDBC (consulta SQL direta)
 * Descricao: Consulta colaboradores ativos no banco Fluig com filtro por matricula ou nome.
 *
 * Constraints aceitas:
 *   - matricula (opcional): filtra por matricula exata
 *   - nome (opcional): filtra por nome (LIKE)
 *   - ativo (opcional): "S" ou "N" (default: "S")
 *
 * Exemplo de chamada:
 *   var c1 = DatasetFactory.createConstraint("matricula", "12345", "12345", ConstraintType.MUST);
 *   var ds = DatasetFactory.getDataset("ds_colaboradores", null, new Array(c1), null);
 */
function createDataset(fields, constraints, sortFields) {
    var dataset = DatasetBuilder.newDataset();
    var dataSource = "/jdbc/FluigDSRO";

    // Ler constraints (filtros)
    var matricula = "";
    var nome = "";
    var ativo = "S";

    if (constraints != null) {
        for (var i = 0; i < constraints.length; i++) {
            if (constraints[i].fieldName == "matricula") {
                matricula = constraints[i].initialValue;
            }
            if (constraints[i].fieldName == "nome") {
                nome = constraints[i].initialValue;
            }
            if (constraints[i].fieldName == "ativo") {
                ativo = constraints[i].initialValue;
            }
        }
    }

    // Montar SQL com filtros condicionais
    var sql = "SELECT matricula, nome_completo, email, departamento, cargo, data_admissao ";
    sql += "FROM colaboradores ";
    sql += "WHERE ativo = '" + ativo + "'";

    if (matricula != "") {
        sql += " AND matricula = '" + matricula + "'";
    }
    if (nome != "") {
        sql += " AND UPPER(nome_completo) LIKE UPPER('%" + nome + "%')";
    }

    sql += " ORDER BY nome_completo ASC";

    // Conexao JDBC com pattern seguro
    var ic = null;
    var dsJndi = null;
    var conn = null;
    var stmt = null;
    var rs = null;
    var created = false;

    try {
        ic = new javax.naming.InitialContext();
        dsJndi = ic.lookup(dataSource);
        conn = dsJndi.getConnection();
        stmt = conn.createStatement();
        rs = stmt.executeQuery(sql);
        var columnCount = rs.getMetaData().getColumnCount();

        while (rs.next()) {
            // Criar colunas dinamicamente na primeira iteracao
            if (!created) {
                for (var c = 1; c <= columnCount; c++) {
                    dataset.addColumn(rs.getMetaData().getColumnName(c));
                }
                created = true;
            }

            // Ler valores da linha
            var row = new Array();
            for (var c = 1; c <= columnCount; c++) {
                var obj = rs.getObject(rs.getMetaData().getColumnName(c));
                row[c - 1] = (obj != null) ? obj.toString() : "";
            }
            dataset.addRow(row);
        }

        // Se nenhuma linha retornou, adicionar colunas manualmente
        if (!created) {
            dataset.addColumn("matricula");
            dataset.addColumn("nome_completo");
            dataset.addColumn("email");
            dataset.addColumn("departamento");
            dataset.addColumn("cargo");
            dataset.addColumn("data_admissao");
        }

    } catch (e) {
        log.error("ds_colaboradores ERRO: " + e.message);
        dataset.addColumn("erro");
        dataset.addRow(new Array(e.message));
    } finally {
        // OBRIGATORIO: fechar recursos na ordem inversa
        if (rs != null) { try { rs.close(); } catch (e) { } }
        if (stmt != null) { try { stmt.close(); } catch (e) { } }
        if (conn != null) { try { conn.close(); } catch (e) { } }
    }

    return dataset;
}
