/**
 * TEMPLATE: afterTaskComplete-base.js
 * =============================================
 * Evento de WORKFLOW executado apos completar
 * uma tarefa (mover para proxima atividade).
 *
 * PADRAO DE PRODUCAO (VIPal, SLIP, Compras SLC):
 * 1. Identificar atividade atual
 * 2. Gravar quem aprovou/completou
 * 3. Gravar data da acao
 * 4. Chamar integracoes externas se necessario
 * 5. Calcular duracao da atividade
 */

function afterTaskComplete(colleagueId, nextSequenceId, userList) {

    var nrAtividade = parseInt(getValue("WKNumState"));
    var nrSolic = getValue("WKNumProces");

    log.info("=== ${COD_PROCESSO} afterTaskComplete");
    log.info("=== atividade: " + nrAtividade + " -> proxima: " + nextSequenceId);
    log.info("=== colleagueId: " + colleagueId);

    // =============================================
    // GRAVAR USUARIO E DATA POR ATIVIDADE
    // =============================================

    // Atividade ${ATIV_1}: Solicitante completa
    if (nrAtividade == ${ATIV_1}) {
        fnGuardaUsuario(nrAtividade, colleagueId);
    }

    // Atividade ${ATIV_2}: Aprovador 1
    if (nrAtividade == ${ATIV_2}) {
        fnGuardaUsuario(nrAtividade, colleagueId);
        hAPI.setCardValue("loginAprovador_${ATIV_2}", colleagueId);
        hAPI.setCardValue("nomeAprovador_${ATIV_2}", fnBuscarColleague(colleagueId, "colleagueName"));
        hAPI.setCardValue("dataAprovacao_${ATIV_2}", fnBuscarDataHora("data"));

        // Calcular dias na atividade
        // fnCalculaDiasAtividade(nrAtividade);
    }

    // =============================================
    // INTEGRACAO EXTERNA (opcional)
    // Chamar ERP/API quando atividade especifica completar
    // =============================================
    // if (nextSequenceId == ${ATIV_INTEGRACAO}) {
    //     try {
    //         var c1 = DatasetFactory.createConstraint("param1", valor1, valor1, ConstraintType.MUST);
    //         var ds = DatasetFactory.getDataset("${DS_INTEGRACAO}", null, new Array(c1), null);
    //         var retorno = ds.getValue(0, "response");
    //         log.info("=== Integracao retornou: " + retorno);
    //     } catch (e) {
    //         log.error("=== Erro integracao: " + e.message);
    //     }
    // }
}

// =============================================
// FUNCOES AUXILIARES
// =============================================

/**
 * Grava usuario e data nos campos de span/auditoria.
 */
function fnGuardaUsuario(nrAtividade, colleagueId) {
    var dataHora = fnBuscarDataHora("data") + " " + fnBuscarDataHora("hora");
    hAPI.setCardValue("vUserSpan_" + nrAtividade.toString(), colleagueId);
    hAPI.setCardValue("vDateSpan_" + nrAtividade.toString(), dataHora);
    hAPI.setCardValue("vDataFimAtiv_" + nrAtividade.toString(), fnBuscarDataHora("data"));
}

/**
 * Calcula dias entre inicio e fim da atividade.
 */
function fnCalculaDiasAtividade(nrAtividade) {
    var dataInicio = hAPI.getCardValue("vDataIniAtiv_" + nrAtividade.toString());
    var dataFim = fnBuscarDataHora("data");

    if (dataInicio != null && dataInicio != "") {
        var partesIni = dataInicio.split("/");
        var partesFim = dataFim.split("/");

        var dtIni = new Date(parseInt(partesIni[2]), parseInt(partesIni[1]) - 1, parseInt(partesIni[0]));
        var dtFim = new Date(parseInt(partesFim[2]), parseInt(partesFim[1]) - 1, parseInt(partesFim[0]));

        var diff = Math.ceil((dtFim.getTime() - dtIni.getTime()) / (1000 * 60 * 60 * 24));
        hAPI.setCardValue("diasAtiv_" + nrAtividade.toString(), diff.toString());
    }
}

function fnBuscarDataHora(tipo) {
    var fullDate = new java.util.Date();
    var sdf;
    if (tipo == "data") {
        sdf = new java.text.SimpleDateFormat("dd/MM/yyyy");
    } else {
        sdf = new java.text.SimpleDateFormat("HH:mm");
    }
    return sdf.format(fullDate);
}

function fnBuscarColleague(login, campo) {
    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 "";
}
