/**
 * TEMPLATE: dataset-rest-java-url.js
 * =============================================
 * Dataset que chama API REST via java.net.URL.
 * Usar quando NAO ha servico cadastrado no Painel
 * ou quando precisa de controle total sobre a requisicao.
 *
 * PADRAO DE PRODUCAO (EnvioConvenio, integracao direta):
 * - Montar URL completa com java.net.URL
 * - Configurar headers (Content-Type, Authorization)
 * - Enviar body via DataOutputStream
 * - Ler resposta via BufferedReader
 * - Fechar conexao em finally
 *
 * ATENCAO: Preferir fluigAPI.getAuthorizeClientService()
 * sempre que possivel. Usar java.net.URL apenas quando:
 * - API nao pode ser cadastrada no painel
 * - Precisa de headers customizados
 * - Integracao temporaria/teste
 */

function createDataset(fields, constraints, sortFields) {

    var dataset = DatasetBuilder.newDataset();
    dataset.addColumn("status");
    dataset.addColumn("response");

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

    // =============================================
    // CONFIGURACOES (idealmente de um dataset interno)
    // =============================================
    // NAO deixe credenciais hardcoded em producao!
    // Use um dataset interno de configuracao.
    var urlBase = "${URL_BASE_API}";
    // var dsConfig = DatasetFactory.getDataset("dsConfigAPI", null, null, null);
    // var urlBase = dsConfig.getValue(0, "urlBase");
    // var apiKey = dsConfig.getValue(0, "apiKey");

    var con = null;

    try {
        // =============================================
        // MONTAR REQUISICAO
        // =============================================
        var url = new java.net.URL(urlBase + "/" + parametro);
        con = url.openConnection();
        con.setRequestMethod("${METODO_HTTP}"); // GET, POST, PUT, DELETE
        con.setDoInput(true);
        con.setRequestProperty("charset", "utf-8");
        con.setRequestProperty("Content-Type", "application/json");
        // con.setRequestProperty("Authorization", "Bearer " + token);
        // con.setRequestProperty("X-API-Key", apiKey);
        con.setConnectTimeout(10000); // 10 segundos
        con.setReadTimeout(30000);    // 30 segundos

        // =============================================
        // ENVIAR BODY (POST/PUT)
        // =============================================
        // Descomentar para POST/PUT com body JSON:
        // con.setDoOutput(true);
        // var body = JSON.stringify({
        //     campo1: "valor1",
        //     campo2: "valor2"
        // });
        // var printout = new java.io.DataOutputStream(con.getOutputStream());
        // var bodyString = new java.lang.String(body);
        // printout.write(bodyString.getBytes("UTF-8"));
        // printout.flush();
        // printout.close();

        con.connect();

        // =============================================
        // LER RESPOSTA
        // =============================================
        var responseCode = con.getResponseCode();
        log.info("=== ${NOME_DATASET}: Response Code: " + responseCode);

        var inputStream = (responseCode >= 200 && responseCode < 300)
            ? con.getInputStream()
            : con.getErrorStream();

        var reader = new java.io.BufferedReader(
            new java.io.InputStreamReader(inputStream, "UTF-8"));
        var linha = "";
        var conteudo = "";
        while ((linha = reader.readLine()) != null) {
            conteudo += linha;
        }
        reader.close();

        log.info("=== ${NOME_DATASET}: resposta recebida (" + conteudo.length + " chars)");

        if (responseCode >= 200 && responseCode < 300) {
            // Sucesso
            try {
                var json = JSON.parse(conteudo);
                dataset.addRow(new Array("OK", conteudo));

                // Para retornar campos especificos:
                // dataset.addColumn("campo1");
                // dataset.addRow(new Array("OK", conteudo, json.campo1));
            } catch (parseErr) {
                // Resposta nao e JSON
                dataset.addRow(new Array("OK", conteudo));
            }
        } else {
            // Erro HTTP
            log.error("=== ${NOME_DATASET} HTTP " + responseCode + ": " + conteudo);
            dataset.addRow(new Array("ERRO_" + responseCode, conteudo));
        }

    } catch (e) {
        log.error("=== ${NOME_DATASET} ERRO: " + e.message);
        dataset.addRow(new Array("ERRO", e.message));
    } finally {
        if (con != null) {
            try { con.disconnect(); } catch (ex) {}
        }
    }

    return dataset;
}
