(function (){
if(!window.BDMChatPages) window.BDMChatPages={};
var LS_USER="bdm_chat_user";
function getUser(){
try {
var raw=localStorage.getItem(LS_USER);
return raw ? JSON.parse(raw):null;
} catch (e){ return null; }}
function setUser(u){
try { localStorage.setItem(LS_USER, JSON.stringify(u||{})); } catch (e){}}
function clearUser(){
try { localStorage.removeItem(LS_USER); } catch (e){}}
function getWidgetSessionToken(){
var u=getUser();
return u&&u.session_token ? String(u.session_token):"";
}
window.BDMChatPages.getWidgetAuthHeaders=function (){
var token=getWidgetSessionToken();
if(!token) return {};
var h={};
h["X-BDM-Widget-Session"]=token;
return h;
};
window.BDMChatPages.mergeWidgetAuthHeaders=function (headers){
var base=headers&&typeof headers==="object" ? Object.assign({}, headers):{};
var auth=window.BDMChatPages.getWidgetAuthHeaders();
Object.keys(auth).forEach(function (k){
base[k]=auth[k];
});
return base;
};
function applySessionTokenFromApi(u, apiJson){
if(!u||!apiJson||typeof apiJson!=="object") return u;
if(apiJson.session_token){
u.session_token=String(apiJson.session_token);
}
return u;
}
function normalizeDigits(v){
return String(v||"").replace(/[^\d]/g, "");
}
function usuarioIdFromLoginPayload(p){
if(!p||typeof p!=="object"||p._parseError) return 0;
var tryParse=function (v){
var n=parseInt(String(v==null ? "":v), 10);
return n > 0 ? n:0;
};
var id=tryParse(p.id);
if(id) return id;
id=tryParse(p.id_usuario);
if(id) return id;
id=tryParse(p.idUsuario);
if(id) return id;
id=tryParse(p.id_cliente);
if(id) return id;
id=tryParse(p.cliente_id);
if(id) return id;
if(p.usuario&&typeof p.usuario==="object"){
id=tryParse(p.usuario.id);
if(id) return id;
}
if(p.cliente&&typeof p.cliente==="object"){
id=tryParse(p.cliente.id);
if(id) return id;
}
if(p.data&&typeof p.data==="object"){
if(!Array.isArray(p.data)){
id=usuarioIdFromLoginPayload(p.data);
if(id) return id;
}else if(p.data.length&&p.data[0]&&typeof p.data[0]==="object"){
id=usuarioIdFromLoginPayload(p.data[0]);
if(id) return id;
}}
return 0;
}
function loginPainelResultIsOk(j){
if(!j||typeof j!=="object") return false;
return String(j.result==null ? "":j.result).trim().toUpperCase()==="OK";
}
window.BDMChatPages.isPanelResultOk=function (j, allowUserFallback){
if(!j) return false;
var o=j;
if(Array.isArray(o)&&o[0]&&typeof o[0]==="object") o=o[0];
if(!o||typeof o!=="object") return false;
if(o.erro!=null&&String(o.erro).trim()!=="") return false;
var r=String(o.result==null ? "":o.result).trim().toLowerCase();
if(r==="ok"||r==="1"||r==="true"||r==="sucesso") return true;
if(r==="error"||r==="505") return false;
var s=String(o.sucesso==null ? "":o.sucesso).trim().toLowerCase();
if(s==="s"||s==="sim"||s==="ok"||s==="1"||s==="true") return true;
if(o.success===true||o.success===1) return true;
if(!allowUserFallback) return false;
return !!(o.id||o.id_usuario||o.idUsuario||o.id_cliente);
};
function loginPainelMensagemErro(j){
if(!j||typeof j!=="object") return "Falha ao entrar.";
var m=j.erro!=null ? j.erro:j.mensagem!=null ? j.mensagem:j.message;
m=String(m==null ? "":m).trim();
return m||"Credenciais inválidas.";
}
function setAuthFormLoading(ctx, form, on, message){
if(!form) return;
message=message||"Verificando os dados…";
var slot=form.querySelector(".bdm-auth-feedback");
if(!slot){
var submit=form.querySelector(".bdm-auth-cta.-primary");
if(!submit||!submit.parentNode) return;
slot=document.createElement("div");
slot.className="bdm-auth-feedback";
slot.setAttribute("aria-live", "polite");
submit.parentNode.insertBefore(slot, submit.nextSibling);
}
var sub=form.querySelector(".bdm-auth-cta.-primary");
var out=form.querySelector(".bdm-auth-cta.-outline");
var eyes=form.querySelectorAll(".bdm-auth-eye");
var inputs=form.querySelectorAll("input");
if(on){
form.setAttribute("aria-busy", "true");
for (var i=0; i < inputs.length; i++) inputs[i].disabled=true;
for (var e=0; e < eyes.length; e++) eyes[e].disabled=true;
if(sub) sub.disabled=true;
if(out) out.disabled=true;
slot.innerHTML="";
var wrap=ctx.el("div", { class: "bdm-auth-form-loading" });
wrap.appendChild(ctx.el("i", { class: "bdm-fa fa-solid fa-circle-notch fa-spin", "aria-hidden": "true" }));
wrap.appendChild(ctx.el("span", { text: message }));
slot.appendChild(wrap);
}else{
form.removeAttribute("aria-busy");
for (var j=0; j < inputs.length; j++) inputs[j].disabled=false;
for (var g=0; g < eyes.length; g++) eyes[g].disabled=false;
if(sub) sub.disabled=false;
if(out) out.disabled=false;
var slotOff=form.querySelector(".bdm-auth-feedback");
if(slotOff){
var loadEl=slotOff.querySelector(".bdm-auth-form-loading");
if(loadEl&&loadEl.parentNode) loadEl.parentNode.removeChild(loadEl);
}}
}
function cadastroRespostaValida(j){
if(!j||typeof j!=="object"||j._parseError) return false;
return String(j.result==null ? "":j.result).trim().toUpperCase()==="OK";
}
function cadastroMensagemErro(j){
if(!j||typeof j!=="object") return "Falha ao cadastrar.";
var r=String(j.result==null ? "":j.result).trim();
if(r==="505"){
return "Este e-mail já está cadastrado. Faça login ou use outro e-mail.";
}
if(r.toLowerCase()==="error"){
return "Não foi possível concluir o cadastro. Tente novamente mais tarde.";
}
var m=j.erro!=null ? j.erro:j.mensagem!=null ? j.mensagem:j.message;
m=String(m==null ? "":m).trim();
return m||"Falha ao cadastrar.";
}
function showAuthFormFeedback(ctx, form, message, isError){
if(!form||!message) return;
var slot=form.querySelector(".bdm-auth-feedback");
if(!slot){
var submit=form.querySelector(".bdm-auth-cta.-primary");
if(!submit||!submit.parentNode) return;
slot=document.createElement("div");
slot.className="bdm-auth-feedback";
slot.setAttribute("aria-live", "polite");
submit.parentNode.insertBefore(slot, submit.nextSibling);
}
slot.innerHTML="";
var div=ctx.el("div", {
class: "bdm-auth-form-message" + (isError ? " bdm-auth-form-message--error":""),
text: String(message)
});
slot.appendChild(div);
}
window.BDMChatPages.authLanding=function (ctx, motel){
ctx.state.currentView="authLanding";
ctx.loadTemplate("auth-landing").then(function (html){
var node=ctx.htmlToNode(html);
ctx.applyBinds(node, { motel: motel||{}});
ctx.wireActions(node);
ctx.body.innerHTML="";
ctx.body.appendChild(node);
}).catch(function (){
ctx.body.textContent="Falha ao carregar.";
});
};
window.BDMChatPages.authLogin=function (ctx, motel){
ctx.state.currentView="authLogin";
ctx.loadTemplate("auth-login").then(function (html){
var node=ctx.htmlToNode(html);
ctx.applyBinds(node, { motel: motel||{}});
ctx.wireActions(node);
ctx.body.innerHTML="";
ctx.body.appendChild(node);
}).catch(function (){
ctx.body.textContent="Falha ao carregar.";
});
};
window.BDMChatPages.authRegister=function (ctx, motel){
ctx.state.currentView="authRegister";
ctx.loadTemplate("auth-register").then(function (html){
var node=ctx.htmlToNode(html);
ctx.applyBinds(node, { motel: motel||{}});
ctx.wireActions(node);
ctx.body.innerHTML="";
ctx.body.appendChild(node);
}).catch(function (){
ctx.body.textContent="Falha ao carregar.";
});
};
window.BDMChatPages.authSubmitLogin=function (ctx, form){
var email=String(form.email&&form.email.value||"").trim().toLowerCase();
var senha=String(form.senha&&form.senha.value||"").trim();
var feedbackSlot=form&&form.querySelector ? form.querySelector(".bdm-auth-feedback"):null;
if(feedbackSlot) feedbackSlot.innerHTML="";
setAuthFormLoading(ctx, form, true, "Verificando login…");
console.log("[BDM login] POST", ctx.urls.login, { email: email, senhaLength: senha.length });
fetch(ctx.urls.login, {
method: "POST",
credentials: "same-origin",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ email: email, senha: senha })
})
.then(function (r){
return r.text().then(function (text){
console.log("[BDM login] resposta bruta (login via REST → painel login.php)", {
status: r.status,
ok: r.ok,
contentType: r.headers.get("content-type"),
corpo: text
});
var j={};
if(text){
try {
j=JSON.parse(text);
} catch (e){
console.log("[BDM login] corpo não é JSON válido", e);
j={ _parseError: String(e), _raw: text };}}
return { status: r.status, json: j };});
})
.then(function (res){
var j=res.json||{};
console.log("[BDM login] objeto interpretado", j);
if(res.status < 200||res.status >=300){
showAuthFormFeedback(ctx, form, loginPainelMensagemErro(j), true);
return;
}
if(!loginPainelResultIsOk(j)||usuarioIdFromLoginPayload(j) <=0){
showAuthFormFeedback(ctx, form, loginPainelMensagemErro(j), true);
return;
}
var nomeLogin="";
if(j&&typeof j==="object"){
nomeLogin=String(j.nome||(j.cliente&&j.cliente.nome)||(j.usuario&&j.usuario.nome)||"").trim();
}
setUser(applySessionTokenFromApi({
logged: true,
payload: j,
email: email,
nome: nomeLogin||undefined
}, j));
ctx.navigate("home");
})
.catch(function (){
showAuthFormFeedback(ctx, form, "Falha ao entrar.", true);
})
.finally(function (){
setAuthFormLoading(ctx, form, false);
});
};
window.BDMChatPages.authSubmitRegister=function (ctx, form){
var nome=String(form.nome&&form.nome.value||"").trim();
var email=String(form.email&&form.email.value||"").trim().toLowerCase();
var cpf=normalizeDigits(form.cpf&&form.cpf.value||"");
var telefone=String(form.telefone&&form.telefone.value||"").trim();
var senha=String(form.senha&&form.senha.value||"").trim();
if(cpf.length!==11){
showAuthFormFeedback(ctx, form, "CPF inválido (precisa ter 11 dígitos).", true);
return;
}
if(senha.length < 6){
showAuthFormFeedback(ctx, form, "Senha muito curta (mín. 6 caracteres).", true);
return;
}
var regFeedback=form&&form.querySelector ? form.querySelector(".bdm-auth-feedback"):null;
if(regFeedback) regFeedback.innerHTML="";
setAuthFormLoading(ctx, form, true, "Verificando cadastro…");
fetch(ctx.urls.cadastro, {
method: "POST",
credentials: "same-origin",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ nome: nome, email: email, cpf: cpf, telefone: telefone, senha: senha })
})
.then(function (r){
return r.text().then(function (text){
var j={};
if(text){
try {
j=JSON.parse(text);
} catch (e){
j={ _parseError: String(e), _raw: text };}}
return { status: r.status, json: j };});
})
.then(function (res){
var j=res.json||{};
if(res.status < 200||res.status >=300){
showAuthFormFeedback(ctx, form, cadastroMensagemErro(j), true);
return;
}
if(!cadastroRespostaValida(j)){
showAuthFormFeedback(ctx, form, cadastroMensagemErro(j), true);
return;
}
setUser(applySessionTokenFromApi({
logged: true,
payload: j,
email: email,
nome: nome,
cpf: cpf,
telefone: telefone
}, j));
ctx.navigate("home");
})
.catch(function (){
showAuthFormFeedback(ctx, form, "Falha ao cadastrar.", true);
})
.finally(function (){
setAuthFormLoading(ctx, form, false);
});
};
window.BDMChatPages.getUserRecord=function (){
return getUser();
};
window.BDMChatPages.isLogged=function (){
var u=getUser();
return !!(u&&u.logged);
};
window.BDMChatPages.saveUserProfile=function (fields){
var u=getUser();
if(!u||!u.logged) return false;
var f=fields||{};
if(f.nome!=null) u.nome=String(f.nome).trim();
if(f.telefone!=null) u.telefone=String(f.telefone).trim();
if(f.cpf!=null) u.cpf=normalizeDigits(f.cpf);
u.profile=u.profile&&typeof u.profile==="object" ? u.profile:{};
if(f.endereco!=null) u.profile.endereco=String(f.endereco).trim();
if(f.cidade!=null) u.profile.cidade=String(f.cidade).trim();
if(f.uf!=null) u.profile.uf=String(f.uf).trim().slice(0, 2).toUpperCase();
if(f.cep!=null) u.profile.cep=String(f.cep).trim();
if(f.numero!=null) u.profile.numero=String(f.numero).trim();
if(f.bairro!=null) u.profile.bairro=String(f.bairro).trim();
setUser(u);
return true;
};
window.BDMChatPages.applyUserApiResponse=function (serverUser){
if(!serverUser||typeof serverUser!=="object") return false;
var u=getUser();
if(!u||!u.logged) return false;
var copy={};
Object.keys(serverUser).forEach(function (k){
if(k==="senha"||k==="result") return;
copy[k]=serverUser[k];
});
if(copy.nome!=null) u.nome=String(copy.nome).trim();
if(copy.telefone!=null) u.telefone=String(copy.telefone).trim();
if(copy.cpf!=null) u.cpf=normalizeDigits(copy.cpf);
if(copy.email!=null&&!u.email) u.email=String(copy.email).trim();
u.profile=u.profile&&typeof u.profile==="object" ? u.profile:{};
if(copy.endereco!=null) u.profile.endereco=String(copy.endereco).trim();
if(copy.numero!=null) u.profile.numero=String(copy.numero).trim();
if(copy.bairro!=null) u.profile.bairro=String(copy.bairro).trim();
if(copy.cidade!=null) u.profile.cidade=String(copy.cidade).trim();
if(copy.estado!=null) u.profile.uf=String(copy.estado).trim().slice(0, 2).toUpperCase();
if(copy.cep!=null) u.profile.cep=String(copy.cep).trim();
u.payload=Object.assign({}, u.payload||{}, copy);
setUser(u);
return true;
};
window.BDMChatPages.getUsuarioId=function (){
var u=getUser();
if(!u||!u.payload||typeof u.payload!=="object") return 0;
return usuarioIdFromLoginPayload(u.payload);
};
window.BDMChatPages.logout=function (){
clearUser();
};})();