function documentoValido(valor) {
    var v = String(valor || "").trim().toUpperCase();
    if (!v) return false;
    if (v === "000000" || v === "000001") return false;
    if (/^0+$/.test(v)) return false;
    if (/^X+$/.test(v)) return false;
    return true;
}

function consultarComFallback(clientService, endpoints, contexto) {
    var ultimoErro = "";

    for (var i = 0; i < endpoints.length; i++) {
        try {
            var req = {
                companyId: "1",
                serviceCode: "Postprod",
                endpoint: endpoints[i],
                method: "get",
                timeoutService: "60000",
                headers: {
                    "Content-Type": "application/json"
                }
            };

            log.info("[ST114] Consulta " + contexto + " => " + endpoints[i]);
            var response = clientService.invoke(JSON.stringify(req));
            if (!response || !response.getResult()) {
                ultimoErro = "Sem resposta";
                continue;
            }

            var body = JSON.parse(response.getResult());
            if (body && body.sucesso) {
                return { sucesso: true, body: body };
            }

            ultimoErro = (body && (body.erro || body.message)) ? String(body.erro || body.message) : "Resposta sem sucesso";
        } catch (e) {
            ultimoErro = String(e);
        }
    }

    return { sucesso: false, erro: ultimoErro || ("Falha na consulta de " + contexto) };
}

function apurarAssinaturas(pedidos) {
    var resumo = {
        total: 0,
        aprovadas: 0,
        pendentes: 0,
        bloqueadas: 0,
        rejeitadas: 0,
        outros: 0
    };

    for (var i = 0; i < pedidos.length; i++) {
        var alcadas = (pedidos[i] && pedidos[i].ALCADAS) ? pedidos[i].ALCADAS : [];
        for (var j = 0; j < alcadas.length; j++) {
            var status = String((alcadas[j] && alcadas[j].CR_STATUS) || "").trim();
            if (!status) continue;

            resumo.total++;
            if (status === "03") {
                resumo.aprovadas++;
            } else if (status === "01" || status === "02") {
                resumo.pendentes++;
            } else if (status === "04") {
                resumo.bloqueadas++;
            } else if (status === "06" || status === "07") {
                resumo.rejeitadas++;
            } else {
                resumo.outros++;
            }
        }
    }

    return resumo;
}

function servicetask114(attempt, message) {
    log.info("[ST114] Inicio - valida cotacao, pedido e assinaturas");

    var numSC = String(hAPI.getCardValue("numeroSCProtheus") || "").trim();
    var numCotForm = String(hAPI.getCardValue("cotacaoSCProtheus") || "").trim();
    var numPedForm = String(hAPI.getCardValue("pedidoSCProtheus") || "").trim();

    if (!numSC) {
        throw "Numero da SC nao informado no formulario.";
    }

    var clientService = fluigAPI.getAuthorizeClientService();

    var consultaSC = consultarComFallback(clientService, [
        "/UF_MATA110/" + numSC,
        "/rest/UF_MATA110/" + numSC,
        "/rest/uf_mata110/" + numSC
    ], "SC " + numSC);

    if (!consultaSC.sucesso) {
        throw "Nao foi possivel consultar a SC " + numSC + ": " + consultaSC.erro;
    }

    var solicitacoes = (consultaSC.body && consultaSC.body.solicitacoes) ? consultaSC.body.solicitacoes : [];
    if (!solicitacoes.length) {
        throw "SC " + numSC + " sem retorno de dados no Protheus.";
    }

    var sc = solicitacoes[0] || {};
    var numCot = documentoValido(sc.C1_COTACAO) ? String(sc.C1_COTACAO).trim() : numCotForm;
    var numPed = documentoValido(sc.C1_PEDIDO) ? String(sc.C1_PEDIDO).trim() : numPedForm;

    if (!documentoValido(numCot)) {
        hAPI.setCardValue("statusAtendimento", "Aguardando cotacao");
        throw "Cotacao ainda nao disponivel para a SC " + numSC + ".";
    }
    hAPI.setCardValue("cotacaoSCProtheus", numCot);

    if (!documentoValido(numPed)) {
        hAPI.setCardValue("statusAtendimento", "Aguardando pedido");
        throw "Pedido ainda nao gerado para a SC " + numSC + ".";
    }
    hAPI.setCardValue("pedidoSCProtheus", numPed);

    var consultaPedido = consultarComFallback(clientService, [
        "/UF_MATA120/" + numPed,
        "/rest/UF_MATA120/" + numPed,
        "/rest/uf_mata120/" + numPed
    ], "Pedido " + numPed);

    if (!consultaPedido.sucesso) {
        throw "Nao foi possivel consultar o pedido " + numPed + ": " + consultaPedido.erro;
    }

    var pedidos = (consultaPedido.body && consultaPedido.body.pedidos) ? consultaPedido.body.pedidos : [];
    var assinatura = apurarAssinaturas(pedidos);

    if (assinatura.total === 0) {
        hAPI.setCardValue("statusAtendimento", "Pedido sem alcadas");
        throw "Pedido " + numPed + " sem alcadas de assinatura retornadas.";
    }

    if (assinatura.bloqueadas > 0 || assinatura.rejeitadas > 0) {
        hAPI.setCardValue("statusAtendimento", "Pedido bloqueado/rejeitado");
        throw "Pedido " + numPed + " bloqueado/rejeitado. Nao pode seguir para recebimento.";
    }

    if (assinatura.aprovadas < assinatura.total) {
        hAPI.setCardValue("statusAtendimento", "Pedido pendente de assinatura");
        throw "Pedido " + numPed + " ainda nao esta 100% assinado (" + assinatura.aprovadas + "/" + assinatura.total + ").";
    }

    hAPI.setCardValue("statusAtendimento", "Pedido 100% assinado");
    log.info("[ST114] Pedido " + numPed + " 100% assinado. Fluxo liberado para receber produto/servico.");
}
