// ============================================================
// counseling_admin.jsx  —  상담 플랫폼 어드민 대시보드
// 3단계: 센터 관리 · 상담사 관리 · 예약 관리 · 정산 · 온보딩
// ============================================================

const aApi = {
  _h() { const s=localStorage.getItem('admin_secret'); return s?{'Authorization':'Bearer '+s,'Content-Type':'application/json'}:{'Content-Type':'application/json'}; },
  async stats()       { return (await fetch('/api/admin/counseling/stats',{headers:this._h()})).json(); },
  async centers()     { return (await fetch('/api/admin/counseling/centers',{headers:this._h()})).json(); },
  async centerStatus(id,status,reason) { return (await fetch(`/api/admin/counseling/centers/${id}/status`,{method:'PATCH',headers:this._h(),body:JSON.stringify({status,rejected_reason:reason})})).json(); },
  async counselors()  { return (await fetch('/api/admin/counseling/counselors',{headers:this._h()})).json(); },
  async patchCounselor(id,body) { return (await fetch(`/api/admin/counseling/counselors/${id}`,{method:'PATCH',headers:this._h(),body:JSON.stringify(body)})).json(); },
  async appointments(status,page=1) { return (await fetch(`/api/admin/counseling/appointments?status=${status}&page=${page}`,{headers:this._h()})).json(); },
  async completeAppt(id) { return (await fetch(`/api/admin/counseling/appointments/${id}/complete`,{method:'PATCH',headers:this._h()})).json(); },
  async settlements() { return (await fetch('/api/admin/counseling/settlements',{headers:this._h()})).json(); },
  async createSettlement(b) { return (await fetch('/api/admin/counseling/settlements',{method:'POST',headers:this._h(),body:JSON.stringify(b)})).json(); },
  async processSettlement(id,note) { return (await fetch(`/api/admin/counseling/settlements/${id}/process`,{method:'PATCH',headers:this._h(),body:JSON.stringify({note})})).json(); },
  async onboarding()  { return (await fetch('/api/admin/counseling/onboarding',{headers:this._h()})).json(); },
  async reviewOnboarding(id,status,note) { return (await fetch(`/api/admin/counseling/onboarding/${id}`,{method:'PATCH',headers:this._h(),body:JSON.stringify({status,admin_note:note})})).json(); },
  async globalStats() { return (await fetch('/api/admin/stats',{headers:this._h()})).json(); },
};

const fmtW  = n => Number(n||0).toLocaleString('ko-KR')+'원';
const fmtDt = iso => { if(!iso)return'-'; const d=new Date(iso); return d.toLocaleString('ko-KR',{month:'short',day:'numeric',hour:'2-digit',minute:'2-digit'}); };
const fmtDate = iso => { if(!iso)return'-'; return new Date(iso).toLocaleDateString('ko-KR',{year:'numeric',month:'long',day:'numeric'}); };

function Chip({label,color='gray'}){
  const C={green:{bg:'#D8F3DC',text:'#1A6B3C'},amber:{bg:'#FEF3C7',text:'#B45309'},red:{bg:'#FEF2F2',text:'#991B1B'},blue:{bg:'#EEF0FF',text:'#5B21B6'},gray:{bg:'#F5F5F0',text:'#5A5A5A'}};
  const s=C[color]||C.gray;
  return React.createElement('span',{style:{fontSize:11,fontWeight:700,padding:'3px 9px',borderRadius:100,background:s.bg,color:s.text}},label);
}

function StatCard({icon,label,value,sub,color='#2D6A4F'}){
  return(
    <div style={{background:'white',border:'1px solid rgba(0,0,0,.08)',borderRadius:12,padding:'18px 20px'}}>
      <div style={{display:'flex',alignItems:'center',gap:8,marginBottom:10}}>
        <div style={{width:34,height:34,borderRadius:9,background:color+'1A',display:'flex',alignItems:'center',justifyContent:'center',fontSize:16}}>{icon}</div>
        <span style={{fontSize:12,color:'#9A9A9A',fontWeight:500}}>{label}</span>
      </div>
      <div style={{fontSize:26,fontWeight:700,color:'#1A1A1A',lineHeight:1}}>{value}</div>
      {sub&&<div style={{fontSize:11,color:'#9A9A9A',marginTop:4}}>{sub}</div>}
    </div>
  );
}

function Table({cols,rows,renderRow}){
  return(
    <div style={{overflowX:'auto'}}>
      <table style={{width:'100%',borderCollapse:'collapse',fontSize:13}}>
        <thead>
          <tr style={{borderBottom:'1.5px solid rgba(0,0,0,.08)'}}>
            {cols.map(c=><th key={c} style={{padding:'10px 12px',textAlign:'left',fontWeight:600,fontSize:12,color:'#9A9A9A',whiteSpace:'nowrap'}}>{c}</th>)}
          </tr>
        </thead>
        <tbody>
          {rows.length===0?<tr><td colSpan={cols.length} style={{padding:'32px 0',textAlign:'center',color:'#9A9A9A'}}>데이터 없음</td></tr>:rows.map((r,i)=>renderRow(r,i))}
        </tbody>
      </table>
    </div>
  );
}

// ── 탭: 대시보드 ────────────────────────────────────────────
function AdminOverview(){
  const {useState:useS,useEffect:useE}=React;
  const [stats,setStats]=useS(null);
  const [gStats,setGStats]=useS(null);
  const [loading,setLoading]=useS(true);

  useE(()=>{
    Promise.all([aApi.stats(),aApi.globalStats()])
      .then(([s,g])=>{if(s.success)setStats(s.data);if(g.success)setGStats(g.data);})
      .finally(()=>setLoading(false));
  },[]);

  if(loading)return<div style={{textAlign:'center',padding:'40px',color:'#9A9A9A'}}>로딩 중...</div>;
  if(!stats)return<div style={{textAlign:'center',padding:'40px',color:'#E24B4A'}}>데이터 조회 실패</div>;

  const s=stats;
  return(
    <div>
      <div style={{fontSize:15,fontWeight:700,marginBottom:16,color:'#5A5A5A'}}>상담 플랫폼 현황</div>
      <div style={{display:'grid',gridTemplateColumns:'repeat(4,1fr)',gap:12,marginBottom:28}}>
        <StatCard icon="🏥" label="등록 센터" value={`${s.centers?.total||0}개`} sub={`활성 ${s.centers?.active||0} · 심사중 ${s.centers?.pending||0}`} color="#2D6A4F"/>
        <StatCard icon="👥" label="활성 상담사" value={`${s.counselors?.active||0}명`} sub={`전체 ${s.counselors?.total||0}명`} color="#7C3AED"/>
        <StatCard icon="📅" label="이번 달 매출" value={fmtW(s.revenue?.month_revenue)} sub={`누적 ${fmtW(s.revenue?.total_revenue)}`} color="#F59E0B"/>
        <StatCard icon="⭐" label="평균 평점" value={`${parseFloat(s.reviews?.avg_rating||0).toFixed(1)}점`} sub={`리뷰 ${s.reviews?.total||0}건`} color="#EF4444"/>
      </div>
      <div style={{display:'grid',gridTemplateColumns:'repeat(4,1fr)',gap:12,marginBottom:28}}>
        <StatCard icon="✅" label="확정 예약" value={`${s.appointments?.confirmed||0}건`} color="#3B82F6"/>
        <StatCard icon="🎉" label="완료 상담" value={`${s.appointments?.completed||0}건`} color="#10B981"/>
        <StatCard icon="📋" label="오늘 신규 예약" value={`${s.appointments?.today||0}건`} color="#F97316"/>
        <StatCard icon="📨" label="온보딩 신청" value={`${s.onboarding?.pending||0}건`} sub="검토 대기" color="#EC4899"/>
      </div>
      {gStats&&(
        <>
          <div style={{fontSize:15,fontWeight:700,marginBottom:12,color:'#5A5A5A'}}>심리검사 플랫폼 현황</div>
          <div style={{display:'grid',gridTemplateColumns:'repeat(4,1fr)',gap:12}}>
            <StatCard icon="👤" label="전체 회원" value={`${gStats.users?.total||0}명`} sub={`오늘 신규 ${gStats.users?.new_today||0}명`}/>
            <StatCard icon="🧠" label="검사 수행" value={`${gStats.tests?.total||0}회`} sub={`오늘 ${gStats.tests?.today||0}회`}/>
            <StatCard icon="💬" label="AI 채팅" value={`${gStats.chats?.total||0}회`} sub={`오늘 ${gStats.chats?.today||0}회`}/>
            <StatCard icon="💳" label="이번달 결제" value={fmtW(gStats.charges?.revenue)} sub={`${gStats.charges?.cnt||0}건`}/>
          </div>
        </>
      )}
    </div>
  );
}

// ── 탭: 온보딩 신청 관리 ────────────────────────────────────
function AdminOnboarding(){
  const {useState:useS,useEffect:useE}=React;
  const [list,setList]=useS([]);
  const [loading,setLoading]=useS(true);
  const [processing,setProcessing]=useS(null);
  const [note,setNote]=useS('');

  const load=()=>{setLoading(true);aApi.onboarding().then(r=>{if(r.success)setList(r.data);}).finally(()=>setLoading(false));};
  useE(()=>load(),[]);

  const handle=async(id,status)=>{
    const reason=status==='rejected'?prompt('반려 사유를 입력하세요:'):'';
    if(status==='rejected'&&!reason)return;
    setProcessing(id);
    const r=await aApi.reviewOnboarding(id,status,reason||note);
    setProcessing(null);
    if(r.success){alert(status==='approved'?'승인되었습니다! 센터가 자동 생성되었습니다.':'처리되었습니다.');load();}
    else alert(r.error||'오류');
  };

  const statusColor={pending:'amber',reviewing:'blue',approved:'green',rejected:'red'};
  const statusLabel={pending:'검토 대기',reviewing:'검토 중',approved:'승인됨',rejected:'반려됨'};

  return(
    <div>
      <div style={{display:'flex',justifyContent:'space-between',alignItems:'center',marginBottom:16}}>
        <div style={{fontSize:15,fontWeight:700}}>센터 온보딩 신청 ({list.length}건)</div>
        <button onClick={load} style={{background:'none',border:'1px solid rgba(0,0,0,.12)',borderRadius:7,padding:'6px 14px',fontSize:12,cursor:'pointer',fontFamily:"'Noto Sans KR',sans-serif"}}>새로고침</button>
      </div>
      {loading?<div style={{textAlign:'center',padding:'32px',color:'#9A9A9A'}}>로딩 중...</div>:(
        <div style={{display:'flex',flexDirection:'column',gap:12}}>
          {list.length===0&&<div style={{textAlign:'center',padding:'40px',color:'#9A9A9A'}}>신청 내역이 없습니다</div>}
          {list.map(req=>(
            <div key={req.id} style={{background:'white',border:'1px solid rgba(0,0,0,.08)',borderRadius:12,padding:'18px 20px'}}>
              <div style={{display:'flex',alignItems:'flex-start',justifyContent:'space-between',gap:12,flexWrap:'wrap',marginBottom:12}}>
                <div>
                  <div style={{display:'flex',alignItems:'center',gap:8,marginBottom:4}}>
                    <span style={{fontSize:15,fontWeight:700}}>{req.center_name}</span>
                    <Chip label={statusLabel[req.status]||req.status} color={statusColor[req.status]||'gray'}/>
                  </div>
                  <div style={{fontSize:12,color:'#9A9A9A'}}>신청일: {fmtDt(req.created_at)}</div>
                </div>
                {req.status==='pending'&&(
                  <div style={{display:'flex',gap:7}}>
                    <button onClick={()=>handle(req.id,'reviewing')} disabled={processing===req.id} style={{padding:'7px 14px',borderRadius:7,border:'1px solid rgba(0,0,0,.12)',background:'white',fontSize:12,fontWeight:600,cursor:'pointer',fontFamily:"'Noto Sans KR',sans-serif"}}>검토 시작</button>
                    <button onClick={()=>handle(req.id,'approved')} disabled={processing===req.id} style={{padding:'7px 14px',borderRadius:7,border:'none',background:'#2D6A4F',color:'white',fontSize:12,fontWeight:700,cursor:'pointer',fontFamily:"'Noto Sans KR',sans-serif"}}>✓ 승인</button>
                    <button onClick={()=>handle(req.id,'rejected')} disabled={processing===req.id} style={{padding:'7px 14px',borderRadius:7,border:'none',background:'#E24B4A',color:'white',fontSize:12,fontWeight:700,cursor:'pointer',fontFamily:"'Noto Sans KR',sans-serif"}}>✕ 반려</button>
                  </div>
                )}
                {req.status==='reviewing'&&(
                  <div style={{display:'flex',gap:7}}>
                    <button onClick={()=>handle(req.id,'approved')} disabled={processing===req.id} style={{padding:'7px 14px',borderRadius:7,border:'none',background:'#2D6A4F',color:'white',fontSize:12,fontWeight:700,cursor:'pointer',fontFamily:"'Noto Sans KR',sans-serif"}}>✓ 승인</button>
                    <button onClick={()=>handle(req.id,'rejected')} disabled={processing===req.id} style={{padding:'7px 14px',borderRadius:7,border:'none',background:'#E24B4A',color:'white',fontSize:12,fontWeight:700,cursor:'pointer',fontFamily:"'Noto Sans KR',sans-serif"}}>✕ 반려</button>
                  </div>
                )}
              </div>
              <div style={{display:'grid',gridTemplateColumns:'1fr 1fr',gap:'6px 20px',fontSize:13}}>
                {[['담당자',req.contact_name],['이메일',req.contact_email],['전화',req.contact_phone||'-'],['주소',req.address||'-'],['상담사 수',`${req.counselor_count||1}명`],['사업자번호',req.business_reg_num||'-']].map(([l,v])=>(
                  <div key={l} style={{display:'flex',gap:8}}><span style={{color:'#9A9A9A',minWidth:60}}>{l}</span><span style={{fontWeight:500}}>{v}</span></div>
                ))}
              </div>
              {req.description&&<div style={{marginTop:10,padding:'10px 12px',background:'#F9F9F7',borderRadius:8,fontSize:13,color:'#5A5A5A',lineHeight:1.6}}>{req.description}</div>}
              {req.admin_note&&<div style={{marginTop:8,padding:'8px 12px',background:'#FEF3C7',borderRadius:8,fontSize:12,color:'#B45309'}}>어드민 메모: {req.admin_note}</div>}
            </div>
          ))}
        </div>
      )}
    </div>
  );
}

// ── 탭: 센터 관리 ────────────────────────────────────────────
function AdminCenters(){
  const {useState:useS,useEffect:useE}=React;
  const [list,setList]=useS([]);
  const [loading,setLoading]=useS(true);
  const [processing,setProcessing]=useS(null);

  const load=()=>{setLoading(true);aApi.centers().then(r=>{if(r.success)setList(r.data);}).finally(()=>setLoading(false));};
  useE(()=>load(),[]);

  const changeStatus=async(id,status)=>{
    const reason=status==='suspended'?prompt('정지 사유:'):'';
    setProcessing(id);
    const r=await aApi.centerStatus(id,status,reason);
    setProcessing(null);
    if(r.success)load(); else alert(r.error||'오류');
  };

  const statusColor={active:'green',pending:'amber',suspended:'red'};
  const statusLabel={active:'활성',pending:'심사중',suspended:'정지'};

  return(
    <div>
      <div style={{display:'flex',justifyContent:'space-between',marginBottom:16}}>
        <div style={{fontSize:15,fontWeight:700}}>상담센터 ({list.length}곳)</div>
        <button onClick={load} style={{background:'none',border:'1px solid rgba(0,0,0,.12)',borderRadius:7,padding:'6px 14px',fontSize:12,cursor:'pointer',fontFamily:"'Noto Sans KR',sans-serif"}}>새로고침</button>
      </div>
      {loading?<div style={{textAlign:'center',padding:'32px',color:'#9A9A9A'}}>로딩 중...</div>:(
        <Table
          cols={['센터명','상태','상담사','예약','수수료','등록일','액션']}
          rows={list}
          renderRow={(c,i)=>(
            <tr key={c.id} style={{borderBottom:'1px solid rgba(0,0,0,.05)',background:i%2===0?'white':'#FAFAF8'}}>
              <td style={{padding:'10px 12px'}}>
                <div style={{fontWeight:600}}>{c.logo_emoji} {c.name}</div>
                <div style={{fontSize:11,color:'#9A9A9A'}}>{c.address}</div>
              </td>
              <td style={{padding:'10px 12px'}}><Chip label={statusLabel[c.status]||c.status} color={statusColor[c.status]||'gray'}/></td>
              <td style={{padding:'10px 12px',textAlign:'center'}}>{c.counselor_count||0}명</td>
              <td style={{padding:'10px 12px',textAlign:'center'}}>{c.appt_count||0}건</td>
              <td style={{padding:'10px 12px',textAlign:'center'}}>{c.commission_rate||10}%</td>
              <td style={{padding:'10px 12px',fontSize:12,color:'#9A9A9A'}}>{fmtDate(c.created_at)}</td>
              <td style={{padding:'10px 12px'}}>
                <div style={{display:'flex',gap:5}}>
                  {c.status!=='active'&&<button onClick={()=>changeStatus(c.id,'active')} disabled={processing===c.id} style={{padding:'5px 10px',borderRadius:6,border:'none',background:'#D8F3DC',color:'#2D6A4F',fontSize:11,fontWeight:700,cursor:'pointer',fontFamily:"'Noto Sans KR',sans-serif"}}>활성화</button>}
                  {c.status==='active'&&<button onClick={()=>changeStatus(c.id,'suspended')} disabled={processing===c.id} style={{padding:'5px 10px',borderRadius:6,border:'none',background:'#FEF2F2',color:'#991B1B',fontSize:11,fontWeight:700,cursor:'pointer',fontFamily:"'Noto Sans KR',sans-serif"}}>정지</button>}
                  {c.status==='suspended'&&<button onClick={()=>changeStatus(c.id,'pending')} disabled={processing===c.id} style={{padding:'5px 10px',borderRadius:6,border:'1px solid rgba(0,0,0,.12)',background:'white',fontSize:11,cursor:'pointer',fontFamily:"'Noto Sans KR',sans-serif"}}>재심사</button>}
                </div>
              </td>
            </tr>
          )}
        />
      )}
    </div>
  );
}

// ── 탭: 상담사 관리 ─────────────────────────────────────────
function AdminCounselors(){
  const {useState:useS,useEffect:useE}=React;
  const [list,setList]=useS([]);
  const [loading,setLoading]=useS(true);
  const [editing,setEditing]=useS(null);
  const [editFee,setEditFee]=useS('');

  const load=()=>{setLoading(true);aApi.counselors().then(r=>{if(r.success)setList(r.data);}).finally(()=>setLoading(false));};
  useE(()=>load(),[]);

  const toggleStatus=async(c)=>{
    const newStatus=c.status==='active'?'inactive':'active';
    const r=await aApi.patchCounselor(c.id,{status:newStatus});
    if(r.success)load(); else alert(r.error||'오류');
  };

  const saveFee=async(c)=>{
    const fee=parseInt(editFee);
    if(isNaN(fee)||fee<10000){alert('요금은 10,000원 이상');return;}
    const r=await aApi.patchCounselor(c.id,{fee_per_session:fee});
    if(r.success){setEditing(null);load();}else alert(r.error||'오류');
  };

  return(
    <div>
      <div style={{display:'flex',justifyContent:'space-between',marginBottom:16}}>
        <div style={{fontSize:15,fontWeight:700}}>상담사 ({list.length}명)</div>
        <button onClick={load} style={{background:'none',border:'1px solid rgba(0,0,0,.12)',borderRadius:7,padding:'6px 14px',fontSize:12,cursor:'pointer',fontFamily:"'Noto Sans KR',sans-serif"}}>새로고침</button>
      </div>
      {loading?<div style={{textAlign:'center',padding:'32px',color:'#9A9A9A'}}>로딩 중...</div>:(
        <Table
          cols={['상담사','센터','요금/시간','누적 상담','총 수입','상태','액션']}
          rows={list}
          renderRow={(co,i)=>(
            <tr key={co.id} style={{borderBottom:'1px solid rgba(0,0,0,.05)',background:i%2===0?'white':'#FAFAF8'}}>
              <td style={{padding:'10px 12px'}}>
                <div style={{fontWeight:600}}>{co.photo_emoji} {co.name}</div>
                <div style={{fontSize:11,color:'#9A9A9A'}}>{co.title}</div>
                <div style={{display:'flex',alignItems:'center',gap:4,marginTop:2}}><span style={{fontSize:11,color:'#F59E0B'}}>★</span><span style={{fontSize:11,fontWeight:600}}>{parseFloat(co.avg_rating||0).toFixed(1)}</span><span style={{fontSize:10,color:'#9A9A9A'}}>({co.review_count||0})</span></div>
              </td>
              <td style={{padding:'10px 12px',fontSize:12}}><div>{co.center_name}</div><Chip label={co.center_status==='active'?'활성':'비활성'} color={co.center_status==='active'?'green':'gray'}/></td>
              <td style={{padding:'10px 12px'}}>
                {editing===co.id?(
                  <div style={{display:'flex',gap:4,alignItems:'center'}}>
                    <input value={editFee} onChange={e=>setEditFee(e.target.value)} style={{width:90,padding:'4px 7px',border:'1px solid rgba(0,0,0,.15)',borderRadius:5,fontSize:12,fontFamily:"'Noto Sans KR',sans-serif"}} placeholder="요금"/>
                    <button onClick={()=>saveFee(co)} style={{padding:'4px 8px',background:'#2D6A4F',color:'white',border:'none',borderRadius:5,fontSize:11,cursor:'pointer',fontFamily:"'Noto Sans KR',sans-serif"}}>저장</button>
                    <button onClick={()=>setEditing(null)} style={{padding:'4px 6px',background:'none',border:'1px solid rgba(0,0,0,.12)',borderRadius:5,fontSize:11,cursor:'pointer'}}>취소</button>
                  </div>
                ):(
                  <div>
                    <div style={{fontWeight:600}}>{(co.fee_per_session||0).toLocaleString('ko-KR')}원</div>
                    <div style={{fontSize:11,color:'#9A9A9A'}}>{co.session_minutes}분</div>
                    <button onClick={()=>{setEditing(co.id);setEditFee(String(co.fee_per_session));}} style={{fontSize:10,background:'none',border:'none',color:'#9A9A9A',cursor:'pointer',padding:0,marginTop:2,textDecoration:'underline'}}>수정</button>
                  </div>
                )}
              </td>
              <td style={{padding:'10px 12px',textAlign:'center'}}>{co.total_appts||0}건</td>
              <td style={{padding:'10px 12px',textAlign:'right',fontWeight:600,color:'#2D6A4F'}}>{fmtW(co.total_earned)}</td>
              <td style={{padding:'10px 12px'}}><Chip label={co.status==='active'?'활성':'비활성'} color={co.status==='active'?'green':'red'}/></td>
              <td style={{padding:'10px 12px'}}>
                <button onClick={()=>toggleStatus(co)} style={{padding:'5px 10px',borderRadius:6,border:'none',background:co.status==='active'?'#FEF2F2':'#D8F3DC',color:co.status==='active'?'#991B1B':'#2D6A4F',fontSize:11,fontWeight:700,cursor:'pointer',fontFamily:"'Noto Sans KR',sans-serif"}}>
                  {co.status==='active'?'비활성화':'활성화'}
                </button>
              </td>
            </tr>
          )}
        />
      )}
    </div>
  );
}

// ── 탭: 예약 관리 ────────────────────────────────────────────
function AdminAppointments(){
  const {useState:useS,useEffect:useE}=React;
  const [list,setList]=useS([]);
  const [loading,setLoading]=useS(true);
  const [filter,setFilter]=useS('');
  const [processing,setProcessing]=useS(null);
  const [noteModal,setNoteModal]=useS(null);
  const [noteSaving,setNoteSaving]=useS(false);

  const load=()=>{setLoading(true);aApi.appointments(filter).then(r=>{if(r.success)setList(r.data);}).finally(()=>setLoading(false));};
  useE(()=>load(),[filter]);

  const complete=async(id)=>{
    if(!confirm('이 예약을 완료 처리하시겠습니까? 수입이 기록됩니다.'))return;
    setProcessing(id);
    const r=await aApi.completeAppt(id);
    setProcessing(null);
    if(r.success){alert(`완료 처리되었습니다.\n지급액: ${fmtW(r.data.net_amount)}`);load();}else alert(r.error||'오류');
  };

  const saveNote=async()=>{
    if(!noteModal)return;
    setNoteSaving(true);
    try{
      const r=await fetch(`/api/admin/counseling/appointments/${noteModal.id}/note`,{
        method:'PATCH',headers:aApi._h(),body:JSON.stringify({counselor_note:noteModal.note})
      });
      const d=await r.json();
      if(d.success){setNoteModal(null);load();}else alert(d.error||'저장 실패');
    }catch{alert('네트워크 오류');}
    setNoteSaving(false);
  };

  const statusColor={pending:'amber',confirmed:'blue',completed:'green',cancelled:'red',no_show:'gray'};
  const statusLabel={pending:'결제대기',confirmed:'확정',completed:'완료',cancelled:'취소',no_show:'노쇼'};
  const typeIcon={video:'📹',phone:'📞',visit:'🏢'};

  const filters=[['','전체'],['confirmed','확정'],['completed','완료'],['pending','대기'],['cancelled','취소']];

  return(
    <div>
      <div style={{display:'flex',justifyContent:'space-between',alignItems:'center',marginBottom:14}}>
        <div style={{fontSize:15,fontWeight:700}}>예약 관리</div>
        <div style={{display:'flex',gap:5}}>
          {filters.map(([v,l])=>(
            <button key={v} onClick={()=>setFilter(v)} style={{padding:'6px 12px',borderRadius:7,border:'1px solid',borderColor:filter===v?'#2D6A4F':'rgba(0,0,0,.10)',background:filter===v?'#D8F3DC':'white',color:filter===v?'#2D6A4F':'#5A5A5A',fontSize:12,fontWeight:filter===v?700:400,cursor:'pointer',fontFamily:"'Noto Sans KR',sans-serif"}}>{l}</button>
          ))}
          <button onClick={load} style={{background:'none',border:'1px solid rgba(0,0,0,.12)',borderRadius:7,padding:'6px 12px',fontSize:12,cursor:'pointer',fontFamily:"'Noto Sans KR',sans-serif"}}>↻</button>
        </div>
      </div>
      {loading?<div style={{textAlign:'center',padding:'32px',color:'#9A9A9A'}}>로딩 중...</div>:(
        <Table
          cols={['예약ID','내담자','상담사','센터','일시','유형','금액','상태','액션']}
          rows={list}
          renderRow={(a,i)=>(
            <tr key={a.id} style={{borderBottom:'1px solid rgba(0,0,0,.05)',background:i%2===0?'white':'#FAFAF8'}}>
              <td style={{padding:'8px 10px',fontSize:11,color:'#9A9A9A'}}>#{a.id}</td>
              <td style={{padding:'8px 10px'}}>
                <div style={{fontSize:12,fontWeight:600}}>{a.user_nickname||a.user_email?.split('@')[0]}</div>
                <div style={{fontSize:10,color:'#9A9A9A'}}>{a.user_email}</div>
              </td>
              <td style={{padding:'8px 10px'}}><div style={{fontSize:12,fontWeight:600}}>{a.photo_emoji} {a.counselor_name}</div></td>
              <td style={{padding:'8px 10px',fontSize:11,color:'#5A5A5A'}}>{a.center_name}</td>
              <td style={{padding:'8px 10px',fontSize:11,whiteSpace:'nowrap'}}>{fmtDt(a.scheduled_at)}</td>
              <td style={{padding:'8px 10px',fontSize:12}}>{typeIcon[a.session_type]}</td>
              <td style={{padding:'8px 10px',fontWeight:600,fontSize:12,color:'#2D6A4F'}}>{fmtW(a.fee_amount)}</td>
              <td style={{padding:'8px 10px'}}><Chip label={statusLabel[a.status]||a.status} color={statusColor[a.status]||'gray'}/></td>
              <td style={{padding:'8px 10px'}}>
                <div style={{display:'flex',flexDirection:'column',gap:4,alignItems:'flex-end'}}>
                {a.status==='confirmed'&&(
                  <button onClick={()=>complete(a.id)} disabled={processing===a.id} style={{padding:'5px 9px',borderRadius:5,border:'none',background:'#EEF0FF',color:'#5B21B6',fontSize:11,fontWeight:700,cursor:'pointer',fontFamily:"'Noto Sans KR',sans-serif"}}>완료처리</button>
                )}
                {a.video_room_id&&a.status==='confirmed'&&(
                  <button onClick={()=>window.open(`https://meet.jit.si/${a.video_room_id}`,'_blank')} style={{padding:'5px 9px',borderRadius:5,border:'none',background:'#D8F3DC',color:'#2D6A4F',fontSize:11,fontWeight:700,cursor:'pointer',fontFamily:"'Noto Sans KR',sans-serif"}}>📹 화상 입장</button>
                )}
                {a.video_room_id&&<div style={{fontSize:10,color:'#9A9A9A'}}>룸: {a.video_room_id.slice(-8)}</div>}
                {a.status==='confirmed'&&(
                  <button onClick={()=>setNoteModal({id:a.id,note:a.counselor_note||''})}
                    style={{padding:'5px 9px',borderRadius:5,border:'1px solid rgba(0,0,0,.1)',background:'white',color:'#5A5A5A',fontSize:11,cursor:'pointer',fontFamily:"'Noto Sans KR',sans-serif"}}>
                    📝 {a.counselor_note?'노트 수정':'노트 추가'}
                  </button>
                )}
              </div>
              </td>
            </tr>
          )}
        />
      )}

      {noteModal&&(
        <div style={{position:'fixed',inset:0,background:'rgba(0,0,0,.55)',display:'flex',alignItems:'center',justifyContent:'center',zIndex:3000,padding:16}} onClick={e=>{if(e.target===e.currentTarget)setNoteModal(null);}}>
          <div style={{background:'white',borderRadius:16,padding:'24px',width:'100%',maxWidth:440,boxShadow:'0 16px 48px rgba(0,0,0,.18)'}}>
            <div style={{fontSize:15,fontWeight:700,marginBottom:14}}>📝 상담사 노트 · 예약 #{noteModal.id}</div>
            <textarea value={noteModal.note} onChange={e=>setNoteModal(p=>({...p,note:e.target.value}))}
              placeholder="상담 내용, 특이사항, 다음 회기 계획 등을 기록하세요." rows={5}
              style={{width:'100%',padding:'10px 12px',border:'1px solid rgba(0,0,0,.12)',borderRadius:10,fontSize:13,fontFamily:"'Noto Sans KR',sans-serif",outline:'none',resize:'none',lineHeight:1.65,marginBottom:14}}/>
            <div style={{display:'flex',gap:8}}>
              <button onClick={()=>setNoteModal(null)} style={{flex:1,padding:'10px',background:'rgba(0,0,0,.07)',color:'#5A5A5A',border:'none',borderRadius:9,fontSize:13,fontWeight:600,cursor:'pointer',fontFamily:"'Noto Sans KR',sans-serif"}}>취소</button>
              <button onClick={saveNote} disabled={noteSaving} style={{flex:2,padding:'10px',background:'#2D6A4F',color:'white',border:'none',borderRadius:9,fontSize:13,fontWeight:700,cursor:'pointer',fontFamily:"'Noto Sans KR',sans-serif"}}>{noteSaving?'저장 중...':'노트 저장'}</button>
            </div>
          </div>
        </div>
      )}
    </div>
  );
}

// ── 탭: 정산 관리 ────────────────────────────────────────────
function AdminSettlements(){
  const {useState:useS,useEffect:useE}=React;
  const [list,setList]=useS([]);
  const [centers,setCenters]=useS([]);
  const [loading,setLoading]=useS(true);
  const [creating,setCreating]=useS(false);
  const [form,setForm]=useS({center_id:'',period_start:'',period_end:''});
  const [processing,setProcessing]=useS(null);

  const load=()=>{
    setLoading(true);
    Promise.all([aApi.settlements(),aApi.centers()])
      .then(([s,c])=>{if(s.success)setList(s.data);if(c.success)setCenters(c.data.filter(cc=>cc.status==='active'));})
      .finally(()=>setLoading(false));
  };
  useE(()=>load(),[]);

  const create=async()=>{
    if(!form.center_id||!form.period_start||!form.period_end){alert('모든 항목 필요');return;}
    const r=await aApi.createSettlement(form);
    if(r.success){alert(`정산 생성 완료\n예약 ${r.data.appt_count}건 · 지급액 ${fmtW(r.data.payout_amt)}`);setCreating(false);setForm({center_id:'',period_start:'',period_end:''});load();}
    else alert(r.error||'오류');
  };

  const process=async(id)=>{
    const note=prompt('처리 메모 (선택):');
    setProcessing(id);
    const r=await aApi.processSettlement(id,note||'');
    setProcessing(null);
    if(r.success)load(); else alert(r.error||'오류');
  };

  const statusColor={pending:'amber',processing:'blue',completed:'green',failed:'red'};
  const statusLabel={pending:'정산 대기',processing:'처리 중',completed:'완료',failed:'실패'};

  return(
    <div>
      <div style={{display:'flex',justifyContent:'space-between',alignItems:'center',marginBottom:16}}>
        <div style={{fontSize:15,fontWeight:700}}>정산 관리</div>
        <button onClick={()=>setCreating(v=>!v)} style={{background:'#2D6A4F',color:'white',border:'none',borderRadius:8,padding:'8px 16px',fontSize:13,fontWeight:700,cursor:'pointer',fontFamily:"'Noto Sans KR',sans-serif"}}>+ 정산 생성</button>
      </div>

      {creating&&(
        <div style={{background:'white',border:'1px solid rgba(0,0,0,.08)',borderRadius:12,padding:'20px',marginBottom:20}}>
          <div style={{fontSize:14,fontWeight:700,marginBottom:14}}>새 정산 생성</div>
          <div style={{display:'grid',gridTemplateColumns:'1fr 1fr 1fr auto',gap:10,alignItems:'end'}}>
            <div>
              <div style={{fontSize:12,color:'#9A9A9A',marginBottom:5}}>센터 선택</div>
              <select value={form.center_id} onChange={e=>setForm(f=>({...f,center_id:e.target.value}))}
                style={{width:'100%',padding:'9px 10px',border:'1px solid rgba(0,0,0,.12)',borderRadius:7,fontSize:13,fontFamily:"'Noto Sans KR',sans-serif",outline:'none'}}>
                <option value="">선택</option>
                {centers.map(c=><option key={c.id} value={c.id}>{c.logo_emoji} {c.name}</option>)}
              </select>
            </div>
            <div>
              <div style={{fontSize:12,color:'#9A9A9A',marginBottom:5}}>기간 시작</div>
              <input type="date" value={form.period_start} onChange={e=>setForm(f=>({...f,period_start:e.target.value}))} style={{width:'100%',padding:'8px 10px',border:'1px solid rgba(0,0,0,.12)',borderRadius:7,fontSize:13,outline:'none'}}/>
            </div>
            <div>
              <div style={{fontSize:12,color:'#9A9A9A',marginBottom:5}}>기간 종료</div>
              <input type="date" value={form.period_end} onChange={e=>setForm(f=>({...f,period_end:e.target.value}))} style={{width:'100%',padding:'8px 10px',border:'1px solid rgba(0,0,0,.12)',borderRadius:7,fontSize:13,outline:'none'}}/>
            </div>
            <button onClick={create} style={{padding:'9px 18px',background:'#2D6A4F',color:'white',border:'none',borderRadius:7,fontSize:13,fontWeight:700,cursor:'pointer',fontFamily:"'Noto Sans KR',sans-serif",whiteSpace:'nowrap'}}>생성</button>
          </div>
          <div style={{fontSize:11,color:'#9A9A9A',marginTop:8}}>완료 처리된 예약만 집계됩니다</div>
        </div>
      )}

      {loading?<div style={{textAlign:'center',padding:'32px',color:'#9A9A9A'}}>로딩 중...</div>:(
        <Table
          cols={['센터','정산 기간','예약수','총매출','수수료','지급액','상태','액션']}
          rows={list}
          renderRow={(s,i)=>(
            <tr key={s.id} style={{borderBottom:'1px solid rgba(0,0,0,.05)',background:i%2===0?'white':'#FAFAF8'}}>
              <td style={{padding:'10px 12px',fontWeight:600}}>{s.logo_emoji} {s.center_name}</td>
              <td style={{padding:'10px 12px',fontSize:12,whiteSpace:'nowrap'}}>{fmtDate(s.period_start)} ~ {fmtDate(s.period_end)}</td>
              <td style={{padding:'10px 12px',textAlign:'center'}}>{s.appt_count}건</td>
              <td style={{padding:'10px 12px',fontWeight:600}}>{fmtW(s.total_revenue)}</td>
              <td style={{padding:'10px 12px',color:'#E24B4A'}}>{fmtW(s.commission_amt)}</td>
              <td style={{padding:'10px 12px',fontWeight:700,color:'#2D6A4F'}}>{fmtW(s.payout_amt)}</td>
              <td style={{padding:'10px 12px'}}><Chip label={statusLabel[s.status]||s.status} color={statusColor[s.status]||'gray'}/></td>
              <td style={{padding:'10px 12px'}}>
                {s.status==='pending'&&(
                  <button onClick={()=>process(s.id)} disabled={processing===s.id} style={{padding:'5px 10px',borderRadius:5,border:'none',background:'#EEF0FF',color:'#5B21B6',fontSize:11,fontWeight:700,cursor:'pointer',fontFamily:"'Noto Sans KR',sans-serif"}}>지급 완료</button>
                )}
                {s.processed_at&&<div style={{fontSize:10,color:'#9A9A9A',marginTop:2}}>{fmtDt(s.processed_at)}</div>}
              </td>
            </tr>
          )}
        />
      )}
    </div>
  );
}

// ============================================================
// CounselingAdminPage — 어드민 진입점
// ============================================================
function CounselingAdminPage({setView}){
  const {useState:useS,useEffect:useE}=React;
  const [authed,setAuthed]=useS(()=>!!localStorage.getItem('admin_secret'));
  const [secretInput,setSecretInput]=useS('');
  const [tab,setTab]=useS('overview');
  const [loginErr,setLoginErr]=useS('');

  const login=async()=>{
    if(!secretInput){setLoginErr('어드민 시크릿을 입력하세요');return;}
    localStorage.setItem('admin_secret',secretInput);
    const r=await aApi.stats();
    if(r.success){setAuthed(true);setLoginErr('');}
    else{localStorage.removeItem('admin_secret');setLoginErr('인증 실패: 시크릿을 확인하세요');}
  };

  const logout=()=>{localStorage.removeItem('admin_secret');setAuthed(false);setSecretInput('');};

  const tabs=[
    ['overview','📊 대시보드'],['onboarding','📨 온보딩 신청'],['centers','🏥 센터 관리'],
    ['counselors','👥 상담사 관리'],['appointments','📅 예약 관리'],['settlements','💰 정산 관리'],
  ];

  if(!authed)return(
    <div style={{minHeight:'100vh',background:'#FAFAF8',display:'flex',alignItems:'center',justifyContent:'center',fontFamily:"'Noto Sans KR',sans-serif",padding:16}}>
      <div style={{background:'white',borderRadius:16,padding:'40px 36px',width:'100%',maxWidth:380,boxShadow:'0 8px 32px rgba(0,0,0,.10)'}}>
        <div style={{textAlign:'center',marginBottom:28}}>
          <div style={{fontSize:40,marginBottom:10}}>🔐</div>
          <h2 style={{fontSize:22,fontWeight:700,marginBottom:4}}>어드민 로그인</h2>
          <p style={{fontSize:13,color:'#9A9A9A'}}>상담 플랫폼 관리자 전용</p>
        </div>
        {loginErr&&<div style={{background:'#FEF2F2',color:'#991B1B',borderRadius:8,padding:'10px 14px',marginBottom:16,fontSize:13}}>{loginErr}</div>}
        <input
          type="password" value={secretInput} onChange={e=>setSecretInput(e.target.value)}
          onKeyDown={e=>e.key==='Enter'&&login()}
          placeholder="ADMIN_SECRET"
          style={{width:'100%',padding:'12px 14px',border:'1px solid rgba(0,0,0,.12)',borderRadius:10,fontSize:14,fontFamily:"'Noto Sans KR',sans-serif",outline:'none',marginBottom:14}}
        />
        <button onClick={login} style={{width:'100%',padding:'13px 0',background:'#2D6A4F',color:'white',border:'none',borderRadius:10,fontSize:15,fontWeight:700,cursor:'pointer',fontFamily:"'Noto Sans KR',sans-serif"}}>로그인</button>
        <div style={{textAlign:'center',marginTop:16}}>
          <button onClick={()=>setView('landing')} style={{background:'none',border:'none',color:'#9A9A9A',fontSize:13,cursor:'pointer',fontFamily:"'Noto Sans KR',sans-serif"}}>← 홈으로 돌아가기</button>
        </div>
      </div>
    </div>
  );

  return(
    <div style={{minHeight:'100vh',background:'#F5F5F0',fontFamily:"'Noto Sans KR',sans-serif"}}>
      {/* 어드민 헤더 */}
      <div style={{background:'#1A3D2B',padding:'0 24px',height:56,display:'flex',alignItems:'center',justifyContent:'space-between'}}>
        <div style={{display:'flex',alignItems:'center',gap:14}}>
          <div style={{fontSize:18,fontWeight:700,color:'white'}}>🌿 마음풀 어드민</div>
          <span style={{background:'rgba(255,255,255,.15)',color:'rgba(255,255,255,.8)',fontSize:10,fontWeight:700,padding:'3px 9px',borderRadius:100,letterSpacing:'0.5px'}}>COUNSELING</span>
        </div>
        <div style={{display:'flex',alignItems:'center',gap:12}}>
          <button onClick={()=>setView('landing')} style={{background:'rgba(255,255,255,.08)',color:'rgba(255,255,255,.7)',border:'none',borderRadius:7,padding:'6px 14px',fontSize:12,cursor:'pointer',fontFamily:"'Noto Sans KR',sans-serif"}}>← 사이트로</button>
          <button onClick={logout} style={{background:'none',color:'rgba(255,255,255,.5)',border:'1px solid rgba(255,255,255,.2)',borderRadius:7,padding:'6px 14px',fontSize:12,cursor:'pointer',fontFamily:"'Noto Sans KR',sans-serif"}}>로그아웃</button>
        </div>
      </div>

      <div style={{display:'flex',minHeight:'calc(100vh - 56px)'}}>
        {/* 사이드바 */}
        <div style={{width:200,background:'#1E2D24',padding:'20px 0',flexShrink:0}}>
          {tabs.map(([id,label])=>(
            <button key={id} onClick={()=>setTab(id)}
              style={{display:'block',width:'100%',textAlign:'left',padding:'12px 20px',background:tab===id?'rgba(255,255,255,.1)':'none',border:'none',borderLeft:tab===id?'3px solid #52B788':'3px solid transparent',color:tab===id?'white':'rgba(255,255,255,.55)',fontSize:13,fontWeight:tab===id?600:400,cursor:'pointer',fontFamily:"'Noto Sans KR',sans-serif",transition:'all .15s'}}>
              {label}
            </button>
          ))}
        </div>

        {/* 메인 영역 */}
        <div style={{flex:1,padding:'28px 32px',overflow:'auto'}}>
          {tab==='overview'    &&<AdminOverview/>}
          {tab==='onboarding'  &&<AdminOnboarding/>}
          {tab==='centers'     &&<AdminCenters/>}
          {tab==='counselors'  &&<AdminCounselors/>}
          {tab==='appointments'&&<AdminAppointments/>}
          {tab==='settlements' &&<AdminSettlements/>}
        </div>
      </div>
    </div>
  );
}
