/**
 * TEMPLATE COMPLEMENTAR: validateForm-base-felice.js
 * =================================================
 * Base real de validacao server-side para fluxo comercial.
 *
 * Regras cobertas:
 * - Atividade inicial (0/4): obrigatorios + pai-filho de contato
 * - Atividade "Aguardar" (17): nova data e historico de negociacao
 * - Regras condicionais por "GerarOportunidade" (Sim/Nao/Aguardar)
 *
 * Observacoes:
 * - ES5 obrigatorio (Rhino)
 * - Usar throw para bloquear avanco da tarefa
 */

function validateForm(form) {
    var numAtividade = parseInt(getValue("WKNumState"), 10);
    var formMode = form.getFormMode();

    var INICIO = 4;
    var AGUARDAR = 17;

    var indexesContato = form.getChildrenIndexes("contatosModelo");
    var indexesNegociacao = form.getChildrenIndexes("contatoNegociacao");
    var erros = [];

    if (formMode == "VIEW") {
        return;
    }

    if (numAtividade === 0 || numAtividade === INICIO) {
        validarAtividadeInicial(form, indexesContato, indexesNegociacao, erros);
    } else if (numAtividade === AGUARDAR) {
        validarAtividadeAguardar(form, indexesContato, indexesNegociacao, erros);
    }

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

function validarAtividadeInicial(form, indexesContato, indexesNegociacao, erros) {
    validarObrigatorio(form, "nomeCliente", "Nome do Cliente", erros);
    validarObrigatorio(form, "tipoOportunidade", "Tipo de oportunidade", erros);
    validarObrigatorio(form, "resumoProspeccao", "Resumo da negociacao/prospeccao", erros);
    validarObrigatorio(form, "GerarOportunidade", "Gerou Oportunidade", erros);

    if (form.getValue("tipoOportunidade") == "Privado" && indexesContato.length === 0) {
        erros.push("Para oportunidade privada, adicione ao menos um contato do cliente.");
    }

    validarContatoCliente(form, indexesContato, erros);
    validarRegrasGerarOportunidade(form, indexesNegociacao, erros);
}

function validarAtividadeAguardar(form, indexesContato, indexesNegociacao, erros) {
    var gerar = form.getValue("GerarOportunidade");

    if (gerar == "Nao") {
        validarObrigatorio(form, "motivo", "Motivo", erros);
    }

    if (gerar == "Aguardar") {
        validarObrigatorio(form, "novaDataContato", "Nova data de contato", erros);

        if (indexesNegociacao.length === 0) {
            erros.push("E necessario registrar ao menos uma negociacao.");
        }
        validarNegociacao(form, indexesNegociacao, erros);
    }

    validarContatoCliente(form, indexesContato, erros);
}

function validarRegrasGerarOportunidade(form, indexesNegociacao, erros) {
    var gerar = form.getValue("GerarOportunidade");

    if (gerar == "Sim") {
        validarObrigatorio(form, "tipoOportunidade", "Tipo de oportunidade", erros);
    } else if (gerar == "Nao") {
        validarObrigatorio(form, "motivo", "Motivo", erros);
    } else if (gerar == "Aguardar") {
        validarObrigatorio(form, "novaDataContato", "Nova data de contato", erros);
        if (indexesNegociacao.length === 0) {
            erros.push("E necessario registrar uma negociacao.");
        }
        validarNegociacao(form, indexesNegociacao, erros);
    }
}

function validarContatoCliente(form, indexes, erros) {
    var i;
    var idx;
    for (i = 0; i < indexes.length; i++) {
        idx = indexes[i];
        validarObrigatorioIndex(form, "tipoContato", idx, "Tipo Contato", erros);
        validarObrigatorioIndex(form, "nomeContato", idx, "Nome do Contato", erros);
        validarObrigatorioIndex(form, "telefoneContato", idx, "Telefone do Contato", erros);
    }
}

function validarNegociacao(form, indexes, erros) {
    var i;
    var idx;
    for (i = 0; i < indexes.length; i++) {
        idx = indexes[i];
        validarObrigatorioIndex(form, "nomeContatoNegocia", idx, "Nome do Contato", erros);
        validarObrigatorioIndex(form, "ComentarioNegocia", idx, "Comentario da Negociacao", erros);
    }
}

function validarObrigatorio(form, campo, label, erros) {
    var valor = form.getValue(campo);
    if (isVazio(valor)) {
        erros.push("O campo \"" + label + "\" e obrigatorio.");
    }
}

function validarObrigatorioIndex(form, campoBase, idx, label, erros) {
    var valor = form.getValue(campoBase + "___" + idx);
    if (isVazio(valor)) {
        erros.push("O campo \"" + label + "\" e obrigatorio (linha " + idx + ").");
    }
}

function isVazio(valor) {
    return valor == null || valor == "" || valor == "null";
}
