import{_ as ne,r as d,o as ie,a as m,b as a,f as n,w as i,u as o,F as Y,g as G,h as v,i as p,d as A,e as w,t as u,j as ue,m as de,l as re,q as ve,n as pe}from"./index-DFoOAXeQ.js";import{s as P,C as ce,a as me,l as U}from"./index--fsvNaiQ.js";import{M as E}from"./Modal-BaZTW7NU.js";import{F as f}from"./FormInput-BsW78DWl.js";import{B as h}from"./Button-Ddldcbk7.js";import{B as R}from"./Badge-SZTgBg80.js";const fe={class:"server-manage"},he={class:"page-header"},ye={key:0,class:"loading"},ge={key:1,class:"empty-state"},Ve={key:2,class:"server-grid"},ke={class:"server-header"},be={class:"server-title"},_e={class:"server-body"},Se={class:"server-info-grid"},Fe={class:"info-item"},Ce={class:"info-content"},we={class:"info-value"},Pe={class:"info-item"},Ue={class:"info-content"},Ie={class:"info-value"},Te={class:"info-item"},Me={class:"info-content"},Ae={class:"info-value"},Ee={class:"info-item"},$e={class:"info-content"},xe={class:"info-value"},De={key:0,class:"progress-section"},Le={class:"progress-header"},Be={class:"status-text"},Ne={class:"progress-bar-container"},Re={class:"progress-details"},qe={class:"server-actions"},Oe=["onClick","disabled"],We=["onClick","disabled"],ze=["onClick"],Ke=["onClick"],Ye=["onClick"],Ge={class:"form-group"},je={class:"log-path-section"},He={class:"log-path-form"},Je={class:"log-path-inputs"},Qe={class:"log-path-list"},Xe={key:0,class:"empty-paths"},Ze={key:1,class:"path-cards"},el={class:"path-info"},ll={class:"path-main"},al={class:"path-value"},tl={class:"path-pattern"},sl={class:"path-meta"},ol={key:0,class:"path-desc"},nl=["onClick"],il={key:0},ul={key:1},dl={__name:"ServerManage",setup(rl){const j=[{value:"PASSWORD",label:"비밀번호"},{value:"KEY_FILE",label:"키 파일"}],$=d([]),x=d(!1),D=d(!1),L=d(!1),b=d(!1),g=d(!1),B=d(null),s=d({name:"",host:"",port:22,username:"",authType:"PASSWORD",password:"",keyFilePath:"",passphrase:"",active:!0}),I=d(!1),_=d(null),V=d([]),c=d({path:"",filePattern:"",description:""}),S=d(!1),N=d(null),F=d(null),r=d({}),T=d(null),C=d(!1),k=d(null),M=async()=>{x.value=!0;try{$.value=await P.getAll()}catch(t){console.error("Failed to load servers:",t),alert("서버 목록을 불러오는데 실패했습니다.")}finally{x.value=!1}},q=()=>{g.value=!1,B.value=null,s.value={name:"",host:"",port:22,username:"",authType:"PASSWORD",password:"",keyFilePath:"",passphrase:"",active:!0},b.value=!0},H=t=>{g.value=!0,B.value=t.id,s.value={name:t.name,host:t.host,port:t.port,username:t.username,authType:t.authType,password:"",keyFilePath:t.keyFilePath||"",passphrase:"",active:t.active},b.value=!0},O=async()=>{if(!s.value.name||!s.value.host||!s.value.username){alert("필수 항목을 입력해주세요.");return}D.value=!0;try{g.value?await P.update(B.value,s.value):await P.create(s.value),b.value=!1,await M()}catch(t){console.error("Failed to save server:",t),alert("저장에 실패했습니다.")}finally{D.value=!1}},J=t=>{N.value=t,S.value=!0},Q=async()=>{L.value=!0;try{await P.delete(N.value.id),S.value=!1,await M()}catch(t){console.error("Failed to delete server:",t),alert("삭제에 실패했습니다.")}finally{L.value=!1}},X=t=>{F.value=t.id,r.value[t.id]={status:"RUNNING",currentPath:"",currentFile:"",totalFiles:0,scannedFiles:0,errorsFound:0},me.startWithProgress(t.id,e=>{r.value[t.id]=e},e=>{F.value=null,e.success?r.value[t.id]={...r.value[t.id],status:"SUCCESS",message:`완료: ${e.filesScanned}개 파일, ${e.errorsFound}개 에러`}:r.value[t.id]={...r.value[t.id],status:"FAILED",message:e.error},M(),setTimeout(()=>{delete r.value[t.id]},5e3)},e=>{F.value=null,r.value[t.id]={...r.value[t.id],status:"FAILED",message:e}})},Z=t=>t.status==="SUCCESS"?t.message||"완료":t.status==="FAILED"?t.message||"실패":t.currentFile?`분석중: ${t.currentFile}`:t.currentPath?`경로: ${t.currentPath}`:"준비중...",ee=t=>t.totalFiles===0?0:Math.round(t.scannedFiles/t.totalFiles*100),le=async t=>{T.value=t.id;try{k.value=await P.testConnection(t.id),C.value=!0}catch(e){console.error("Failed to test connection:",e),k.value={success:!1,error:"연결 테스트 실패: "+e.message},C.value=!0}finally{T.value=null}},ae=async t=>{_.value=t,c.value={path:"",filePattern:"",description:""};try{V.value=await U.getByServerId(t.id)}catch(e){console.error("Failed to load log paths:",e),V.value=[]}I.value=!0},te=async()=>{try{await U.create({serverId:_.value.id,path:c.value.path,filePattern:c.value.filePattern,description:c.value.description,active:!0}),V.value=await U.getByServerId(_.value.id),c.value={path:"",filePattern:"",description:""}}catch(t){console.error("Failed to add log path:",t),alert("경로 추가에 실패했습니다.")}},se=async t=>{if(confirm("이 경로를 삭제하시겠습니까?"))try{await U.delete(t),V.value=await U.getByServerId(_.value.id)}catch(e){console.error("Failed to delete log path:",e),alert("경로 삭제에 실패했습니다.")}},oe=t=>new Date(t).toLocaleString("ko-KR");return ie(()=>{M()}),(t,e)=>{var W;return v(),m("div",fe,[a("div",he,[e[21]||(e[21]=a("h2",null,"서버 관리",-1)),n(o(h),{onClick:q},{default:i(()=>[...e[20]||(e[20]=[p("+ 서버 추가",-1)])]),_:1})]),x.value?(v(),m("div",ye,[...e[22]||(e[22]=[a("p",null,"로딩중...",-1)])])):$.value.length===0?(v(),m("div",ge,[e[24]||(e[24]=a("p",null,"등록된 서버가 없습니다.",-1)),n(o(h),{onClick:q},{default:i(()=>[...e[23]||(e[23]=[p("첫 서버 추가하기",-1)])]),_:1})])):(v(),m("div",Ve,[(v(!0),m(Y,null,G($.value,l=>(v(),A(o(ce),{key:l.id,class:"server-card"},{header:i(()=>[a("div",ke,[a("div",be,[n(o(R),{variant:l.active?"success":"default",size:"sm"},{default:i(()=>[p(u(l.active?"활성":"비활성"),1)]),_:2},1032,["variant"]),a("h4",null,u(l.name),1)])])]),default:i(()=>[a("div",_e,[a("div",Se,[a("div",Fe,[e[26]||(e[26]=a("span",{class:"info-icon"},"🌐",-1)),a("div",Ce,[e[25]||(e[25]=a("span",{class:"info-label"},"호스트",-1)),a("span",we,u(l.host)+":"+u(l.port),1)])]),a("div",Pe,[e[28]||(e[28]=a("span",{class:"info-icon"},"👤",-1)),a("div",Ue,[e[27]||(e[27]=a("span",{class:"info-label"},"사용자",-1)),a("span",Ie,u(l.username),1)])]),a("div",Te,[e[30]||(e[30]=a("span",{class:"info-icon"},"🔑",-1)),a("div",Me,[e[29]||(e[29]=a("span",{class:"info-label"},"인증방식",-1)),a("span",Ae,u(l.authType==="PASSWORD"?"비밀번호":"키 파일"),1)])]),a("div",Ee,[e[32]||(e[32]=a("span",{class:"info-icon"},"📅",-1)),a("div",$e,[e[31]||(e[31]=a("span",{class:"info-label"},"마지막 분석",-1)),a("span",xe,u(l.lastScanAt?oe(l.lastScanAt):"-"),1)])])])]),r.value[l.id]?(v(),m("div",De,[a("div",Le,[a("span",Be,u(Z(r.value[l.id])),1),n(o(R),{variant:r.value[l.id].status==="RUNNING"?"warn":r.value[l.id].status==="SUCCESS"?"success":"error"},{default:i(()=>[p(u(r.value[l.id].status),1)]),_:2},1032,["variant"])]),a("div",Ne,[a("div",{class:"progress-bar",style:ue({width:ee(r.value[l.id])+"%"})},null,4)]),a("div",Re,[a("span",null,"파일: "+u(r.value[l.id].scannedFiles)+" / "+u(r.value[l.id].totalFiles),1),a("span",null,"에러: "+u(r.value[l.id].errorsFound)+"건",1)])])):w("",!0),a("div",qe,[a("button",{class:"action-btn scan",onClick:y=>X(l),disabled:!l.active||F.value===l.id},u(F.value===l.id?"⏳ 분석중...":"▶️ 분석 실행"),9,Oe),a("button",{class:"action-btn test",onClick:y=>le(l),disabled:T.value===l.id},u(T.value===l.id?"⏳":"🔌"),9,We),a("button",{class:"action-btn path",onClick:y=>ae(l)}," 📁 ",8,ze),a("button",{class:"action-btn edit",onClick:y=>H(l)}," ✏️ ",8,Ke),a("button",{class:"action-btn delete",onClick:y=>J(l)}," 🗑️ ",8,Ye)])]),_:2},1024))),128))])),n(o(E),{modelValue:b.value,"onUpdate:modelValue":e[10]||(e[10]=l=>b.value=l),title:g.value?"서버 수정":"서버 추가",width:"500px"},{footer:i(()=>[n(o(h),{variant:"secondary",onClick:e[9]||(e[9]=l=>b.value=!1)},{default:i(()=>[...e[34]||(e[34]=[p("취소",-1)])]),_:1}),n(o(h),{onClick:O,loading:D.value},{default:i(()=>[...e[35]||(e[35]=[p("저장",-1)])]),_:1},8,["loading"])]),default:i(()=>[a("form",{onSubmit:de(O,["prevent"])},[n(o(f),{modelValue:s.value.name,"onUpdate:modelValue":e[0]||(e[0]=l=>s.value.name=l),label:"서버명",placeholder:"예: 운영서버1",required:""},null,8,["modelValue"]),n(o(f),{modelValue:s.value.host,"onUpdate:modelValue":e[1]||(e[1]=l=>s.value.host=l),label:"호스트",placeholder:"예: 192.168.1.100",required:""},null,8,["modelValue"]),n(o(f),{modelValue:s.value.port,"onUpdate:modelValue":e[2]||(e[2]=l=>s.value.port=l),label:"포트",type:"number",placeholder:"22"},null,8,["modelValue"]),n(o(f),{modelValue:s.value.username,"onUpdate:modelValue":e[3]||(e[3]=l=>s.value.username=l),label:"사용자명",placeholder:"예: root",required:""},null,8,["modelValue"]),n(o(f),{modelValue:s.value.authType,"onUpdate:modelValue":e[4]||(e[4]=l=>s.value.authType=l),label:"인증 방식",type:"select",options:j,required:""},null,8,["modelValue"]),s.value.authType==="PASSWORD"?(v(),A(o(f),{key:0,modelValue:s.value.password,"onUpdate:modelValue":e[5]||(e[5]=l=>s.value.password=l),label:"비밀번호",type:"password",placeholder:g.value?"변경 시에만 입력":"비밀번호 입력",required:!g.value},null,8,["modelValue","placeholder","required"])):w("",!0),s.value.authType==="KEY_FILE"?(v(),A(o(f),{key:1,modelValue:s.value.keyFilePath,"onUpdate:modelValue":e[6]||(e[6]=l=>s.value.keyFilePath=l),label:"키 파일 경로",placeholder:"예: C:\\Users\\user\\.ssh\\id_rsa",required:""},null,8,["modelValue"])):w("",!0),s.value.authType==="KEY_FILE"?(v(),A(o(f),{key:2,modelValue:s.value.passphrase,"onUpdate:modelValue":e[7]||(e[7]=l=>s.value.passphrase=l),label:"Passphrase",type:"password",placeholder:g.value?"변경 시에만 입력":"Passphrase (없으면 비워두세요)"},null,8,["modelValue","placeholder"])):w("",!0),a("div",Ge,[a("label",null,[re(a("input",{type:"checkbox","onUpdate:modelValue":e[8]||(e[8]=l=>s.value.active=l)},null,512),[[ve,s.value.active]]),e[33]||(e[33]=p(" 활성화 ",-1))])])],32)]),_:1},8,["modelValue","title"]),n(o(E),{modelValue:I.value,"onUpdate:modelValue":e[15]||(e[15]=l=>I.value=l),title:`로그 경로 관리 - ${((W=_.value)==null?void 0:W.name)||""}`,width:"750px"},{footer:i(()=>[n(o(h),{variant:"secondary",onClick:e[14]||(e[14]=l=>I.value=!1)},{default:i(()=>[...e[38]||(e[38]=[p("닫기",-1)])]),_:1})]),default:i(()=>[a("div",je,[a("div",He,[e[37]||(e[37]=a("h4",null,"➕ 경로 추가",-1)),a("div",Je,[n(o(f),{modelValue:c.value.path,"onUpdate:modelValue":e[11]||(e[11]=l=>c.value.path=l),label:"경로",placeholder:"예: /var/log/tomcat/"},null,8,["modelValue"]),n(o(f),{modelValue:c.value.filePattern,"onUpdate:modelValue":e[12]||(e[12]=l=>c.value.filePattern=l),label:"파일 패턴",placeholder:"예: *.log"},null,8,["modelValue"]),n(o(f),{modelValue:c.value.description,"onUpdate:modelValue":e[13]||(e[13]=l=>c.value.description=l),label:"설명",placeholder:"예: Tomcat 로그"},null,8,["modelValue"])]),n(o(h),{size:"sm",onClick:te,disabled:!c.value.path||!c.value.filePattern},{default:i(()=>[...e[36]||(e[36]=[p(" 경로 추가 ",-1)])]),_:1},8,["disabled"])]),a("div",Qe,[a("h4",null,"📂 등록된 경로 ("+u(V.value.length)+"개)",1),V.value.length===0?(v(),m("div",Xe," 등록된 경로가 없습니다. ")):(v(),m("div",Ze,[(v(!0),m(Y,null,G(V.value,l=>(v(),m("div",{key:l.id,class:"path-card"},[a("div",el,[a("div",ll,[a("code",al,u(l.path),1),a("span",tl,u(l.filePattern),1)]),a("div",sl,[l.description?(v(),m("span",ol,u(l.description),1)):w("",!0),n(o(R),{variant:l.active?"success":"default",size:"sm"},{default:i(()=>[p(u(l.active?"활성":"비활성"),1)]),_:2},1032,["variant"])])]),a("button",{class:"path-delete",onClick:y=>se(l.id),title:"삭제"}," 🗑️ ",8,nl)]))),128))]))])])]),_:1},8,["modelValue","title"]),n(o(E),{modelValue:S.value,"onUpdate:modelValue":e[17]||(e[17]=l=>S.value=l),title:"서버 삭제",width:"400px"},{footer:i(()=>[n(o(h),{variant:"secondary",onClick:e[16]||(e[16]=l=>S.value=!1)},{default:i(()=>[...e[41]||(e[41]=[p("취소",-1)])]),_:1}),n(o(h),{variant:"danger",onClick:Q,loading:L.value},{default:i(()=>[...e[42]||(e[42]=[p("삭제",-1)])]),_:1},8,["loading"])]),default:i(()=>{var l;return[a("p",null,[e[39]||(e[39]=p("정말로 ",-1)),a("strong",null,u((l=N.value)==null?void 0:l.name),1),e[40]||(e[40]=p(" 서버를 삭제하시겠습니까?",-1))]),e[43]||(e[43]=a("p",{class:"warning-text"},"⚠️ 관련된 모든 로그 경로와 에러 이력도 함께 삭제됩니다.",-1))]}),_:1},8,["modelValue"]),n(o(E),{modelValue:C.value,"onUpdate:modelValue":e[19]||(e[19]=l=>C.value=l),title:"연결 테스트 결과",width:"450px"},{footer:i(()=>[n(o(h),{variant:"secondary",onClick:e[18]||(e[18]=l=>C.value=!1)},{default:i(()=>[...e[44]||(e[44]=[p("닫기",-1)])]),_:1})]),default:i(()=>{var l,y,z,K;return[a("div",{class:pe(["test-result",{success:(l=k.value)==null?void 0:l.success,fail:!((y=k.value)!=null&&y.success)}])},[(z=k.value)!=null&&z.success?(v(),m("div",il,[a("p",null,"✅ "+u(k.value.message),1)])):(v(),m("div",ul,[a("p",null,"❌ "+u((K=k.value)==null?void 0:K.error),1)]))],2)]}),_:1},8,["modelValue"])])}}},yl=ne(dl,[["__scopeId","data-v-18b9f6a3"]]);export{yl as default};