/* ==========================================================================
 * ADMIN NEXT — page-cryptodeposit.jsx  (ฝากคริปโต USDT: ยอดเข้า / กระเป๋ารับเงิน / ตั้งค่า / รอบฝาก)
 *   backend: /api/admin/crypto-deposit/*  (src/routes/admin/crypto-deposit.js)
 * ========================================================================== */

const CD_NET_COLOR = { trc20:"#ff3b3b", bep20:"#f3ba2f", erc20:"#627eea" };
const CD_TRANSFER_STATUS = {
  credited:["เติมแล้ว","var(--success)"], review:["รอแอดมินตรวจ","var(--warn)"], unmatched:["หาเจ้าของไม่เจอ","var(--danger)"],
  ignored:["ปิดรายการ","var(--muted)"], crediting:["กำลังเติม","var(--accent)"], new:["ใหม่","var(--accent)"],
};
const CD_REQUEST_STATUS = {
  pending:["รอโอน","var(--accent)"], success:["สำเร็จ","var(--success)"], review:["รอแอดมินตรวจ","var(--warn)"],
  expired:["หมดเวลา","var(--muted)"], cancelled:["ยกเลิก","var(--muted)"],
};

function CdNet({ n }) {
  return <span className="rounded-full px-2 py-0.5 text-[11px] font-bold" style={{background:CD_NET_COLOR[n]||"#999",color:"#111"}}>{String(n||"").toUpperCase()}</span>;
}
function CdStatus({ map, s }) {
  const [label,color]=map[s]||[s,"var(--muted)"];
  return <span className="whitespace-nowrap rounded-full border px-2 py-0.5 text-[11px] font-semibold" style={{borderColor:color,color}}>{label}</span>;
}
const cdShort=(s)=>s?(String(s).length>16?String(s).slice(0,8)+"…"+String(s).slice(-6):s):"-";
const CD_INPUT="w-full rounded-lg border border-line bg-surface px-3 py-2 text-sm";
const CD_BTN="flex h-9 items-center gap-1.5 rounded-lg border border-line bg-surface px-3 text-sm font-medium text-fg-2 hover:bg-sunken disabled:opacity-50";
const CD_BTN_PRIMARY="flex h-9 items-center gap-1.5 rounded-lg px-4 text-sm font-semibold text-white disabled:opacity-50";

function CryptoDepositPage({ toast }) {
  const [tab,setTab]=useState("transfers");
  const tabs=[["transfers","ยอดเข้า"],["wallets","กระเป๋ารับเงิน"],["settings","ตั้งค่า / เรท"],["requests","รอบฝากของลูกค้า"]];
  return (<div className="space-y-4">
    <div className="flex flex-wrap gap-1 rounded-xl border border-line bg-surface p-1 shadow-sm">
      {tabs.map(([k,l])=>(<button key={k} onClick={()=>setTab(k)} className={"rounded-lg px-4 py-2 text-sm font-semibold "+(tab===k?"bg-accent text-white":"text-fg-2 hover:bg-sunken")}>{l}</button>))}
    </div>
    {tab==="transfers" && <CdTransfers toast={toast}/>}
    {tab==="wallets" && <CdWallets toast={toast}/>}
    {tab==="settings" && <CdSettings toast={toast}/>}
    {tab==="requests" && <CdRequests/>}
  </div>);
}

/* ---------- ยอดเข้า: ทุกยอด USDT ที่เข้ากระเป๋า + ผูกยูสให้ยอดที่หาเจ้าของไม่เจอ ---------- */
function CdTransfers({ toast }) {
  const [rows,setRows]=useState([]),[loading,setLoading]=useState(true),[err,setErr]=useState(null);
  const [status,setStatus]=useState(""),[q,setQ]=useState(""),[busy,setBusy]=useState(null),[scanning,setScanning]=useState(false);
  const load=useCallback(async()=>{ setLoading(true); setErr(null);
    try{ const p=new URLSearchParams(); if(status) p.set("status",status); if(q.trim()) p.set("q",q.trim());
      const d=await api("/crypto-deposit/transfers?"+p.toString()); setRows(Array.isArray(d)?d:[]); }
    catch(e){ if(e.status===401||e.status===403) window.__nxAuthFail?.(); setErr(e.message||"โหลดไม่สำเร็จ"); }
    finally{ setLoading(false); } },[status,q]);
  useEffect(()=>{ load(); },[status]); // eslint-disable-line

  const scanNow=async()=>{ setScanning(true);
    try{ const r=await api("/crypto-deposit/scan",{method:"POST",body:{}});
      if(r.skipped) toast("กำลังสแกนอยู่แล้ว");
      else toast(`สแกนแล้ว: ยอดใหม่ ${r.found} · เติม ${r.credited} · หาเจ้าของไม่เจอ ${r.unmatched}`+((r.errors||[]).length?` · ผิดพลาด: ${r.errors.map(x=>x.network+" "+x.error).join(", ")}`:""));
      load(); }
    catch(e){ toast(e.message||"สแกนไม่สำเร็จ"); } finally{ setScanning(false); } };
  const assign=async(r)=>{
    const username=window.prompt(`ผูกยอด ${r.amount_usdt} USDT เข้ายูสไหน? (เติมเครดิตทันทีตามเรทปัจจุบัน)`,""); if(!username) return;
    setBusy(r.id);
    try{ const out=await api(`/crypto-deposit/transfers/${r.id}/assign`,{method:"POST",body:{username}});
      toast(out.status==="credited"?`เติมเครดิต ${money2(out.creditSatang)} แล้ว`:"ส่งเข้าคิวรออนุมัติฝากแล้ว"); load(); }
    catch(e){ toast(e.message||"ไม่สำเร็จ"); } finally{ setBusy(null); } };
  const ignore=async(r)=>{
    const note=window.prompt("เหตุผลที่ปิดรายการนี้ (เช่น เงินของเว็บเอง):",""); if(note===null) return;
    setBusy(r.id);
    try{ await api(`/crypto-deposit/transfers/${r.id}/ignore`,{method:"POST",body:{note}}); toast("ปิดรายการแล้ว"); load(); }
    catch(e){ toast(e.message||"ไม่สำเร็จ"); } finally{ setBusy(null); } };

  const unmatched=rows.filter(r=>r.status==="unmatched").length;
  const H=(c,x="")=>histTh(c,x);
  return (<div className="space-y-3">
    <div className="flex flex-wrap items-center gap-2">
      <select value={status} onChange={e=>setStatus(e.target.value)} className="h-9 rounded-lg border border-line bg-surface px-2 text-sm">
        <option value="">ทุกสถานะ</option><option value="unmatched">หาเจ้าของไม่เจอ</option><option value="credited">เติมแล้ว</option>
        <option value="review">รอแอดมินตรวจ</option><option value="ignored">ปิดรายการ</option>
      </select>
      <input value={q} onChange={e=>setQ(e.target.value)} onKeyDown={e=>{ if(e.key==="Enter") load(); }} placeholder="ค้นหา TXID / ผู้โอน / ยูส" className="h-9 w-64 rounded-lg border border-line bg-surface px-3 text-sm"/>
      <button onClick={load} className={CD_BTN}><Ic d={I.refresh} size={16} cls={loading?"animate-spin":""}/> รีเฟรช</button>
      <button onClick={scanNow} disabled={scanning} className={CD_BTN}><Ic d={I.search} size={16}/> {scanning?"กำลังสแกน…":"สแกนยอดเข้าตอนนี้"}</button>
      {unmatched>0 && <div className="ml-auto rounded-lg px-3 py-1.5 text-xs font-semibold" style={{background:"var(--danger-soft)",color:"var(--danger)"}}>หาเจ้าของไม่เจอ {unmatched} รายการ</div>}
    </div>
    <div className="text-xs text-muted">ระบบสแกนอัตโนมัติทุก 20 วินาที · นับเฉพาะรายการที่ยืนยันบล็อกครบแล้ว · ยอดที่ทศนิยมไม่ตรงรอบไหนเลยจะขึ้น "หาเจ้าของไม่เจอ" ให้กดผูกยูสเอง</div>
    {err ? <HistErr msg={err} onRetry={load}/> : (
    <div className="overflow-hidden rounded-xl border border-line bg-surface shadow-sm"><div className="overflow-x-auto"><table className="w-full min-w-[980px] border-collapse text-sm">
      <thead className="border-b-2 border-accent/25 bg-accent-soft"><tr>{H("เวลา")}{H("เครือข่าย")}{H("ยอด USDT","text-right")}{H("เครดิต","text-right")}{H("สมาชิก")}{H("ผู้โอน / TXID")}{H("สถานะ")}{H("จัดการ","text-right pr-4")}</tr></thead>
      <tbody>
        {loading ? Array.from({length:5}).map((_,i)=>(<tr key={i} className="border-b border-line-soft"><td className="px-3 py-3" colSpan="8"><div className="skel h-5 w-full"/></td></tr>))
        : rows.length===0 ? (<tr><td colSpan="8" className="px-4 py-16 text-center text-sm font-medium text-fg-2">ยังไม่มียอดเข้า</td></tr>)
        : rows.map(r=>(<tr key={r.id} className="border-b border-line-soft last:border-0 hover:bg-sunken/50">
          <td className="whitespace-nowrap px-3 py-2.5 text-xs text-fg-2">{fmtDT(r.block_time||r.created_at)}</td>
          <td className="px-3"><CdNet n={r.network}/><div className="mt-0.5 text-[11px] text-muted">{r.wallet_label||cdShort(r.to_address)}</div></td>
          <td className="whitespace-nowrap px-3 text-right font-semibold tnum">{r.amount_usdt}</td>
          <td className="whitespace-nowrap px-3 text-right tnum">{r.credit_satang!=null?money2(r.credit_satang):"-"}{r.rate_thb?<div className="text-[11px] text-muted">เรท {r.rate_thb}</div>:null}</td>
          <td className="px-3 font-semibold text-accent">{r.username||"-"}</td>
          <td className="px-3 text-xs"><div className="mono text-muted">{cdShort(r.from_address)}</div><a href={r.explorer_url} target="_blank" rel="noopener" className="mono text-accent hover:underline">{cdShort(r.txid)}</a></td>
          <td className="px-3"><CdStatus map={CD_TRANSFER_STATUS} s={r.status}/>{r.note?<div className="mt-0.5 max-w-[200px] text-[11px] text-muted">{r.note}</div>:null}</td>
          <td className="pr-4"><div className="flex justify-end gap-1">
            {r.status==="unmatched" && <>
              <button disabled={busy===r.id} onClick={()=>ignore(r)} className="h-7 rounded-lg border border-line px-2 text-xs text-fg-2 hover:bg-sunken disabled:opacity-50">ปิด</button>
              <button disabled={busy===r.id} onClick={()=>assign(r)} className="h-7 rounded-lg px-2 text-xs font-semibold text-white disabled:opacity-50" style={{background:"var(--success)"}}>ผูกยูส</button>
            </>}
          </div></td>
        </tr>))}
      </tbody>
    </table></div></div>)}
  </div>);
}

/* ---------- กระเป๋ารับเงิน: เพิ่ม / แก้ / ปิด / ลบ ---------- */
function CdWallets({ toast }) {
  const empty={id:"",network:"trc20",address:"",label:"",is_active:true,sort_order:0};
  const [rows,setRows]=useState([]),[loading,setLoading]=useState(true),[err,setErr]=useState(null);
  const [form,setForm]=useState(null),[saving,setSaving]=useState(false);
  const load=useCallback(async()=>{ setLoading(true); setErr(null);
    try{ const d=await api("/crypto-deposit/wallets"); setRows(Array.isArray(d)?d:[]); }
    catch(e){ if(e.status===401||e.status===403) window.__nxAuthFail?.(); setErr(e.message||"โหลดไม่สำเร็จ"); }
    finally{ setLoading(false); } },[]);
  useEffect(()=>{ load(); },[load]);
  const save=async()=>{ setSaving(true);
    try{ await api("/crypto-deposit/wallets",{method:"POST",body:{...form,id:form.id||undefined}}); toast(form.id?"บันทึกแล้ว":"เพิ่มกระเป๋าแล้ว"); setForm(null); load(); }
    catch(e){ toast(e.message||"บันทึกไม่สำเร็จ"); } finally{ setSaving(false); } };
  const toggle=async(w)=>{
    try{ await api("/crypto-deposit/wallets",{method:"POST",body:{...w,is_active:!w.is_active}}); toast(w.is_active?"ปิดรับฝากกระเป๋านี้แล้ว":"เปิดรับฝากแล้ว"); load(); }
    catch(e){ toast(e.message||"ไม่สำเร็จ"); } };
  const del=async(w)=>{ if(!window.confirm(`ลบกระเป๋า ${w.label||w.address}?\nรอบฝากที่ลูกค้าเปิดค้างกับกระเป๋านี้จะถูกยกเลิก`)) return;
    try{ await api("/crypto-deposit/wallets/"+w.id,{method:"DELETE"}); toast("ลบแล้ว"); load(); }
    catch(e){ toast(e.message||"ลบไม่สำเร็จ"); } };

  return (<div className="space-y-3">
    <div className="flex flex-wrap items-center gap-2">
      <button onClick={()=>setForm({...empty})} className={CD_BTN_PRIMARY} style={{background:"var(--accent)"}}><Ic d={I.plus} size={16}/> เพิ่มกระเป๋า</button>
      <button onClick={load} className={CD_BTN}><Ic d={I.refresh} size={16} cls={loading?"animate-spin":""}/> รีเฟรช</button>
      <div className="ml-auto text-xs text-muted">ลูกค้าเลือกกระเป๋าที่เปิดอยู่ แล้วเห็น QR ของกระเป๋านั้น</div>
    </div>
    {form && (<div className="rounded-xl border border-line bg-surface p-5 shadow-sm space-y-3">
      <h3 className="text-sm font-semibold text-fg">{form.id?"แก้ไขกระเป๋า":"เพิ่มกระเป๋ารับเงิน"}</h3>
      <div className="grid gap-3 md:grid-cols-3">
        <div><label className="mb-1 block text-xs font-semibold text-fg-2">เครือข่าย</label>
          <select value={form.network} onChange={e=>setForm(f=>({...f,network:e.target.value}))} className={CD_INPUT}>
            <option value="trc20">USDT TRC20 (Tron)</option><option value="bep20">USDT BEP20 (BNB Smart Chain)</option><option value="erc20">USDT ERC20 (Ethereum)</option>
          </select></div>
        <div className="md:col-span-2"><label className="mb-1 block text-xs font-semibold text-fg-2">ที่อยู่กระเป๋า</label>
          <input value={form.address} onChange={e=>setForm(f=>({...f,address:e.target.value.trim()}))} placeholder={form.network==="trc20"?"T...":"0x..."} className={CD_INPUT+" mono"}/></div>
        <div><label className="mb-1 block text-xs font-semibold text-fg-2">ชื่อที่ลูกค้าเห็น</label>
          <input value={form.label||""} onChange={e=>setForm(f=>({...f,label:e.target.value}))} placeholder="เช่น กระเป๋าหลัก" className={CD_INPUT}/></div>
        <div><label className="mb-1 block text-xs font-semibold text-fg-2">ลำดับ</label>
          <input type="number" value={form.sort_order} onChange={e=>setForm(f=>({...f,sort_order:e.target.value}))} className={CD_INPUT}/></div>
        <label className="flex items-end gap-2 pb-2 text-sm text-fg-2"><input type="checkbox" checked={!!form.is_active} onChange={e=>setForm(f=>({...f,is_active:e.target.checked}))} className="h-4 w-4 accent-accent"/> เปิดรับฝาก</label>
      </div>
      <div className="rounded-lg bg-sunken px-3 py-2 text-xs text-muted">ใช้ที่อยู่ของกระเป๋าที่คุณถือ private key / seed เอง (หรือที่อยู่ฝากของ Exchange ที่รองรับเครือข่ายนั้น) · เซิร์ฟเวอร์เก็บแค่ที่อยู่ ไม่ต้องใส่ private key</div>
      <div className="flex gap-2"><button disabled={saving} onClick={save} className={CD_BTN_PRIMARY} style={{background:"var(--success)"}}>{saving?"กำลังบันทึก…":"บันทึก"}</button><button onClick={()=>setForm(null)} className={CD_BTN}>ยกเลิก</button></div>
    </div>)}
    {err ? <HistErr msg={err} onRetry={load}/> : (
    <div className="overflow-hidden rounded-xl border border-line bg-surface shadow-sm"><div className="overflow-x-auto"><table className="w-full min-w-[760px] border-collapse text-sm">
      <thead className="border-b-2 border-accent/25 bg-accent-soft"><tr>{histTh("เครือข่าย")}{histTh("ชื่อ")}{histTh("ที่อยู่")}{histTh("สถานะ")}{histTh("จัดการ","text-right pr-4")}</tr></thead>
      <tbody>
        {loading ? (<tr><td colSpan="5" className="px-3 py-3"><div className="skel h-5 w-full"/></td></tr>)
        : rows.length===0 ? (<tr><td colSpan="5" className="px-4 py-12 text-center text-sm font-medium text-fg-2">ยังไม่มีกระเป๋า กด "เพิ่มกระเป๋า" เพื่อเริ่มรับฝาก USDT</td></tr>)
        : rows.map(w=>(<tr key={w.id} className="border-b border-line-soft last:border-0 hover:bg-sunken/50">
          <td className="px-3 py-2.5"><CdNet n={w.network}/></td>
          <td className="px-3 font-semibold">{w.label||"-"}</td>
          <td className="px-3 mono text-xs text-fg-2 break-all">{w.address} <button onClick={()=>{ navigator.clipboard?.writeText(w.address); toast("คัดลอกแล้ว"); }} className="ml-1 text-accent"><Ic d={I.copy} size={12}/></button></td>
          <td className="px-3">{w.is_active?<span className="text-xs font-semibold" style={{color:"var(--success)"}}>เปิดรับฝาก</span>:<span className="text-xs text-muted">ปิด</span>}</td>
          <td className="pr-4"><div className="flex justify-end gap-1">
            <button onClick={()=>toggle(w)} className="h-7 rounded-lg border border-line px-2 text-xs text-fg-2 hover:bg-sunken">{w.is_active?"ปิด":"เปิด"}</button>
            <button onClick={()=>setForm({...w})} className="h-7 rounded-lg border border-line px-2 text-xs text-fg-2 hover:bg-sunken">แก้ไข</button>
            <button onClick={()=>del(w)} className="grid h-7 w-7 place-items-center rounded-lg border" style={{borderColor:"var(--danger)",color:"var(--danger)"}}><Ic d={I.trash} size={13}/></button>
          </div></td>
        </tr>))}
      </tbody>
    </table></div></div>)}
  </div>);
}

/* ---------- ตั้งค่า / เรท ---------- */
function CdSettings({ toast }) {
  const [cfg,setCfg]=useState(null),[nets,setNets]=useState([]),[err,setErr]=useState(null),[saving,setSaving]=useState(false),[testing,setTesting]=useState(null);
  const load=useCallback(async()=>{ setErr(null);
    try{ const d=await api("/crypto-deposit/settings"); setCfg(d.settings||{}); setNets(d.networks||[]); }
    catch(e){ if(e.status===401||e.status===403) window.__nxAuthFail?.(); setErr(e.message||"โหลดไม่สำเร็จ"); } },[]);
  useEffect(()=>{ load(); },[load]);
  if(err) return <HistErr msg={err} onRetry={load}/>;
  if(!cfg) return <div className="flex items-center gap-2 py-16 justify-center text-sm text-muted"><Ic d={I.refresh} size={16} cls="animate-spin"/> กำลังโหลด…</div>;
  const set=(k,v)=>setCfg(c=>({...c,[k]:v}));
  const save=async()=>{ setSaving(true);
    try{ const d=await api("/crypto-deposit/settings",{method:"POST",body:cfg}); setCfg(d.settings||cfg); toast("บันทึกแล้ว"); }
    catch(e){ toast(e.message||"บันทึกไม่สำเร็จ"); } finally{ setSaving(false); } };
  const test=async(network)=>{ setTesting(network);
    try{ const r=await api("/crypto-deposit/test",{method:"POST",body:{network}}); toast(r.ok?`เชื่อมต่อ ${network.toUpperCase()} สำเร็จ (บล็อก ${Number(r.block).toLocaleString()})`:`เชื่อมต่อไม่สำเร็จ: ${r.message||""}`); }
    catch(e){ toast(e.message||"ทดสอบไม่สำเร็จ"); } finally{ setTesting(null); } };
  const rate=Number(cfg.crypto_rate_thb||0);
  const field=(k,label,ph,type="text",hint)=>(<div><label className="mb-1 block text-xs font-semibold text-fg-2">{label}</label>
    <input type={type} value={cfg[k]||""} onChange={e=>set(k,e.target.value)} placeholder={ph} className={CD_INPUT}/>{hint&&<div className="mt-1 text-[11px] text-muted">{hint}</div>}</div>);
  const netDef=(k)=>nets.find(n=>n.key===k)||{};

  return (<div className="space-y-4">
    <div className="rounded-xl border border-line bg-surface p-5 shadow-sm space-y-4">
      <h3 className="text-sm font-semibold text-fg">ระบบฝาก USDT</h3>
      <label className="flex items-center gap-2 cursor-pointer"><input type="checkbox" checked={cfg.crypto_deposit_enabled==="1"} onChange={e=>set("crypto_deposit_enabled",e.target.checked?"1":"0")} className="h-4 w-4 accent-accent"/><span className="text-sm text-fg-2">เปิดรับฝาก USDT (เปิด/ปิดได้ที่หน้า "จัดการช่องทางฝาก" ด้วย)</span></label>
      <div className="grid gap-3 md:grid-cols-3">
        {field("crypto_rate_thb","เรท: 1 USDT = กี่บาท","เช่น 33.50","number",rate>0?`ลูกค้าโอน 100 USDT ได้เครดิต ${(100*rate).toLocaleString("th-TH",{maximumFractionDigits:2})} บาท`:"ต้องตั้งเรทก่อนลูกค้าจึงจะเห็นช่องทางนี้")}
        {field("crypto_min_usdt","ยอดขั้นต่ำ (USDT)","1","number","ต่ำกว่านี้ไม่เติมอัตโนมัติ ส่งเข้าคิวให้แอดมินตรวจ")}
        {field("crypto_review_over_baht","ยอดเกินกี่บาทให้แอดมินตรวจก่อน","0 = ไม่จำกัด","number")}
        <div><label className="mb-1 block text-xs font-semibold text-fg-2">ทศนิยมประจำรอบ</label>
          <select value={cfg.crypto_tag_decimals||"2"} onChange={e=>set("crypto_tag_decimals",e.target.value)} className={CD_INPUT}>
            <option value="2">2 หลัก (.37) — ลูกค้าโอนง่าย, รับพร้อมกันได้ 99 รอบ/กระเป๋า</option>
            <option value="3">3 หลัก (.375) — 999 รอบ/กระเป๋า</option>
            <option value="4">4 หลัก (.3751) — 9,999 รอบ/กระเป๋า</option>
          </select><div className="mt-1 text-[11px] text-muted">ระบบใช้ทศนิยมนี้แยกว่ายอดไหนเป็นของลูกค้าคนไหน</div></div>
        {field("crypto_expire_minutes","อายุรอบฝาก (นาที)","30","number","หลังหมดเวลายังรับยอดที่เข้าช้าได้อีก 15 นาที")}
      </div>
    </div>

    <div className="rounded-xl border border-line bg-surface p-5 shadow-sm space-y-4">
      <h3 className="text-sm font-semibold text-fg">โหนดบล็อกเชน (ปล่อยว่าง = ใช้ค่าเริ่มต้น)</h3>
      <div className="grid gap-3 md:grid-cols-2">
        {field("crypto_trongrid_url","TRC20 — TronGrid URL",netDef("trc20").defaultRpc)}
        {field("crypto_trongrid_api_key","TRC20 — TronGrid API Key","แนะนำให้ใส่ (สมัครฟรีที่ trongrid.io)","password")}
        {field("crypto_bep20_rpc_url","BEP20 — RPC URL",netDef("bep20").defaultRpc)}
        {field("crypto_bep20_confirmations","BEP20 — จำนวนบล็อกยืนยัน",String(netDef("bep20").defaultConfirmations||15),"number")}
        {field("crypto_erc20_rpc_url","ERC20 — RPC URL",netDef("erc20").defaultRpc)}
        {field("crypto_erc20_confirmations","ERC20 — จำนวนบล็อกยืนยัน",String(netDef("erc20").defaultConfirmations||12),"number")}
      </div>
      <div className="flex flex-wrap gap-2">{["trc20","bep20","erc20"].map(n=>(<button key={n} disabled={!!testing} onClick={()=>test(n)} className={CD_BTN}><Ic d={I.refresh} size={14} cls={testing===n?"animate-spin":""}/> ทดสอบ {n.toUpperCase()}</button>))}</div>
      <div className="text-[11px] text-muted">สัญญา USDT ที่ระบบนับ: {nets.map(n=>`${n.label} ${n.contract}`).join(" · ")} — เหรียญอื่นที่ชื่อเหมือนจะไม่ถูกนับ</div>
    </div>
    <button disabled={saving} onClick={save} className={CD_BTN_PRIMARY} style={{background:"var(--success)"}}><Ic d={I.check} size={16}/> {saving?"กำลังบันทึก…":"บันทึกการตั้งค่า"}</button>
  </div>);
}

/* ---------- รอบฝากของลูกค้า (ใครเปิดรอบไหน ได้ทศนิยมอะไร) ---------- */
function CdRequests() {
  const [rows,setRows]=useState([]),[loading,setLoading]=useState(true),[err,setErr]=useState(null),[q,setQ]=useState("");
  const load=useCallback(async()=>{ setLoading(true); setErr(null);
    try{ const d=await api("/crypto-deposit/requests"+(q.trim()?"?q="+encodeURIComponent(q.trim()):"")); setRows(Array.isArray(d)?d:[]); }
    catch(e){ if(e.status===401||e.status===403) window.__nxAuthFail?.(); setErr(e.message||"โหลดไม่สำเร็จ"); }
    finally{ setLoading(false); } },[q]);
  useEffect(()=>{ load(); },[]); // eslint-disable-line
  return (<div className="space-y-3">
    <div className="flex flex-wrap items-center gap-2">
      <input value={q} onChange={e=>setQ(e.target.value)} onKeyDown={e=>{ if(e.key==="Enter") load(); }} placeholder="ค้นหายูส" className="h-9 w-56 rounded-lg border border-line bg-surface px-3 text-sm"/>
      <button onClick={load} className={CD_BTN}><Ic d={I.refresh} size={16} cls={loading?"animate-spin":""}/> รีเฟรช</button>
    </div>
    {err ? <HistErr msg={err} onRetry={load}/> : (
    <div className="overflow-hidden rounded-xl border border-line bg-surface shadow-sm"><div className="overflow-x-auto"><table className="w-full min-w-[820px] border-collapse text-sm">
      <thead className="border-b-2 border-accent/25 bg-accent-soft"><tr>{histTh("เวลา")}{histTh("สมาชิก")}{histTh("กระเป๋า")}{histTh("ทศนิยม")}{histTh("เรท","text-right")}{histTh("ยอดที่ได้รับ","text-right")}{histTh("เครดิต","text-right")}{histTh("สถานะ")}</tr></thead>
      <tbody>
        {loading ? (<tr><td colSpan="8" className="px-3 py-3"><div className="skel h-5 w-full"/></td></tr>)
        : rows.length===0 ? (<tr><td colSpan="8" className="px-4 py-12 text-center text-sm font-medium text-fg-2">ยังไม่มีรอบฝาก</td></tr>)
        : rows.map(r=>(<tr key={r.id} className="border-b border-line-soft last:border-0 hover:bg-sunken/50">
          <td className="whitespace-nowrap px-3 py-2.5 text-xs text-fg-2">{fmtDT(r.created_at)}</td>
          <td className="px-3 font-semibold text-accent">{r.username}</td>
          <td className="px-3"><CdNet n={r.network}/> <span className="text-xs text-muted">{r.wallet_label||""}</span></td>
          <td className="px-3 font-bold tnum">{r.tag_text}</td>
          <td className="px-3 text-right tnum">{r.rate_thb}</td>
          <td className="px-3 text-right tnum">{r.amount_usdt?r.amount_usdt+" USDT":"-"}</td>
          <td className="px-3 text-right tnum">{r.credit_satang!=null?money2(r.credit_satang):"-"}</td>
          <td className="px-3"><CdStatus map={CD_REQUEST_STATUS} s={r.status}/></td>
        </tr>))}
      </tbody>
    </table></div></div>)}
  </div>);
}
