(function (){
if(!window.BDMChatPages) window.BDMChatPages={};
var LS_CACHE_PREFIX="motelswing_panel_cache_";
function cfg(){
return window.motelswingChat||{};}
function panelBase(){
var b=cfg();
var base=String(b.panelBaseUrl||"").trim();
if(!base){
var sample=String(b.panelTermosAbsUrl||"").trim();
if(sample){
base=sample.replace(/\/[^/]*$/, "");
}}
return base.replace(/\/$/, "");
}
function authToken(){
var b=cfg();
return String(b.panelAuthToken||b.panelTermosAuthToken||"").trim();
}
function scriptPath(kind){
var scripts=cfg().panelScripts;
if(!scripts||typeof scripts!=="object") return "";
var p=String(scripts[kind]||"").trim();
if(p&&p.charAt(0)!=="/") p="/" + p;
return p;
}
function directEnabled(){
var b=cfg();
if(b.panelDirectEnabled===false) return false;
return !!panelBase()&&!!authToken()&&!!scriptPath("suites");
}
function timeoutMs(){
var n=parseInt(String(cfg().panelDirectTimeoutMs||"25000"), 10);
return isFinite(n)&&n >=5000 ? n:25000;
}
function cacheTtlMs(kind){
var map=cfg().panelDirectCacheTtlMs;
if(map&&typeof map==="object"&&map[kind]!=null){
var custom=parseInt(String(map[kind]), 10);
if(isFinite(custom)&&custom >=0) return custom;
}
if(kind==="suites") return 5 * 60 * 1000;
if(kind==="pontosSaldo") return 2 * 60 * 1000;
return 0;
}
function cacheKey(kind, fields){
try {
return LS_CACHE_PREFIX + kind + "_" + JSON.stringify(fields||{});
} catch (e){
return LS_CACHE_PREFIX + kind;
}}
function readCache(kind, fields){
var ttl=cacheTtlMs(kind);
if(ttl <=0) return null;
try {
var raw=sessionStorage.getItem(cacheKey(kind, fields));
if(!raw) return null;
var pack=JSON.parse(raw);
if(!pack||!pack.t||!pack.data) return null;
if(Date.now() - pack.t > ttl){
sessionStorage.removeItem(cacheKey(kind, fields));
return null;
}
return pack.data;
} catch (e){
return null;
}}
function writeCache(kind, fields, data){
var ttl=cacheTtlMs(kind);
if(ttl <=0||data==null) return;
try {
sessionStorage.setItem(cacheKey(kind, fields),
JSON.stringify({ t: Date.now(), data: data })
);
} catch (e){  }}
function encodeForm(fields){
var p=new URLSearchParams();
Object.keys(fields||{}).forEach(function (k){
var v=fields[k];
if(v===null||v===undefined) return;
p.append(k, String(v));
});
return p.toString();
}
function buildPanelFields(extra){
var out={ token: authToken() };
Object.keys(extra||{}).forEach(function (k){
var v=extra[k];
if(v===null||v===undefined) return;
out[k]=v;
});
return out;
}
function shouldForceAvailability(){
var b=cfg();
var flag=String(b.motelIntegracao||window.BDMChatMotelIntegracao||"").trim().toUpperCase();
return flag==="N";
}
function forceSuiteAvailability(suite){
if(!suite||typeof suite!=="object") return;
suite.disponibilidade=1;
suite.disponivel=1;
suite["disponível"]=1;
suite.indisponivel=0;
suite["indisponível"]=0;
}
function applyIntegracaoOverrides(data){
if(!shouldForceAvailability()||!data) return data;
if(Array.isArray(data)){
data.forEach(function (item){
if(item&&typeof item==="object") forceSuiteAvailability(item);
});
return data;
}
if(typeof data!=="object") return data;
if(Array.isArray(data.suites)){
data.suites.forEach(forceSuiteAvailability);
}
if(data.suite&&typeof data.suite==="object") forceSuiteAvailability(data.suite);
if(data.detalhes&&typeof data.detalhes==="object") forceSuiteAvailability(data.detalhes);
if(data.data&&typeof data.data==="object") applyIntegracaoOverrides(data.data);
forceSuiteAvailability(data);
return data;
}
function parseJsonText(text){
var s=String(text==null ? "":text).trim();
if(!s) return null;
try {
return JSON.parse(s);
} catch (e){
return null;
}}
function panelRequest(path, fields, mode){
var url=panelBase() + (path.charAt(0)==="/" ? path:"/" + path);
var controller=typeof AbortController!=="undefined" ? new AbortController():null;
var timer=controller
? setTimeout(function (){
try {
controller.abort();
} catch (e){  }}, timeoutMs())
: null;
var headers={ Accept: "application/json" };
var body;
if(mode==="form"){
headers["Content-Type"]="application/x-www-form-urlencoded;charset=UTF-8";
body=encodeForm(fields);
}else{
headers["Content-Type"]="application/json";
body=JSON.stringify(fields);
}
return fetch(url, {
method: "POST",
mode: "cors",
credentials: "omit",
headers: headers,
body: body,
signal: controller ? controller.signal:undefined
})
.then(function (r){
return r.text().then(function (t){
return { ok: r.ok, status: r.status, text: t, json: parseJsonText(t) };});
})
.finally(function (){
if(timer) clearTimeout(timer);
});
}
function panelPostScript(path, fields){
return panelRequest(path, fields, "json").then(function (res){
if(res.json&&typeof res.json==="object"){
return res.json;
}
return panelRequest(path, fields, "form").then(function (res2){
if(res2.json&&typeof res2.json==="object"){
return res2.json;
}
var err=(res2.json&&res2.json.erro) ? String(res2.json.erro):"Resposta inválida do painel.";
return { erro: err, _status: res2.status||502 };});
});
}
function fetchRestJson(restUrl, fields, useGet){
var url=String(restUrl||"").trim();
if(!url) return Promise.reject(new Error("REST não configurado."));
var pages=window.BDMChatPages||{};
if(useGet){
return fetch(url, { credentials: "same-origin" }).then(function (r){
return r.json();
});
}
return fetch(url, {
method: "POST",
credentials: "same-origin",
headers: pages.mergeWidgetAuthHeaders
? pages.mergeWidgetAuthHeaders({ "Content-Type": "application/json" })
: { "Content-Type": "application/json" },
body: JSON.stringify(fields||{})
}).then(function (r){
return r.json();
});
}
function fetchRestWithStatus(restUrl, fields){
var url=String(restUrl||"").trim();
if(!url) return Promise.reject(new Error("REST não configurado."));
var pages=window.BDMChatPages||{};
return fetch(url, {
method: "POST",
credentials: "same-origin",
headers: pages.mergeWidgetAuthHeaders
? pages.mergeWidgetAuthHeaders({ "Content-Type": "application/json" })
: { "Content-Type": "application/json" },
body: JSON.stringify(fields||{})
}).then(function (r){
return r
.json()
.then(function (j){
return { status: r.status, json: j };})
.catch(function (){
return { status: r.status, json: { erro: "Resposta inválida do servidor." }};});
});
}
function postDirect(kind, fields){
var path=scriptPath(kind);
if(!path) return Promise.reject(new Error("Script do painel não configurado."));
var cached=readCache(kind, fields);
if(cached!=null){
return Promise.resolve(cached);
}
return panelPostScript(path, buildPanelFields(fields)).then(function (json){
applyIntegracaoOverrides(json);
writeCache(kind, fields, json);
return json;
});
}
window.BDMChatPages.fetchWidgetJson=function (ctx, kind, fields, restUrl, opts){
opts=opts||{};
fields=fields||{};
var useGet = !!opts.useGet;
if(directEnabled()){
return postDirect(kind, fields).catch(function (){
return fetchRestJson(restUrl, fields, useGet);
});
}
return fetchRestJson(restUrl, fields, useGet);
};
function postDirectNoCache(kind, fields){
var path=scriptPath(kind);
if(!path) return Promise.reject(new Error("Script do painel não configurado."));
return panelPostScript(path, buildPanelFields(fields));
}
function normalizeReservaSavePanelJson(json){
if(json==null||json===""){
return {
ok: false,
status: 403,
json: {
result: "error",
erro: "Token do painel recusado (resposta vazia).",
message: "Token do painel recusado (resposta vazia)."
}};}
if(typeof json==="string"){
var t=String(json).trim();
return {
ok: false,
status: 400,
json: { result: "error", erro: t||"Resposta inválida do painel.", message: t||"Resposta inválida do painel." }};}
if(Array.isArray(json)&&json.length){
return { ok: true, status: 200, json: json };}
if(json&&typeof json==="object"&&String(json.result||"").toLowerCase()==="error"){
var msg=String(json.message||json.erro||"Não foi possível concluir a reserva.").trim();
return { ok: false, status: 400, json: { result: "error", erro: msg, message: msg, reserva: json.reserva||null }};}
return {
ok: false,
status: 502,
json: { result: "error", erro: "Resposta inesperada ao salvar a reserva.", message: "Resposta inesperada ao salvar a reserva." }};}
window.BDMChatPages.saveReserva=function (ctx, payload, restUrl){
payload=payload&&typeof payload==="object" ? Object.assign({}, payload):{};
var fields=Object.assign({}, payload);
delete fields.session_token;
if(directEnabled()&&scriptPath("reservasSave")){
return postDirectNoCache("reservasSave", fields)
.then(function (json){
var parsed=normalizeReservaSavePanelJson(json);
return { status: parsed.status, json: parsed.json };})
.catch(function (){
return fetchRestWithStatus(restUrl, payload);
});
}
return fetchRestWithStatus(restUrl, payload);
};
window.BDMChatPages.fetchWidgetJsonWithStatus=function (ctx, kind, fields, restUrl){
fields=fields||{};
if(directEnabled()){
return postDirect(kind, fields)
.then(function (json){
var st=json&&json.erro ? 400:200;
return { status: st, json: json };})
.catch(function (){
return fetchRestWithStatus(restUrl, fields);
});
}
return fetchRestWithStatus(restUrl, fields);
};
window.BDMChatPages.panelDirectEnabled=function (){
return directEnabled();
};})();