/**
 * TEMPLATE: dataset-jdbc-base.js
 * =============================================
 * Dataset customizado com consulta SQL via JDBC.
 * Usa JNDI lookup para obter conexao do pool.
 *
 * DATASOURCES COMUNS:
 * - /jdbc/FluigDSRO  (Fluig somente leitura)
 * - /jdbc/FluigDS     (Fluig leitura/escrita)
 * - java:/jdbc/CorporeRM (RM/TOTVS)
 *
 * PADRAO DE PRODUCAO (VIPal, CELI, Soprano):
 * - Colunas criadas dinamicamente a partir do ResultSet
 * - Constraints lidos para filtros
 * - Conexao fechada em finally
 */

function createDataset(fields, constraints, sortFields) {

    var dataset = DatasetBuilder.newDataset();

    // =============================================
    // LER FILTROS (constraints)
    // =============================================
    var filtro = "";
    if (constraints != null) {
        for (var i = 0; i < constraints.length; i++) {
            if (constraints[i].fieldName == "${CAMPO_FILTRO}") {
                filtro = constraints[i].initialValue;
            }
        }
    }

    // =============================================
    // QUERY SQL
    // =============================================
    var sql = "SELECT ${COL_1}, ${COL_2}, ${COL_3} "
            + "FROM ${TABELA} "
            + "WHERE ${COL_ATIVO} = 'S'";

    // Adicionar filtro se informado
    if (filtro != "") {
        sql = sql + " AND ${CAMPO_FILTRO} = '" + filtro + "'";
    }

    // Para queries com parametros do usuario, use PreparedStatement:
    // var sql = "SELECT col1, col2 FROM tabela WHERE campo = ?";

    // =============================================
    // CONEXAO E EXECUCAO
    // =============================================
    var dataSource = "${JNDI_DATASOURCE}";
    var ic = new javax.naming.InitialContext();
    var ds = ic.lookup(dataSource);
    var conn = null;
    var stmt = null;
    var rs = null;
    var created = false;

    try {
        conn = ds.getConnection();
        stmt = conn.createStatement();

        // Para PreparedStatement:
        // stmt = conn.prepareStatement(sql);
        // stmt.setString(1, filtro);
        // rs = stmt.executeQuery();

        rs = stmt.executeQuery(sql);
        var columnCount = rs.getMetaData().getColumnCount();

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

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

    } catch (e) {
        log.error("=== ${NOME_DATASET} ERRO JDBC: " + e.message);
        // Retornar dataset com coluna de erro
        if (!created) {
            dataset.addColumn("erro");
            dataset.addRow(new Array(e.message));
        }
    } finally {
        if (rs != null) rs.close();
        if (stmt != null) stmt.close();
        if (conn != null) conn.close();
    }

    return dataset;
}
