/**
 * TEMPLATE: validateForm-base.js
 * =============================================
 * Evento SERVER-SIDE executado antes de mover
 * a tarefa no workflow BPM. Se lancar excecao,
 * o Fluig bloqueia o avanco e mostra a mensagem.
 *
 * IMPORTANTE:
 * - Roda NO SERVIDOR (ES5 obrigatorio)
 * - Use hAPI.getCardValue(campo) para ler campos
 * - Use throw "mensagem" para bloquear movimentacao
 * - NUNCA use return para bloquear (nao funciona)
 * - Valide POR ATIVIDADE usando WKNumState
 * - Acumule erros em array e faca throw unico
 *
 * PADRAO DE PRODUCAO (baseado em VIPal, CELI, BOMAG):
 * 1. Ler WKNumState
 * 2. Ignorar atividade 0 (abertura)
 * 3. Chamar funcao de validacao da atividade
 * 4. Cada funcao acumula erros em array
 * 5. throw erros.join('\n') se houver erros
 */

function validateForm(form) {

    var nAtiv = getValue("WKNumState");

    // Atividade 0 = abertura, nao valida
    if (!nAtiv || nAtiv == "0") {
        return;
    }

    nAtiv = parseInt(nAtiv, 10);

    // Despachar validacao por atividade
    switch (nAtiv) {
        case ${ATIV_1}:
            validarAtividade_${ATIV_1}(form);
            break;

        case ${ATIV_2}:
            validarAtividade_${ATIV_2}(form);
            break;

        // Adicione mais cases conforme necessario:
        // case ${ATIV_3}:
        //     validarAtividade_${ATIV_3}(form);
        //     break;
    }
}

// =============================================
// VALIDACOES POR ATIVIDADE
// =============================================

/**
 * Atividade ${ATIV_1}: Validar dados do solicitante.
 * Campos obrigatorios + tabela pai-filho (se houver).
 */
function validarAtividade_${ATIV_1}(form) {
    var erros = [];

    // Campos obrigatorios simples
    validarObrigatorio(erros, "${CAMPO_1}", "${LABEL_1}");
    validarObrigatorio(erros, "${CAMPO_2}", "${LABEL_2}");
    validarObrigatorio(erros, "${CAMPO_DATA}", "${LABEL_DATA}");

    // Validar select (deve ter valor selecionado)
    validarObrigatorio(erros, "${CAMPO_SELECT}", "${LABEL_SELECT}");

    // Validar tabela pai-filho: pelo menos 1 item
    // var primeiroItem = hAPI.getCardValue("${CAMPO_FILHO_1}");
    // if (!primeiroItem || primeiroItem == "") {
    //     erros.push("Adicione pelo menos um item na tabela.");
    // }

    // Validacao de valor minimo
    // var valor = hAPI.getCardValue("${CAMPO_VALOR}");
    // if (valor && parseFloat(valor.replace(/\./g, "").replace(",", ".")) <= 0) {
    //     erros.push("O valor deve ser maior que zero.");
    // }

    // Validacao de data (nao pode ser retroativa)
    // var dataStr = hAPI.getCardValue("${CAMPO_DATA}");
    // if (dataStr && dataStr != "") {
    //     if (isDataRetroativa(dataStr)) {
    //         erros.push("A data nao pode ser anterior a hoje.");
    //     }
    // }

    if (erros.length > 0) {
        throw erros.join("\n");
    }
}

/**
 * Atividade ${ATIV_2}: Validar aprovacao.
 * Radio obrigatorio + observacao se reprovado.
 */
function validarAtividade_${ATIV_2}(form) {
    var erros = [];

    var aprovacao = hAPI.getCardValue("aprovacao_${ATIV_2}");

    if (!aprovacao || aprovacao == "") {
        erros.push("Selecione 'Aprovar' ou 'Reprovar' para continuar.");
    }

    // Se reprovado, exigir observacao
    if (aprovacao == "N") {
        var obs = hAPI.getCardValue("obs_${ATIV_2}");
        if (!obs || obs == "") {
            erros.push("Informe o motivo da reprovacao.");
        }
    }

    if (erros.length > 0) {
        throw erros.join("\n");
    }
}

// =============================================
// FUNCOES AUXILIARES DE VALIDACAO (ES5)
// =============================================

/**
 * Valida campo obrigatorio e adiciona erro ao array.
 * @param {Array} erros - Array de mensagens de erro
 * @param {string} campo - Nome do campo no formulario
 * @param {string} label - Label amigavel para a mensagem
 */
function validarObrigatorio(erros, campo, label) {
    var valor = hAPI.getCardValue(campo);
    if (!valor || valor == "" || valor == "null") {
        erros.push("O campo \"" + label + "\" e obrigatorio.");
    }
}

/**
 * Valida se um campo numerico e maior que zero.
 * @param {Array} erros - Array de mensagens de erro
 * @param {string} campo - Nome do campo
 * @param {string} label - Label amigavel
 */
function validarMaiorQueZero(erros, campo, label) {
    var valor = hAPI.getCardValue(campo);
    if (valor) {
        var num = parseFloat(valor.replace(/\./g, "").replace(",", "."));
        if (isNaN(num) || num <= 0) {
            erros.push("O campo \"" + label + "\" deve ser maior que zero.");
        }
    }
}

/**
 * Verifica se uma data (dd/mm/yyyy) e anterior a hoje.
 * @param {string} dataStr - Data no formato dd/mm/yyyy
 * @returns {boolean} true se a data for retroativa
 */
function isDataRetroativa(dataStr) {
    var partes = dataStr.split("/");
    if (partes.length != 3) return false;

    var dataInformada = new Date(
        parseInt(partes[2], 10),
        parseInt(partes[1], 10) - 1,
        parseInt(partes[0], 10)
    );

    var hoje = new Date();
    hoje.setHours(0, 0, 0, 0);

    return dataInformada.getTime() < hoje.getTime();
}

/**
 * Valida formato de e-mail basico.
 * @param {Array} erros - Array de mensagens de erro
 * @param {string} campo - Nome do campo
 * @param {string} label - Label amigavel
 */
function validarEmail(erros, campo, label) {
    var valor = hAPI.getCardValue(campo);
    if (valor && valor != "") {
        if (valor.indexOf("@") == -1 || valor.indexOf(".") == -1) {
            erros.push("O campo \"" + label + "\" possui um e-mail invalido.");
        }
    }
}
