(function (){
if(!window.BDMChatPages) window.BDMChatPages={};
var LS_PENDING_RESERVA="bdm_chat_pending_reserva";
var LS_PENDING_PAYMENT="bdm_chat_pending_payment";
function getPendingReservaApproval(){
try {
var raw=localStorage.getItem(LS_PENDING_RESERVA);
return raw ? JSON.parse(raw):null;
} catch (e){
return null;
}}
function clearPendingReservaApproval(){
try {
localStorage.removeItem(LS_PENDING_RESERVA);
} catch (e){}}
function getPendingPayment(){
try {
var raw=localStorage.getItem(LS_PENDING_PAYMENT);
return raw ? JSON.parse(raw):null;
} catch (e){
return null;
}}
function clearPendingPayment(){
try {
localStorage.removeItem(LS_PENDING_PAYMENT);
} catch (e){}}
function extractReservaStatusFromDetalhe(api){
function readStatus(o){
if(!o||typeof o!=="object") return "";
return String(
o.status_reserva||o.status||o.checking||o.result||o.situacao||o.estado||""
).trim();
}
if(Array.isArray(api)&&api.length) return readStatus(api[0]).toUpperCase();
if(api&&typeof api==="object"&&Array.isArray(api.data)&&api.data.length){
return readStatus(api.data[0]).toUpperCase();
}
return readStatus(api).toUpperCase();
}
function escapeHtml(s){
return String(s||"")
.replace(/&/g, "&amp;")
.replace(/</g, "&lt;")
.replace(/>/g, "&gt;")
.replace(/"/g, "&quot;");
}
function highlightFidelidadeMensagem(msg){
var escaped=escapeHtml(msg);
return escaped
.replace(/(\d+\s+reservas?)/gi, "<strong>$1</strong>")
.replace(/(\d+\s+pontos?)/gi, "<strong>$1</strong>")
.replace(/(reserva da mesma su[ií]te\.?)/gi, "<strong>$1</strong>");
}
function splitMensagemLinhas(msg){
var s=String(msg||"").trim();
if(!s) return [];
var idx=s.search(/,\s*junte\s+/i);
if(idx >=0){
var p1=s.slice(0, idx + 1).trim();
var p2=s.slice(idx + 1).replace(/^,\s*/i, "").trim();
return [p1, p2];
}
return [s];
}
function parseFidelidadeBanner(api){
if(!api||typeof api!=="object") return null;
if(api.programa_ativo===false||api.programa_ativo===0||api.programa_ativo==="0") return null;
var result=String(api.result||"").trim().toLowerCase();
if(result&&result!=="success"&&result!=="ok") return null;
var block=api.regras;
var mensagem="";
if(block&&typeof block==="object"&&!Array.isArray(block)){
mensagem=String(block.mensagem||"").trim();
}
if(!mensagem) mensagem=String(api.mensagem||"").trim();
if(!mensagem){
var pts=block&&block.resgate_suite_pontos ? block.resgate_suite_pontos:920;
mensagem =
"Faça até 5 reservas pelo aplicativo, junte " +
pts +
" pontos e troque por uma nova reserva da mesma suíte.";
}
return { mensagem: mensagem };}
function mountFidelidadeBanner(ctx, node, api){
var banner=node.querySelector('[data-slot="fidelidade-banner"]');
var copy=node.querySelector('[data-slot="fidelidade-mensagem"]');
if(!banner||!copy) return;
var data=parseFidelidadeBanner(api);
if(!data||!data.mensagem){
banner.setAttribute("hidden", "hidden");
return;
}
copy.innerHTML="";
splitMensagemLinhas(data.mensagem).forEach(function (linha){
var p=document.createElement("p");
p.className="bdm-fidelidade-banner-line";
p.innerHTML=highlightFidelidadeMensagem(linha);
copy.appendChild(p);
});
banner.removeAttribute("hidden");
}
function isReservaPagamentoAtiva(status){
var s=String(status||"").toUpperCase();
return (
s==="PENDENTE" ||
s==="ACEITO" ||
s==="AGUARDANDO" ||
s==="AGUARDANDO PAGAMENTO" ||
s==="AGUARDANDO_PAGAMENTO" ||
s==="WAIT" ||
s==="VERIFICANDO"
);
}
window.BDMChatPages.home=function (ctx, motel){
ctx.state.currentView="home";
var pages=window.BDMChatPages||{};
var uid=pages.getUsuarioId ? pages.getUsuarioId():0;
var detalheUrl=(ctx.urls.reservaDetalhe||"").trim();
var pagamentoCheckUrl=(ctx.urls.pagamentoCheck||"").trim();
var pending=getPendingReservaApproval();
var pendingPayment=getPendingPayment();
function shouldResumePendingPaymentFlow(){
if(!pendingPayment||!pendingPayment.codigo_reserva||!uid||!detalheUrl){
return Promise.resolve(false);
}
if(parseInt(String(pendingPayment.id_usuario||0), 10)!==uid){
clearPendingPayment();
return Promise.resolve(false);
}
var codigoReserva=String(pendingPayment.codigo_reserva||"").trim();
if(!codigoReserva){
clearPendingPayment();
return Promise.resolve(false);
}
function resumeIfStillOpen(){
return fetch(detalheUrl, {
method: "POST",
credentials: "same-origin",
headers: window.BDMChatPages.mergeWidgetAuthHeaders({ "Content-Type": "application/json" }),
body: JSON.stringify({ id_usuario: uid, codigo_reserva: codigoReserva })
})
.then(function (r){ return r.json(); })
.then(function (detalhe){
var status=extractReservaStatusFromDetalhe(detalhe);
if(!isReservaPagamentoAtiva(status)){
clearPendingPayment();
return false;
}
ctx.state.lastReservaPaymentData=pendingPayment.payload&&typeof pendingPayment.payload==="object"
? pendingPayment.payload
: { codigo_reserva: codigoReserva, id_usuario: uid };
if(!ctx.state.lastReservaPaymentData.codigo_reserva){
ctx.state.lastReservaPaymentData.codigo_reserva=codigoReserva;
}
if(!ctx.state.lastReservaPaymentData.id_usuario){
ctx.state.lastReservaPaymentData.id_usuario=uid;
}
ctx.navigate("reservaPagamento");
return true;
})
.catch(function (){
return false;
});
}
if(!pagamentoCheckUrl){
return resumeIfStillOpen();
}
return fetch(pagamentoCheckUrl, {
method: "POST",
credentials: "same-origin",
headers: window.BDMChatPages.mergeWidgetAuthHeaders({ "Content-Type": "application/json" }),
body: JSON.stringify({ id_usuario: uid, codigo_reserva: codigoReserva })
})
.then(function (r){ return r.json().then(function (j){ return { status: r.status, json: j };});})
.then(function (res){
var payload=res&&res.json ? res.json:{};
if(res.status >=200&&res.status < 300){
var result=String(payload.result||payload.status||"").toUpperCase();
if(result==="OK"){
clearPendingPayment();
return false;
}}
return resumeIfStillOpen();
})
.catch(function (){
return resumeIfStillOpen();
});
}
function shouldResumePendingFlow(){
if(!pending||!pending.codigo_reserva||!uid||!detalheUrl){
return Promise.resolve(false);
}
if(parseInt(String(pending.id_usuario||0), 10)!==uid){
clearPendingReservaApproval();
return Promise.resolve(false);
}
return fetch(detalheUrl, {
method: "POST",
credentials: "same-origin",
headers: window.BDMChatPages.mergeWidgetAuthHeaders({ "Content-Type": "application/json" }),
body: JSON.stringify({ id_usuario: uid, codigo_reserva: pending.codigo_reserva })
})
.then(function (r){ return r.json(); })
.then(function (detalhe){
var status=extractReservaStatusFromDetalhe(detalhe);
if(status==="PENDENTE" ||
status==="WAIT" ||
status==="AGUARDANDO" ||
status==="VERIFICANDO"
){
ctx.state.lastReservaResult={
code: String(pending.codigo_reserva),
payload: pending.payload&&typeof pending.payload==="object"
? pending.payload
: { id_usuario: uid }};
ctx.navigate("reservaAguarde");
return true;
}
clearPendingReservaApproval();
return false;
})
.catch(function (){
return false;
});
}
shouldResumePendingPaymentFlow().then(function (resumedPayment){
if(resumedPayment) return true;
return shouldResumePendingFlow();
}).then(function (resumed){
if(resumed) return;
var pontosUrl=(ctx.urls.pontosFidelidade||"").trim();
var pages=window.BDMChatPages||{};
var fidelidadePromise=Promise.resolve(null);
if(uid&&pontosUrl){
fidelidadePromise=pages.fetchWidgetJson
? pages.fetchWidgetJson(ctx, "pontosSaldo", { id_usuario: uid }, pontosUrl).catch(function (){ return null; })
: fetch(pontosUrl, {
method: "POST",
credentials: "same-origin",
headers: pages.mergeWidgetAuthHeaders({ "Content-Type": "application/json" }),
body: JSON.stringify({ id_usuario: uid })
})
.then(function (r){ return r.json(); })
.catch(function (){ return null; });
}
var suitesPromise=pages.fetchWidgetJson
? pages.fetchWidgetJson(ctx, "suites", {}, ctx.urls.suites, { useGet: true })
: fetch(ctx.urls.suites, { credentials: "same-origin" }).then(function (r){ return r.json(); });
return Promise.all([
ctx.loadTemplate("home-suites"),
suitesPromise,
fidelidadePromise
])
.then(function (arr){
var html=arr[0];
var data=arr[1];
var fidelidade=arr[2];
if(!window.BDMChatMotelModel&&data&&typeof data==="object"&&data.motel&&typeof data.motel==="object"){
window.BDMChatMotelModel={ motel: data.motel };}
if((!window.BDMChatMotelIntegracao||window.BDMChatMotelIntegracao==="") &&
data &&
typeof data==="object" &&
data.motel &&
typeof data.motel==="object" &&
data.motel.integracao!=null
){
window.BDMChatMotelIntegracao=String(data.motel.integracao).trim().toUpperCase();
}
var node=ctx.htmlToNode(html);
mountFidelidadeBanner(ctx, node, fidelidade);
var grid=node.querySelector('[data-slot="suites"]')||node;
grid.innerHTML="";
var suites=(data&&data.suites) ? data.suites:(Array.isArray(data) ? data:[]);
if(!suites||!suites.length){
grid.appendChild(ctx.el("div", { class: "bdm-empty", text: "Nenhuma suíte encontrada." }));
}else{
suites.forEach(function (s){
var img=ctx.firstImageFromSuite(s);
var row=ctx.el("div", { class: "bdm-suite-row" });
row.addEventListener("click", function (){
ctx.state.selectedSuite=s;
ctx.navigate("suiteDetalhes");
});
var left=ctx.el("div", { class: "bdm-suite-left" });
if(img){
left.appendChild(ctx.el("img", { class: "bdm-suite-thumb", src: img, alt: ctx.safeText(s.nome||"Suíte"), loading: "lazy", referrerpolicy: "no-referrer" }));
}
var mid=ctx.el("div", { class: "bdm-suite-mid" });
mid.appendChild(ctx.el("div", { class: "bdm-suite-title" }, [ctx.safeText(s.nome||"Suíte")]));
var status=ctx.el("div", { class: "bdm-suite-status" });
status.appendChild(ctx.el("span", { class: "bdm-dot" }));
var unavailable =
typeof window.BDMChatSuiteUnavailableToday==="function"&&window.BDMChatSuiteUnavailableToday(s);
var available = !unavailable;
try {
var readIntegracao =
typeof window.BDMChatReadIntegracaoFlag==="function"
? window.BDMChatReadIntegracaoFlag
: function (){ return ""; };} catch (e){}
if(!available) status.className="bdm-suite-status -off";
status.appendChild(ctx.el("span", { text: available ? "Disponível":"Indisponível" }));
mid.appendChild(status);
var details=ctx.el("div", { class: "bdm-suite-details" });
var txt=ctx.htmlToText(s.texto||"");
if(txt){
details.appendChild(ctx.el("div", { class: "bdm-suite-text", text: txt }));
}
mid.appendChild(details);
var right=ctx.el("div", { class: "bdm-suite-right" });
var rawPrice=(s.apartir||s.preco||s.valor||s.preco2h||s.price) ? (s.apartir||s.preco||s.valor||s.preco2h||s.price):"";
var price="";
if(rawPrice!==null&&rawPrice!==undefined&&rawPrice!==""){
var n=parseFloat(String(rawPrice).replace(",", "."));
price=isFinite(n) ? ("R$ " + n.toFixed(2).replace(".", ",")):String(rawPrice);
}
if(price){
right.appendChild(ctx.el("div", { class: "bdm-suite-price-sub" }, ["a partir de"]));
right.appendChild(ctx.el("div", { class: "bdm-suite-price" }, [ctx.safeText(price)]));
}
var btn=ctx.el("button", { class: "bdm-suite-cta", type: "button" }, ["RESERVAR"]);
btn.addEventListener("click", function (ev){
if(ev&&ev.stopPropagation) ev.stopPropagation();
ctx.body.scrollTop=0;
ctx.body.appendChild(ctx.el("div", { class: "bdm-toast", text: "Reserva: em breve." }));
setTimeout(function (){
var t=ctx.body.querySelector(".bdm-toast");
if(t) t.remove();
}, 1800);
});
right.appendChild(btn);
row.appendChild(left);
row.appendChild(mid);
row.appendChild(right);
grid.appendChild(row);
});
}
ctx.body.innerHTML="";
ctx.body.appendChild(node);
ctx.wireActions(node);
})
.catch(function (){
ctx.body.textContent="Falha ao carregar suítes.";
});
}).catch(function (){
ctx.body.textContent="Falha ao carregar suítes.";
});
};})();