/**
 * TEMPLATE: dataset-rest-fluigapi.js
 * =============================================
 * Dataset que consome API REST via fluigAPI.
 * O servico REST deve estar cadastrado no Painel do Fluig:
 *   Painel > Configuracoes > Servicos > Novo Servico REST
 *
 * PADRAO DE PRODUCAO (BuscaCEP, BuscaCNPJ, Protheus):
 * - Usar fluigAPI.getAuthorizeClientService()
 * - Servico cadastrado no painel (URL + auth gerenciadas)
 * - Ler parametros via constraints
 * - Parsear JSON de retorno
 *
 * VANTAGENS SOBRE java.net.URL:
 * - Autenticacao gerenciada pelo Fluig (Basic, OAuth, Bearer)
 * - URL base configurada no painel (nao fica hardcoded no codigo)
 * - Timeout configuravel
 * - Auditoria automatica de chamadas
 */

function createDataset(fields, constraints, sortFields) {

    var dataset = DatasetBuilder.newDataset();

    // =============================================
    // DEFINIR COLUNAS DE RETORNO
    // =============================================
    dataset.addColumn("${COL_1}");
    dataset.addColumn("${COL_2}");
    dataset.addColumn("${COL_3}");

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

    if (parametro == "") {
        log.info("=== ${NOME_DATASET}: parametro nao informado, retornando vazio");
        return dataset;
    }

    // =============================================
    // CHAMAR API REST
    // =============================================
    try {
        var clientService = fluigAPI.getAuthorizeClientService();

        var data = {
            companyId: getValue("WKCompany") + '',
            serviceCode: '${CODIGO_SERVICO}',    // Codigo cadastrado no Painel
            endpoint: '/${RECURSO}/' + parametro, // Path complementar a URL base
            method: '${METODO_HTTP}',             // GET, POST, PUT, DELETE
            timeoutService: '10000'               // Timeout em ms
        };

        // Para POST com body, adicionar:
        // data.params = JSON.stringify({ campo: valor });

        log.info("=== ${NOME_DATASET}: chamando " + data.serviceCode + " endpoint: " + data.endpoint);

        var vo = clientService.invoke(JSON.stringify(data));

        if (vo.getResult() == null || vo.getResult().isEmpty()) {
            log.info("=== ${NOME_DATASET}: retorno vazio da API");
            return dataset;
        }

        // =============================================
        // PARSEAR RESPOSTA JSON
        // =============================================
        var json = JSON.parse(vo.getResult());

        // Retorno simples (1 objeto)
        dataset.addRow(new Array(
            json.${CAMPO_JSON_1},
            json.${CAMPO_JSON_2},
            json.${CAMPO_JSON_3}
        ));

        // Retorno lista (array de objetos)
        // for (var i in json.${ARRAY_CAMPO}) {
        //     dataset.addRow(new Array(
        //         json.${ARRAY_CAMPO}[i].${CAMPO_1},
        //         json.${ARRAY_CAMPO}[i].${CAMPO_2},
        //         json.${ARRAY_CAMPO}[i].${CAMPO_3}
        //     ));
        // }

        log.info("=== ${NOME_DATASET}: sucesso");

    } catch (err) {
        log.error("=== ${NOME_DATASET} ERRO: " + err);
        dataset.addColumn("erro");
        dataset.addRow(new Array("", "", "", err.toString()));
    }

    return dataset;
}
