/**
 * TEMPLATE: dataset-composto-base.js
 * =============================================
 * Dataset que chama outros datasets internamente.
 * Combina dados de multiplas fontes.
 *
 * PADRAO DE PRODUCAO (VIPal dsGetDsForm, dsGetHistoryProcess):
 * 1. Ler constraints de entrada
 * 2. Chamar dataset(s) interno(s) do Fluig
 * 3. Combinar/transformar resultados
 * 4. Retornar dataset unificado
 *
 * DATASETS INTERNOS UTEIS:
 * - colleague: usuarios (colleaguePK.colleagueId, colleagueName, mail)
 * - workflowProcess: processos (processInstanceId, cardDocumentId, status)
 * - processHistory: historico de movimentacoes
 * - processTask: tarefas pendentes
 * - processState: atividades do processo (stateName)
 * - processDefinition: definicao (processDescription)
 * - document: documentos GED (datasetName, lastModifiedDate)
 */

function createDataset(fields, constraints, sortFields) {

    var dataset = DatasetBuilder.newDataset();
    dataset.addColumn("processo");
    dataset.addColumn("solicitante");
    dataset.addColumn("nomeSolicitante");
    dataset.addColumn("data_abertura");
    dataset.addColumn("situacao");
    dataset.addColumn("${COL_EXTRA_1}");

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

    if (numProcesso == "") {
        return dataset; // Retorna vazio se nao informar filtro
    }

    // =============================================
    // BUSCAR DADOS DO PROCESSO
    // =============================================
    var c1 = DatasetFactory.createConstraint(
        "workflowProcessPK.processInstanceId", numProcesso, numProcesso, ConstraintType.MUST);
    var dsProcesso = DatasetFactory.getDataset("workflowProcess", null, new Array(c1), null);

    if (dsProcesso.rowsCount == 0) {
        log.info("=== Processo nao encontrado: " + numProcesso);
        return dataset;
    }

    var cardDocId = dsProcesso.getValue(0, "cardDocumentId");
    var processId = dsProcesso.getValue(0, "processId");

    // =============================================
    // BUSCAR DADOS DO FORMULARIO
    // =============================================
    var c2 = DatasetFactory.createConstraint("metadata#id", cardDocId, cardDocId, ConstraintType.MUST);
    var dsForm = DatasetFactory.getDataset("${DATASET_FORMULARIO}", null, new Array(c2), null);

    if (dsForm.rowsCount > 0) {
        var loginSolicitante = dsForm.getValue(0, "loginSolicitante");

        // Buscar nome do solicitante via dataset colleague
        var nomeSolicitante = fnBuscarColleague(loginSolicitante, "colleagueName");

        dataset.addRow(new Array(
            numProcesso,
            loginSolicitante,
            nomeSolicitante,
            dsForm.getValue(0, "data_solicitacao"),
            dsForm.getValue(0, "situacaoSolic"),
            dsForm.getValue(0, "${CAMPO_EXTRA_1}")
        ));
    }

    return dataset;
}

// =============================================
// BUSCAR DADOS DE TABELA PAI-FILHO
// =============================================
// Para buscar dados de tabela pai-filho dentro do formulario:
//
// var c1 = DatasetFactory.createConstraint("tablename", "nomeTabela", "nomeTabela", ConstraintType.MUST);
// var c2 = DatasetFactory.createConstraint("metadata#id", cardDocId, cardDocId, ConstraintType.MUST);
// var dsFilhos = DatasetFactory.getDataset("${DATASET_FORMULARIO}", null, new Array(c1, c2), null);
//
// for (var j = 0; j < dsFilhos.rowsCount; j++) {
//     var valorFilho = dsFilhos.getValue(j, "campo_filho");
// }

/**
 * Busca informacao de um colleague pelo login.
 */
function fnBuscarColleague(login, campo) {
    if (login == null || login == "") return "";
    var c1 = DatasetFactory.createConstraint(
        "colleaguePK.colleagueId", login, login, ConstraintType.MUST);
    var ds = DatasetFactory.getDataset("colleague", null, new Array(c1), null);
    if (ds.rowsCount > 0) {
        return ds.getValue(0, campo);
    }
    return "";
}
