import{d as z,o as N,b as d,c,f as t,t as O,e as M,g as n,w as i,u as C,l as I,Z as K,h as T,p as L,G as Z,n as j,r as _,s as A,E as g,i as u,m as D,F as q,k as H,$ as J,B as Q}from"./index-B1u3nieA.js";import{a as V}from"./index-ChNUjLLo.js";import{u as W}from"./agent-WRYR5BAs.js";import"./conversation-C4tqOoff.js";async function X(){return await V.post("/auth/otp-bind")}async function Y(p){const y={otp_code:p};return await V.post("/auth/otp-verify",y)}async function ee(){return await V.get("/auth/otp-status")}async function te(p){const y={otp_code:p};return await V.post("/auth/otp-unbind",y)}const se={class:"otp-bind-panel"},ne={class:"bind-title"},oe={key:0,class:"bind-subtitle"},ae={key:0,class:"bind-loading"},le={key:1,class:"bind-content"},ie={class:"qr-section"},re={class:"qr-wrapper"},de=["src"],ce={key:1,class:"qr-placeholder"},ue={class:"secret-section"},pe={class:"secret-display"},fe={class:"secret-text"},_e={class:"verify-section"},ve={class:"bind-actions"},me=z({__name:"OtpBindPanel",props:{userId:{},name:{}},emits:["bind-success","cancel"],setup(p,{emit:y}){const r=p,P=y,b=_(),v=_(!0),m=_(!1),x=_(""),w=_(""),f=_(""),s=_(!1),e=A({otpCode:""}),h={otpCode:[{required:!0,message:"请输入 6 位验证码",trigger:"blur"},{len:6,message:"验证码为 6 位数字",trigger:"blur"},{pattern:/^\d{6}$/,message:"验证码只能包含数字",trigger:"blur"}]};N(async()=>{await $()});async function $(){v.value=!0,f.value="";try{const a=await X();w.value=a.secret,x.value=a.qr_code_base64}catch(a){const o=a instanceof Error?a.message:"获取绑定信息失败";console.error("[OtpBindPanel] 获取绑定信息失败:",a),f.value=o}finally{v.value=!1}}async function B(){if(w.value)try{await navigator.clipboard.writeText(w.value),s.value=!0,g.success("密钥已复制到剪贴板"),setTimeout(()=>{s.value=!1},2e3)}catch{const a=document.createElement("textarea");a.value=w.value,a.style.position="fixed",a.style.opacity="0",document.body.appendChild(a),a.select();try{document.execCommand("copy"),s.value=!0,g.success("密钥已复制到剪贴板"),setTimeout(()=>{s.value=!1},2e3)}catch{g.error("复制失败,请手动复制密钥")}document.body.removeChild(a)}}async function k(){var o;if(await((o=b.value)==null?void 0:o.validate().catch(()=>!1))){m.value=!0,f.value="";try{const l=await Y(e.otpCode.trim());l.verified?(g.success("OTP 绑定成功"),P("bind-success",l.token||"",l.user_id||r.userId,l.name||r.name,l.role||"")):(f.value="验证码错误,请重新输入",e.otpCode="")}catch(l){const S=l instanceof Error?l.message:"验证失败,请重试";console.error("[OtpBindPanel] 验证失败:",l),f.value=S}finally{m.value=!1}}}return(a,o)=>{const l=u("el-icon"),S=u("el-button"),F=u("el-input"),R=u("el-form-item"),U=u("el-form"),G=u("el-alert");return d(),c("div",se,[t("div",ne,[o[2]||(o[2]=t("h2",null,"🔐 首次登录 — 绑定 OTP 二次验证",-1)),p.name?(d(),c("p",oe,"欢迎,"+O(p.name),1)):M("",!0)]),v.value?(d(),c("div",ae,[n(l,{class:"is-loading"},{default:i(()=>[n(C(I))]),_:1}),o[3]||(o[3]=t("p",null,"正在生成密钥...",-1))])):(d(),c("div",le,[t("div",ie,[t("div",re,[x.value?(d(),c("img",{key:0,src:"data:image/png;base64,"+x.value,alt:"OTP 二维码",class:"qr-image"},null,8,de)):(d(),c("div",ce,[n(l,{size:48},{default:i(()=>[n(C(K))]),_:1}),o[4]||(o[4]=t("p",null,"二维码加载失败",-1))]))]),o[5]||(o[5]=t("p",{class:"qr-hint"},"请使用 Google Authenticator 或 Microsoft Authenticator 扫码",-1))]),o[6]||(o[6]=t("div",{class:"divider-line"},[t("span",null,"或手动输入密钥")],-1)),t("div",ue,[t("div",pe,[t("code",fe,O(w.value),1),n(S,{size:"small",type:s.value?"success":"default",class:"copy-btn",onClick:B},{default:i(()=>[T(O(s.value?"✅ 已复制":"📋 复制"),1)]),_:1},8,["type"])])]),t("div",_e,[n(U,{ref_key:"formRef",ref:b,model:e,rules:h,"label-position":"top",onSubmit:L(k,["prevent"])},{default:i(()=>[n(R,{label:"验证码",prop:"otpCode"},{default:i(()=>[n(F,{modelValue:e.otpCode,"onUpdate:modelValue":o[0]||(o[0]=E=>e.otpCode=E),placeholder:"请输入 6 位验证码",size:"large",maxlength:"6","show-word-limit":"",onKeydown:Z(k,["enter"])},null,8,["modelValue"])]),_:1})]),_:1},8,["model"])]),t("div",ve,[n(S,{type:"primary",size:"large",loading:m.value,disabled:m.value||e.otpCode.length!==6,class:"verify-btn",onClick:k},{default:i(()=>[T(O(m.value?"验证中...":"验证并完成绑定"),1)]),_:1},8,["loading","disabled"])])])),f.value?(d(),j(G,{key:2,title:f.value,type:"error","show-icon":"",closable:!0,onClose:o[1]||(o[1]=E=>f.value=""),class:"bind-error"},null,8,["title"])):M("",!0)])}}}),ge=D(me,[["__scopeId","data-v-44baea43"]]),ye={class:"settings-page"},be={class:"card-header"},we={key:0,class:"status-loading"},he={key:1,class:"otp-content"},Ce={class:"otp-info"},Oe={class:"info-row"},ke={class:"info-value"},Te={key:0,class:"info-row"},Pe={class:"info-value info-time"},xe={class:"otp-actions"},$e={class:"otp-warning"},Be={class:"otp-actions"},Se=z({__name:"Settings",setup(p){const y=W(),r=A({bound:!1,enabled:!1,last_verified_at:null}),P=_(!0),b=_(!1),v=_(!1);N(async()=>{await m()});async function m(){P.value=!0;try{const s=await ee();r.bound=s.bound,r.enabled=s.enabled,r.last_verified_at=s.last_verified_at??null}catch(s){const e=s instanceof Error?s.message:"获取 OTP 状态失败";console.error("[Settings] 获取 OTP 状态失败:",s),g.error(e)}finally{P.value=!1}}async function x(){try{const{value:s}=await Q.prompt("请输入当前 6 位 OTP 验证码以确认解绑","解绑 OTP 二次验证",{confirmButtonText:"确认解绑",cancelButtonText:"取消",inputPlaceholder:"请输入 6 位验证码",inputType:"text",inputValidator:h=>!h||h.trim().length!==6?"请输入 6 位验证码":/^\d{6}$/.test(h.trim())?!0:"验证码只能包含数字",confirmButtonClass:"el-button--danger",inputErrorMessage:"验证码格式不正确"});if(s===void 0)return;b.value=!0,(await te(s.trim())).success?(g.success("OTP 已解绑,二次验证已关闭"),await m()):g.error("解绑失败,请重试")}catch(s){if(s==="cancel"||s==="close")return;const e=s instanceof Error?s.message:"解绑失败,请重试";console.error("[Settings] 解绑 OTP 失败:",s),g.error(e)}finally{b.value=!1}}async function w(){v.value=!1,g.success("OTP 二次验证绑定成功"),await m()}function f(s){try{return new Date(s).toLocaleString("zh-CN",{year:"numeric",month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit",second:"2-digit"})}catch{return s}}return(s,e)=>{const h=u("el-tag"),$=u("el-icon"),B=u("el-divider"),k=u("el-button"),a=u("el-card"),o=u("el-dialog");return d(),c("div",ye,[e[11]||(e[11]=t("h1",{class:"page-title"},"个人设置",-1)),n(a,{class:"settings-card otp-card",shadow:"hover"},{header:i(()=>[t("div",be,[e[3]||(e[3]=t("span",{class:"card-title"},"🔐 OTP 二次验证",-1)),n(h,{type:r.bound?"success":"warning",size:"small",effect:"plain"},{default:i(()=>[T(O(r.bound?"已绑定":"未绑定"),1)]),_:1},8,["type"])])]),default:i(()=>[P.value?(d(),c("div",we,[n($,{class:"is-loading"},{default:i(()=>[n(C(I))]),_:1}),e[4]||(e[4]=t("span",null,"正在查询状态...",-1))])):(d(),c("div",he,[r.bound?(d(),c(q,{key:0},[t("div",Ce,[t("div",Oe,[e[6]||(e[6]=t("span",{class:"info-label"},"绑定状态",-1)),t("span",ke,[n($,{class:"check-icon"},{default:i(()=>[n(C(H))]),_:1}),e[5]||(e[5]=T(" OTP 二次验证已启用 ",-1))])]),r.last_verified_at?(d(),c("div",Te,[e[7]||(e[7]=t("span",{class:"info-label"},"最近验证",-1)),t("span",Pe,O(f(r.last_verified_at)),1)])):M("",!0)]),n(B),t("div",xe,[e[8]||(e[8]=t("p",{class:"action-hint"}," 解绑后将关闭二次验证保护,建议保持开启以增强账户安全。 ",-1)),n(k,{type:"danger",loading:b.value,disabled:b.value,onClick:x},{default:i(()=>[T(O(b.value?"解绑中...":"解绑 OTP"),1)]),_:1},8,["loading","disabled"])])],64)):(d(),c(q,{key:1},[t("div",$e,[n($,{class:"warning-icon"},{default:i(()=>[n(C(J))]),_:1}),e[9]||(e[9]=t("div",{class:"warning-text"},[t("p",{class:"warning-title"},"您的账户尚未绑定 OTP 二次验证"),t("p",{class:"warning-desc"}," 绑定后每次登录需输入动态验证码,有效防止账户被盗。 ")],-1))]),n(B),t("div",Be,[n(k,{type:"primary",class:"bind-btn",onClick:e[0]||(e[0]=l=>v.value=!0)},{default:i(()=>[...e[10]||(e[10]=[T(" 立即绑定 ",-1)])]),_:1})])],64))]))]),_:1}),n(o,{modelValue:v.value,"onUpdate:modelValue":e[2]||(e[2]=l=>v.value=l),title:"绑定 OTP 二次验证",width:"520px","close-on-click-modal":!1,"close-on-press-escape":!1,"destroy-on-close":""},{default:i(()=>[n(ge,{"user-id":C(y).userId,name:C(y).agentName,onBindSuccess:w,onCancel:e[1]||(e[1]=l=>v.value=!1)},null,8,["user-id","name"])]),_:1},8,["modelValue"])])}}}),ze=D(Se,[["__scopeId","data-v-e0297981"]]);export{ze as default};