/**
 * TEMPLATE: dataset-sync-api.js
 * =============================================
 * Dataset sincronizado que faz cache local de API externa.
 * Usa defineStructure() + onSync() + createDataset().
 *
 * PADRAO DE PRODUCAO (dsProdutosProtheus):
 * - defineStructure: define colunas, chave e indice
 * - onSync: chamado periodicamente pelo Fluig
 * - createDataset: retorna dados do cache local
 *
 * QUANDO USAR:
 * - API externa lenta que nao pode ser chamada a cada request
 * - Dados que mudam com pouca frequencia (produtos, clientes)
 * - Necessidade de busca offline/rapida
 * - Combo/select que precisa de performance
 *
 * CONFIGURACAO NO FLUIG:
 * Ao cadastrar o dataset, marcar "Sincronizado" e
 * definir o intervalo de sincronizacao (ex: 1 hora).
 */

// =============================================
// ESTRUTURA DO CACHE LOCAL
// =============================================
function defineStructure() {
    addColumn("${COL_CHAVE}");
    addColumn("${COL_DESCRICAO}");
    addColumn("${COL_EXTRA}");

    // Chave primaria (identifica registro unico)
    setKey(["${COL_CHAVE}"]);

    // Indices para busca rapida
    addIndex(["${COL_CHAVE}", "${COL_DESCRICAO}"]);
}

// =============================================
// SINCRONIZACAO COM API EXTERNA
// =============================================
function onSync(lastSyncDate) {

    log.info("=== ${NOME_DATASET}: onSync inicio - lastSyncDate: " + lastSyncDate);

    var dataset = DatasetBuilder.newDataset();

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

        var data = {
            companyId: getValue("WKCompany") + '',
            serviceCode: '${CODIGO_SERVICO}',
            endpoint: '${ENDPOINT_LISTA}',
            method: 'GET',
            timeoutService: '30000'
        };

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

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

        log.info("=== ${NOME_DATASET}: registros recebidos: " + resultado.${ARRAY_CAMPO}.length);

        // =============================================
        // POPULAR DATASET (addOrUpdateRow faz upsert)
        // =============================================
        for (var i in resultado.${ARRAY_CAMPO}) {
            var item = resultado.${ARRAY_CAMPO}[i];
            dataset.addOrUpdateRow(new Array(
                item.${CAMPO_JSON_CHAVE},
                item.${CAMPO_JSON_DESC},
                item.${CAMPO_JSON_EXTRA}
            ));
        }

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

    } catch (err) {
        log.error("=== ${NOME_DATASET} ERRO onSync: " + err);
    }

    return dataset;
}

// =============================================
// LEITURA DO CACHE (chamado por DatasetFactory)
// =============================================
function createDataset(fields, constraints, sortFields) {
    // Este metodo e chamado automaticamente pelo Fluig.
    // Retorna os dados do cache local (sincronizado).
    // O Fluig gerencia isso internamente.
    // NAO precisa implementar nada aqui para datasets sincronizados.
}
