function beforeTaskSave(colleagueId, nextSequenceId, userList) {
    try {
        var currentState = parseInt(String(getValue("WKNumState") || "0"), 10);
        var nextState = parseInt(String(nextSequenceId || "0"), 10);
        var completeTask = String(getValue("WKCompletTask") || "false");
        log.info("[Recrutamento.beforeTaskSave] currentState=" + currentState + ", nextState=" + nextState + ", completeTask=" + completeTask);

        if (completeTask !== "true") return;

        // Disparo do e-mail inicial da solicitação (atividade inicial = 1).
        if (currentState === 1) {
            enviarNotificacaoSolicitacao();
            return;
        }

        // Disparo quando a seleção define o início do colaborador.
        if (currentState === 6 && nextState === 46) {
            enviarNotificacaoInicioColaborador();
        }
    } catch (e) {
        log.error("[Recrutamento.beforeTaskSave] Erro ao disparar notificação: " + e);
    }
}

function enviarNotificacaoSolicitacao() {
    var envio = montarContextoEnvio();
    if (!envio.ok) return;

    var params = new java.util.HashMap();
    params.put("WKNumProces", envio.processNumber);
    params.put("linkSolicitacao", envio.processLink);
    params.put("link", envio.processLink);
    params.put("requesterName", valueOrDefault(hAPI.getCardValue("requesterName")));
    params.put("gestorNome", valueOrDefault(hAPI.getCardValue("gestorNome")));
    params.put("dataAbertura", valueOrDefault(hAPI.getCardValue("dataAbertura")));
    params.put("cargo", valueOrDefault(hAPI.getCardValue("funcao")));
    params.put("kitUtilizado", getKitDescricao(hAPI.getCardValue("itensinicio")));
    params.put("motivoSolicitacao", getMotivoDescricao(hAPI.getCardValue("validarMotivo")));
    params.put("justificativa", valueOrDefault(hAPI.getCardValue("justificativa")));

    notifier.notify("admin", "tpl_recrutamento_realizada_dia", params, envio.destinatarios, "text/html");
    log.info("[Recrutamento.beforeTaskSave] tpl_recrutamento_realizada_dia enviado. processo=" + envio.processNumber + ", destinos=" + envio.destinosLog);
}

function enviarNotificacaoInicioColaborador() {
    var envio = montarContextoEnvio();
    if (!envio.ok) return;

    var dataInicio = safeTrim(hAPI.getCardValue("datainiciotrabalho"));
    if (dataInicio === "") {
        log.warn("[Recrutamento.beforeTaskSave] Data de início vazia. Notificação de início não enviada.");
        return;
    }

    var params = new java.util.HashMap();
    params.put("WKNumProces", envio.processNumber);
    params.put("linkSolicitacao", envio.processLink);
    params.put("link", envio.processLink);
    params.put("colaboradorNome", valueOrDefault(hAPI.getCardValue("nomedocandidato")));
    params.put("cargo", valueOrDefault(hAPI.getCardValue("funcao")));
    params.put("dataInicio", formatDateBr(dataInicio));
    params.put("kitUtilizado", getKitDescricao(hAPI.getCardValue("itensinicio")));

    notifier.notify("admin", "tpl_recrutamento_realizada", params, envio.destinatarios, "text/html");
    log.info("[Recrutamento.beforeTaskSave] tpl_recrutamento_realizada enviado. processo=" + envio.processNumber + ", destinos=" + envio.destinosLog);
}

function montarContextoEnvio() {
    var destinatarios = new java.util.ArrayList();
    var jaAdicionados = {};

    addEmail(destinatarios, jaAdicionados, "tic@grupoginseng.com.br");

    var requesterId = safeTrim(hAPI.getCardValue("requesterId"));
    if (requesterId !== "") {
        addEmail(destinatarios, jaAdicionados, resolveEmailByColleagueId(requesterId));
    }

    if (destinatarios.isEmpty()) {
        log.warn("[Recrutamento.beforeTaskSave] Nenhum e-mail válido encontrado para notificação.");
        return { ok: false };
    }

    var processNumber = safeTrim(getValue("WKNumProces"));
    var processLink = buildProcessLink(processNumber);

    return {
        ok: true,
        processNumber: processNumber,
        processLink: processLink,
        destinatarios: destinatarios,
        destinosLog: String(destinatarios.toString())
    };
}

function addEmail(destinatarios, jaAdicionados, email) {
    var v = safeTrim(email).toLowerCase();
    if (!isValidEmail(v)) return;
    if (jaAdicionados[v]) return;

    destinatarios.add(v);
    jaAdicionados[v] = true;
}

function resolveEmailByColleagueId(colleagueId) {
    var id = safeTrim(colleagueId);
    if (id === "") return "";

    try {
        var cActive = DatasetFactory.createConstraint("active", "true", "true", ConstraintType.MUST);

        var cId = DatasetFactory.createConstraint("colleaguePK.colleagueId", id, id, ConstraintType.MUST);
        var byId = DatasetFactory.getDataset("colleague", null, [cId, cActive], null);
        if (byId && byId.rowsCount > 0) {
            return safeTrim(byId.getValue(0, "mail"));
        }

        var cLogin = DatasetFactory.createConstraint("login", id, id, ConstraintType.MUST);
        var byLogin = DatasetFactory.getDataset("colleague", null, [cLogin, cActive], null);
        if (byLogin && byLogin.rowsCount > 0) {
            return safeTrim(byLogin.getValue(0, "mail"));
        }
    } catch (e) {
        log.warn("[Recrutamento.beforeTaskSave] Falha ao buscar e-mail por colleagueId: " + e);
    }

    return "";
}

function buildProcessLink(processNumber) {
    var baseUrl = safeTrim(getValue("WKServerURL"));
    var companyId = safeTrim(getValue("WKCompany"));

    if (baseUrl === "" || processNumber === "") return "";
    if (baseUrl.indexOf("http://") !== 0 && baseUrl.indexOf("https://") !== 0) {
        baseUrl = "https://" + baseUrl;
    }
    if (baseUrl.charAt(baseUrl.length - 1) === "/") {
        baseUrl = baseUrl.substring(0, baseUrl.length - 1);
    }
    if (companyId === "") companyId = "1";

    return baseUrl + "/portal/p/" + companyId + "/pageworkflowview?app_ecm_workflowview_detailsProcessInstanceID=" + processNumber;
}

function getMotivoDescricao(motivo) {
    var v = safeTrim(motivo).toLowerCase();
    if (v === "aumento") return "Aumento de quadro";
    if (v === "substituicao") return "Substituição";
    if (v === "temporario") return "Temporário";
    return v === "" ? "Não informado" : v;
}

function getKitDescricao(kit) {
    var v = safeTrim(kit).toLowerCase();
    if (v === "backoffice") return "Kit Backoffice (Notebook, mouse, teclado e headset)";
    if (v === "amg") return "Kit AMG (Notebook, kit mouse e teclado, headset e telefone corporativo)";
    if (v === "comercial") return "Kit Comercial (Mobshop e Mobpin)";
    return v === "" ? "Não informado" : v;
}

function formatDateBr(value) {
    var v = safeTrim(value);
    if (/^\d{4}-\d{2}-\d{2}$/.test(v)) {
        return v.substring(8, 10) + "/" + v.substring(5, 7) + "/" + v.substring(0, 4);
    }
    return v;
}

function valueOrDefault(value) {
    var v = safeTrim(value);
    return v === "" ? "Não informado" : v;
}

function isValidEmail(email) {
    var v = safeTrim(email);
    if (v === "") return false;
    if (/\s/.test(v)) return false;

    var at = v.indexOf("@");
    if (at <= 0 || at !== v.lastIndexOf("@")) return false;

    var dot = v.lastIndexOf(".");
    return dot > at + 1 && dot < (v.length - 1);
}

function safeTrim(value) {
    return String(value == null ? "" : value).trim();
}
