/**
 * TEMPLATE: notificacao-email.js
 * =============================================
 * Envio de e-mail via notifier.notify().
 * Funcao reutilizavel para eventos de processo.
 *
 * PADRAO DE PRODUCAO (Kit Qualidade, Visita Comercial,
 * Envio de E-mail, FEN Eletronica):
 * - HashMap para parametros do template
 * - ArrayList para destinatarios (logins)
 * - Template cadastrado no Painel do Fluig
 * - Busca de destinatarios via colleague/colleagueGroup
 *
 * PRE-REQUISITO:
 * Template de e-mail cadastrado em:
 *   Painel do Fluig > Configuracoes > Templates de E-mail
 *
 * O template usa variaveis ${NOME_VARIAVEL} no HTML
 * que sao substituidas pelos valores do HashMap.
 */

// =============================================
// FUNCAO PRINCIPAL: ENVIAR E-MAIL
// =============================================
function fnEnviarEmail(tipo) {

    log.info("=== fnEnviarEmail: tipo=" + tipo);

    try {
        // =============================================
        // CONFIGURAR SERVIDOR (via dataset de config)
        // =============================================
        // var dsServidor = DatasetFactory.getDataset("dsServidorFluig", null, null, null);
        // var host = dsServidor.getValue(0, "host");
        var host = "${URL_SERVIDOR_FLUIG}";

        var remetente = getValue("WKUser");
        var nrSolic = getValue("WKNumProces");
        var parametros = new java.util.HashMap();
        var destinatarios = new java.util.ArrayList();

        // =============================================
        // PARAMETROS COMUNS (disponiveis no template)
        // =============================================
        parametros.put("SERVER_URL", host);
        parametros.put("nrSolic", nrSolic);
        parametros.put("LINK",
            host + "/portal/p/1/pageworkflowview" +
            "?app_ecm_workflowview_detailsProcessInstanceID=" + nrSolic);

        // =============================================
        // CONFIGURAR POR TIPO DE NOTIFICACAO
        // =============================================
        var templateEmail = "${TEMPLATE_EMAIL}";

        if (tipo == "nova_solicitacao") {
            parametros.put("subject", "Nova Solicitacao Nr: " + nrSolic);
            parametros.put("mensagem",
                "Uma nova solicitacao foi aberta e aguarda sua analise.");

            // Destinatario fixo
            destinatarios.add("${LOGIN_DESTINATARIO}");

        } else if (tipo == "aprovado") {
            parametros.put("subject", "Solicitacao Aprovada Nr: " + nrSolic);
            parametros.put("mensagem",
                "Sua solicitacao foi aprovada.");

            // Destinatario = solicitante do processo
            destinatarios.add(hAPI.getCardValue("matSolic"));

        } else if (tipo == "reprovado") {
            parametros.put("subject", "Solicitacao Reprovada Nr: " + nrSolic);
            parametros.put("mensagem",
                "Sua solicitacao foi reprovada. Motivo: "
                + hAPI.getCardValue("obsReprovacao"));

            destinatarios.add(hAPI.getCardValue("matSolic"));

        } else if (tipo == "notificar_grupo") {
            parametros.put("subject", "Notificacao - Processo Nr: " + nrSolic);
            parametros.put("mensagem",
                "Voce esta sendo notificado sobre o processo " + nrSolic);

            // Buscar todos os membros do grupo
            fnAdicionarGrupo(destinatarios, "${NOME_GRUPO}");
        }

        // =============================================
        // ADICIONAR DADOS EXTRAS DO FORMULARIO
        // =============================================
        parametros.put("solicitante", hAPI.getCardValue("nomeSolicitante"));
        // parametros.put("departamento", hAPI.getCardValue("departamento"));
        // parametros.put("valor", hAPI.getCardValue("valorTotal"));

        // =============================================
        // ENVIAR
        // =============================================
        if (destinatarios.size() == 0) {
            log.info("=== fnEnviarEmail: nenhum destinatario, email nao enviado");
            return;
        }

        log.info("=== fnEnviarEmail: remetente=" + remetente);
        log.info("=== fnEnviarEmail: destinatarios=" + destinatarios);
        log.info("=== fnEnviarEmail: template=" + templateEmail);

        notifier.notify(
            remetente,          // String - login do remetente
            templateEmail,      // String - codigo do template
            parametros,         // java.util.HashMap
            destinatarios,      // java.util.ArrayList
            "text/html"         // String - content type
        );

        log.info("=== fnEnviarEmail: enviado com sucesso");

    } catch (e) {
        log.error("=== fnEnviarEmail ERRO: " + e.message);
        // NAO dar throw aqui para nao travar o processo
    }
}

// =============================================
// HELPER: ADICIONAR MEMBROS DE GRUPO
// =============================================
function fnAdicionarGrupo(destinatarios, nomeGrupo) {
    var c1 = DatasetFactory.createConstraint(
        "colleagueGroupPK.groupId", nomeGrupo, nomeGrupo, ConstraintType.MUST);
    var dsGrupo = DatasetFactory.getDataset("colleagueGroup", null, new Array(c1), null);

    for (var i = 0; i < dsGrupo.rowsCount; i++) {
        destinatarios.add(dsGrupo.getValue(i, "colleagueGroupPK.colleagueId"));
    }

    log.info("=== fnAdicionarGrupo: " + dsGrupo.rowsCount + " membros de " + nomeGrupo);
}

// =============================================
// HELPER: BUSCAR LOGIN POR E-MAIL
// =============================================
function fnBuscarLoginPorEmail(email) {
    if (email == null || email == "") return "";
    var c1 = DatasetFactory.createConstraint("mail", email, email, ConstraintType.MUST);
    var ds = DatasetFactory.getDataset("colleague", null, new Array(c1), null);
    if (ds.rowsCount > 0) {
        return ds.getValue(0, "colleaguePK.colleagueId");
    }
    return "";
}

// =============================================
// HELPER: ENVIAR PARA LISTA DE E-MAILS (separados por ;)
// =============================================
function fnEnviarParaListaEmails(destinatarios, campoEmails) {
    var emails = hAPI.getCardValue(campoEmails);
    if (emails == null || emails == "") return;

    var aux = emails.trim().split(";");
    for (var i = 0; i < aux.length; i++) {
        var login = fnBuscarLoginPorEmail(aux[i].trim());
        if (login != "") {
            destinatarios.add(login);
        }
    }
}

// =============================================
// USO EM EVENTOS DE PROCESSO (exemplos)
// =============================================
// function afterProcessCreate(colleagueId) {
//     fnEnviarEmail("nova_solicitacao");
// }
//
// function afterTaskComplete(colleagueId, nextSequenceId, userList) {
//     if (nextSequenceId == 5) {  // Atividade "Aprovado"
//         fnEnviarEmail("aprovado");
//     }
//     if (nextSequenceId == 6) {  // Atividade "Reprovado"
//         fnEnviarEmail("reprovado");
//     }
// }
//
// function beforeStateEntry(sequenceId) {
//     if (sequenceId == 10) { // Atividade final
//         fnEnviarEmail("notificar_grupo");
//     }
// }
