// KASHA — 굿즈 장바구니 결제 (계좌이체 단일)
// 상세 페이지에서 담은 장바구니(여러 상품)를 한 번에 결제해요. 완료 시 영수증 이메일 + 주문 저장.
// 주문자 정보(이름·연락처·이메일)는 계정 값으로 고정(변경 불가). 배송지는 도로명 주소 API로 입력.

// 다음(카카오) 우편번호 서비스 — 필요 시 스크립트를 한 번만 로드
function loadDaumPostcode() {
  if (window.daum && window.daum.Postcode) return Promise.resolve(true);
  if (window.__daumPostcodeLoading) return window.__daumPostcodeLoading;
  window.__daumPostcodeLoading = new Promise((resolve) => {
    const s = document.createElement("script");
    s.src = "https://t1.daumcdn.net/mapjsapi/bundle/postcode/prod/postcode.v2.js";
    s.onload = () => resolve(true);
    s.onerror = () => resolve(false);
    document.head.appendChild(s);
  });
  return window.__daumPostcodeLoading;
}

function GoodsPayScreen({ order, onNavigate }) {
  const { Button, Card, Input, Icon } = window.DS;
  const DB = window.KASHADB;
  window.KASHADB.useStore();
  const user = DB.getCurrentUser();
  const f = (DB.getGoodsForms() || []).filter((x) => x.id === (order && order.formId))[0];
  const won = (n) => Number(n || 0).toLocaleString("ko-KR");

  // 장바구니 항목 → 실제 상품과 매칭 (상세에서 넘어온 { productId, qty })
  const cart = (order && order.cart) || [];
  const lines = f ? cart.map((c) => {
    const p = (f.products || []).filter((x) => x.id === c.productId)[0];
    return p ? { p, qty: c.qty, subtotal: (parseInt(p.price, 10) || 0) * c.qty } : null;
  }).filter(Boolean) : [];
  // 배송 방식 — 상품이 2개 이상 방식을 제공하면 구매자가 받을 방식을 골라요(기본=첫 번째 제공 방식).
  const SHIP_LABEL = { digital: "디지털", ship: "실물 배송", handoff: "실물 전달" };
  const shipOffered = (p) => (Array.isArray(p.shipTypes) && p.shipTypes.length ? p.shipTypes : [p.shipType || "ship"]);
  // 주문 단위 배송 방식: 전체 상품이 공통으로 제공하는 방식(교집합)에서 하나를 골라 모든 상품에 적용
  const commonShip = lines.length ? lines.map((l) => shipOffered(l.p)).reduce((acc, arr) => acc.filter((v) => arr.indexOf(v) >= 0)) : [];
  const [orderShip, setOrderShip] = React.useState("");
  const effOrderShip = commonShip.indexOf(orderShip) >= 0 ? orderShip : (commonShip[0] || "");
  const chosenShip = (l) => (commonShip.length ? effOrderShip : shipOffered(l.p)[0]);   // 공통 방식이 있으면 전체 동일, 없으면(드묾) 상품별 기본값
  const needShip = lines.some((l) => chosenShip(l) === "ship");
  const totalQty = lines.reduce((s, l) => s + l.qty, 0);
  const total = lines.reduce((s, l) => s + l.subtotal, 0);
  const cartMap = {};
  lines.forEach((l) => { cartMap[l.p.id] = l.qty; });

  // 배송지 — 도로명 주소 API(우편번호·도로명) + 상세주소. 계정에 저장된 기본 주소가 있으면 미리 채워요.
  const savedAddr = (user && user.address) || {};
  const [zonecode, setZonecode] = React.useState(savedAddr.zonecode || "");
  const [roadAddr, setRoadAddr] = React.useState(savedAddr.road || "");
  const [addrDetail, setAddrDetail] = React.useState(savedAddr.detail || "");
  const prefilledAddr = !!(savedAddr.road || "").trim();   // 저장 주소 자동 채움 여부(안내 표시용)
  // 환불 수령 계좌 — 저장된 값이 있으면 자동 채움
  const savedRefund = (user && user.refundAccount) || { bank: "", number: "", holder: "" };
  const [refund, setRefund] = React.useState({ bank: savedRefund.bank || "", number: savedRefund.number || "", holder: savedRefund.holder || "" });
  const setRefundK = (k, v) => setRefund((s) => Object.assign({}, s, { [k]: v }));
  const [busy, setBusy] = React.useState(false);
  const [err, setErr] = React.useState("");
  const [done, setDone] = React.useState(null);   // {order, deposit}
  const [pcOpen, setPcOpen] = React.useState(false);   // 주소 검색 임베드 모달
  const pcRef = React.useRef(null);
  const { render: pcRender, active: pcActive } = window.useKashaModalAnim(pcOpen);   // 전역 모달 모션(열림/닫힘 통일)

  // 주소 검색 모달이 열리면 다음(카카오) 우편번호 위젯을 인페이지로 임베드
  //  pcRender 도 의존성에 포함 — 애니메이션 마운트로 pcRef 가 붙은 다음 프레임에 재실행돼 임베드가 안정적으로 돼요.
  React.useEffect(() => {
    if (!pcOpen || !pcRef.current || !window.daum || !window.daum.Postcode) return;
    pcRef.current.innerHTML = "";
    new window.daum.Postcode({
      oncomplete: (data) => {
        setZonecode(data.zonecode || "");
        setRoadAddr(data.roadAddress || data.jibunAddress || "");
        setErr(""); setPcOpen(false);
        setTimeout(() => { const el = document.getElementById("kg-addr-detail"); if (el) el.focus(); }, 60);
      },
      onclose: () => setPcOpen(false),
      width: "100%", height: "100%",
    }).embed(pcRef.current);
  }, [pcOpen, pcRender]);
  // 배경 스크롤 잠금 — 주소 검색 열려 있는 동안 뒷 페이지 스크롤 차단(공용 KASHALock)
  React.useEffect(() => {
    if (!pcOpen || !window.KASHALock) return;
    window.KASHALock.lock();
    return () => window.KASHALock.unlock();
  }, [pcOpen]);

  if (!user) {
    return (
      <div style={{ maxWidth: 460, margin: "0 auto", padding: "80px 24px", textAlign: "center" }}>
        <div style={{ width: 60, height: 60, borderRadius: 16, background: "var(--blue-50)", color: "var(--blue-500)", display: "inline-flex", alignItems: "center", justifyContent: "center" }}><Icon name="user" size={28} /></div>
        <h2 style={{ marginTop: 18, fontSize: "var(--text-title-2)" }}>로그인이 필요해요</h2>
        <p style={{ marginTop: 10, color: "var(--text-secondary)", fontSize: 15 }}>굿즈 구매는 로그인 후 이용할 수 있어요.</p>
        <div style={{ marginTop: 20 }}><Button variant="primary" onClick={() => onNavigate("mypage")}>로그인하기</Button></div>
      </div>
    );
  }
  if (!f || lines.length === 0) {
    return <div style={{ maxWidth: 640, margin: "0 auto", padding: "80px 24px", textAlign: "center" }}><h2 style={{ fontSize: "var(--text-title-2)" }}>장바구니가 비어 있어요</h2><div style={{ marginTop: 20 }}><Button variant="primary" onClick={() => onNavigate("goods")}>굿즈 목록</Button></div></div>;
  }

  // 주문자 정보는 계정과 동기화(변경 불가) — 이름·연락처가 없으면 결제 전에 프로필 완성 유도
  const profileIncomplete = !((user.name || "").trim()) || !((user.phone || "").trim());
  if (profileIncomplete) {
    return (
      <div style={{ maxWidth: 460, margin: "0 auto", padding: "72px 24px", textAlign: "center" }}>
        <div style={{ width: 60, height: 60, borderRadius: 16, background: "var(--yellow-50)", color: "var(--yellow-600)", display: "inline-flex", alignItems: "center", justifyContent: "center" }}><Icon name="user" size={28} /></div>
        <h2 style={{ marginTop: 18, fontSize: "var(--text-title-2)" }}>프로필을 먼저 완성해 주세요</h2>
        <p style={{ marginTop: 10, color: "var(--text-secondary)", fontSize: 15, lineHeight: 1.6 }}>주문자 정보는 계정 정보와 동일하게 처리돼요. 마이페이지에서 <b>이름</b>과 <b>연락처</b>를 등록한 뒤 다시 결제해 주세요.</p>
        <div style={{ marginTop: 20, display: "flex", gap: 10 }}>
          <Button variant="secondary" fullWidth onClick={() => onNavigate("goodsDetail", { formId: f.id })}>돌아가기</Button>
          <Button variant="primary" fullWidth onClick={() => onNavigate("mypage")}>프로필 완성하기</Button>
        </div>
      </div>
    );
  }

  const openPostcode = async () => {
    const ok = await loadDaumPostcode();
    if (!ok || !window.daum || !window.daum.Postcode) { setErr("주소 검색을 불러오지 못했어요. 잠시 후 다시 시도해 주세요."); return; }
    setErr(""); setPcOpen(true);
  };

  const submit = () => {
    setErr("");
    if (needShip && !roadAddr.trim()) { setErr("배송지를 검색해 주소를 입력해 주세요."); return; }
    const fullAddr = needShip ? (roadAddr + (addrDetail.trim() ? " " + addrDetail.trim() : "") + (zonecode ? " (" + zonecode + ")" : "")) : "";
    setBusy(true);
    // 환불 계좌를 입력했으면 다음을 위해 프로필에도 저장(선택)
    if (refund.bank || refund.number || refund.holder) { try { DB.updateCurrentUser({ refundAccount: refund }); } catch (e) {} }
    DB.createGoodsOrder({
      formId: f.id, items: lines.map((l) => ({ productId: l.p.id, qty: l.qty, shipType: chosenShip(l) })), address: fullAddr,
      buyerName: user.name, buyerPhone: user.phone, buyerEmail: user.email,
      refund: { bank: refund.bank.trim(), number: refund.number.trim(), holder: refund.holder.trim() },
    }).then((r) => {
      setBusy(false);
      if (r && r.error) {
        setErr({ CLOSED: "판매가 마감되었어요.", NOT_OPEN: "아직 오픈 전이에요.", UNAVAILABLE: "지금은 구매할 수 없어요.", OUT_OF_STOCK: "재고가 부족한 상품이 있어요.", SOLD_OUT: "품절된 상품이 있어요.", ADDRESS_REQUIRED: "배송지를 입력해 주세요.", LIMIT_EXCEEDED: "1인당 구매 제한을 넘었어요.", EMPTY_CART: "장바구니가 비어 있어요.", NO_BACKEND: "로컬 개발에선 주문이 안 돼요(배포 후).", }[r.error] || ("주문 실패: " + r.error));
        return;
      }
      setDone({ order: r.order, deposit: r.deposit });
      window.KASHASuccess && window.KASHASuccess.show({ title: "주문이 접수됐어요", message: "안내된 계좌로 입금해 주세요." });
    });
  };

  if (done) {
    const d = done.deposit || {};
    return (
      <div style={{ maxWidth: 560, margin: "0 auto", padding: "48px 24px 90px" }}>
        <div style={{ textAlign: "center" }}>
          <div style={{ width: 60, height: 60, borderRadius: "50%", background: "var(--green-50)", color: "var(--green-500)", display: "inline-flex", alignItems: "center", justifyContent: "center" }}><Icon name="check" size={30} /></div>
          <h1 style={{ marginTop: 16, fontSize: "var(--text-title-2)" }}>주문 접수 완료</h1>
          <p style={{ marginTop: 8, color: "var(--text-secondary)", fontSize: 15 }}>주문번호 <b>{done.order.id}</b> · 아래 계좌로 <b>{won(done.order.amount)}원</b>을 입금해 주세요. 결제 영수증을 이메일로 보냈어요.</p>
        </div>
        <Card style={{ marginTop: 22 }}>
          {(done.order.items || []).map((it, i) => <Row key={i} label={it.productName + " × " + it.qty} value={won(it.subtotal) + "원"} />)}
          <div style={{ height: 1, background: "var(--border-subtle)", margin: "12px 0" }} />
          <Row label="총 결제금액" value={won(done.order.amount) + "원"} strong />
        </Card>
        {done.order.perks && done.order.perks.length > 0 && (
          <div style={{ marginTop: 14, padding: "14px 16px", borderRadius: 14, background: "var(--green-50)", border: "1px solid var(--green-200, var(--green-100))" }}>
            <div style={{ fontSize: 12.5, fontWeight: 700, color: "var(--green-600)", marginBottom: 4 }}>함께 받는 특전</div>
            <div style={{ fontSize: 14, fontWeight: 700, color: "var(--text-strong)" }}>{done.order.perks.map((k) => k.name).join(", ")}</div>
          </div>
        )}
        <Card style={{ marginTop: 14 }}>
          <Row label="입금 은행" value={d.bank} />
          <Row label="계좌번호" value={d.number} strong />
          <Row label="예금주" value={d.holder} />
        </Card>
        <p style={{ marginTop: 12, fontSize: 12.5, color: "var(--text-tertiary)", textAlign: "center" }}>입금자명을 주문자 이름과 동일하게 보내주시면 확인이 빨라요. 구매 내역은 마이페이지에서 확인할 수 있어요.</p>
        <div style={{ marginTop: 20, display: "flex", gap: 10 }}>
          <Button variant="secondary" fullWidth onClick={() => onNavigate("goods")}>굿즈 더 보기</Button>
          <Button variant="primary" fullWidth onClick={() => onNavigate("mypage")}>마이페이지</Button>
        </div>
      </div>
    );
  }

  return (
    <div style={{ maxWidth: 1000, margin: "0 auto", padding: "40px 24px 90px" }}>
      <style>{`
        .kg-pay-grid{display:grid;grid-template-columns:minmax(0,1fr) 340px;gap:20px;align-items:start;margin-top:22px}
        .kg-pay-main{display:flex;flex-direction:column;gap:16px;min-width:0}
        .kg-pay-rail{position:sticky;top:20px;display:flex;flex-direction:column;gap:12px}
        .kg-sec{background:var(--gray-0);border:1px solid var(--border-subtle);border-radius:18px;box-shadow:var(--shadow-sm);overflow:hidden}
        .kg-sec-head{display:flex;align-items:flex-start;gap:11px;padding:15px 18px 0}
        .kg-sec-chip{width:34px;height:34px;border-radius:11px;background:var(--gray-100);color:var(--ink);display:flex;align-items:center;justify-content:center;flex-shrink:0}
        .kg-sec-title{font-size:15px;font-weight:800;color:var(--text-strong);letter-spacing:-0.01em}
        .kg-sec-desc{font-size:12.5px;color:var(--text-tertiary);margin-top:3px;line-height:1.5}
        .kg-sec-body{padding:14px 18px 18px}
        .kg-line{display:flex;align-items:center;gap:12px;padding:11px 0;border-bottom:1px dashed var(--border-subtle)}
        .kg-line:last-of-type{border-bottom:none}
        .kg-idx{width:22px;height:22px;border-radius:7px;background:var(--gray-100);color:var(--text-tertiary);font-size:11.5px;font-weight:800;display:flex;align-items:center;justify-content:center;flex-shrink:0}
        .kg-seg{position:relative;display:flex;gap:6px;background:var(--gray-100);padding:5px;border-radius:14px}
        /* 슬라이딩 활성 표시자 - 실물배송↔실물전달 전환 시 스프링으로 부드럽게 미끄러져요(transform 만) */
        .kg-seg-ind{position:absolute;top:5px;bottom:5px;left:5px;width:calc((100% - 10px - (var(--seg-n) - 1)*6px)/var(--seg-n));border-radius:10px;background:var(--gray-0);box-shadow:var(--shadow-sm);transform:translateX(calc(var(--seg-i)*(100% + 6px)));transition:transform var(--dur-base) var(--ease-spring);pointer-events:none;z-index:0}
        .kg-seg-btn{position:relative;z-index:1;flex:1;padding:11px 8px;border-radius:10px;border:none;background:transparent;color:var(--text-secondary);font-family:var(--font-sans);font-size:13.5px;font-weight:700;cursor:pointer;transition:color var(--dur-fast) var(--ease-ios)}
        .kg-seg-btn[aria-pressed="true"]{color:var(--text-strong)}
        .kg-seg-btn:active{transform:scale(0.97)}
        /* 배송지 리빌 - grid 0fr→1fr 로 부드럽게 펼침(레이아웃 애니 회피), 인디고 액센트로 색 다르게 */
        .kg-addr-reveal{display:grid;grid-template-rows:0fr;transition:grid-template-rows var(--dur-base) var(--ease-ios)}
        .kg-addr-reveal.open{grid-template-rows:1fr}
        .kg-addr-clip{overflow:hidden;min-height:0}
        .kg-addr-inner{margin-top:14px;padding:14px;border:1px solid var(--track-200);border-left:3px solid var(--track-500);border-radius:12px;background:var(--gray-0);opacity:0;transform:translateY(-6px);transition:opacity var(--dur-base) var(--ease-out) 60ms,transform var(--dur-base) var(--ease-out) 60ms}
        .kg-addr-reveal.open .kg-addr-inner{opacity:1;transform:none}
        .kg-idrow{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:10px 0;border-bottom:1px solid var(--border-subtle)}
        .kg-idrow:last-child{border-bottom:none}
        .kg-idlabel{font-size:12px;color:var(--text-tertiary);font-weight:600;flex-shrink:0}
        .kg-idval{font-size:14px;font-weight:700;color:var(--text-strong);text-align:right;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
        .kg-sum-row{display:flex;justify-content:space-between;align-items:baseline;gap:12px;padding:7px 0}
        @media(max-width:860px){.kg-pay-grid{grid-template-columns:1fr}.kg-pay-rail{position:static}}
        @media (prefers-reduced-motion: reduce){.kg-seg-btn{transition:none}.kg-seg-btn:active{transform:none}.kg-seg-ind{transition:none}.kg-addr-reveal{transition:none}.kg-addr-inner{transition:none}}
      `}</style>

      <button onClick={() => onNavigate("goodsDetail", { formId: f.id })} style={{ border: "none", background: "transparent", color: "var(--text-tertiary)", fontSize: 14, cursor: "pointer", fontFamily: "var(--font-sans)", display: "flex", alignItems: "center", gap: 6, marginBottom: 18 }}><Icon name="chevronLeft" size={18} /> 상품으로</button>
      <h1 style={{ fontSize: "var(--text-title-2)", letterSpacing: "var(--tracking-title)" }}>굿즈 결제</h1>
      <div style={{ marginTop: 6, fontSize: 13.5, color: "var(--text-tertiary)" }}>{f.name} · {f.cosplayerName}</div>

      <div className="kg-pay-grid">
        <div className="kg-pay-main">
          {/* 주문 상품: 번호 매긴 영수증 스타일 */}
          <PaySection icon="image" title="주문 상품" desc={"총 " + totalQty + "개를 담았어요"}>
            {lines.map((l, i) => (
              <div key={l.p.id} className="kg-line">
                <span className="kg-idx">{i + 1}</span>
                <div style={{ width: 42, height: 56, borderRadius: 10, overflow: "hidden", background: "var(--gray-100)", flexShrink: 0 }}>{(l.p.images || [])[0] ? <img src={l.p.images[0]} alt="" style={{ width: "100%", height: "100%", objectFit: "cover" }} /> : null}</div>
                <div style={{ flex: 1, minWidth: 0 }}>
                  <div style={{ fontSize: 14.5, fontWeight: 700, color: "var(--text-strong)", overflow: "hidden", textOverflow: "ellipsis", whiteSpace: "nowrap" }}>{l.p.name}</div>
                  <div style={{ fontSize: 12.5, color: "var(--text-tertiary)" }}>{won(l.p.price)}원 × {l.qty}</div>
                </div>
                <div style={{ fontSize: 14.5, fontWeight: 800, flexShrink: 0 }}>{won(l.subtotal)}원</div>
              </div>
            ))}
            <div style={{ display: "flex", justifyContent: "space-between", alignItems: "baseline", paddingTop: 14, marginTop: 2 }}>
              <span style={{ fontSize: 13, color: "var(--text-secondary)", fontWeight: 600 }}>상품 합계</span>
              <span style={{ fontSize: 18, fontWeight: 800, color: "var(--text-strong)" }}>{won(total)}원</span>
            </div>
          </PaySection>

          {/* 받는 방식: 세그먼트 컨트롤(주문 전체 단위) */}
          {commonShip.length >= 2 && (
            <PaySection icon="arrowRight" title="받는 방식" desc="주문 전체를 이 방식으로 받아요. 실물 배송을 고르면 배송지를 입력해요.">
              <div className="kg-seg" role="group" aria-label="받는 방식" style={{ "--seg-n": commonShip.length, "--seg-i": Math.max(0, commonShip.indexOf(effOrderShip)) }}>
                <i className="kg-seg-ind" aria-hidden="true" />
                {commonShip.map((v) => (
                  <button key={v} type="button" className="kg-seg-btn" aria-pressed={effOrderShip === v} onClick={() => setOrderShip(v)}>{SHIP_LABEL[v] || v}</button>
                ))}
              </div>
            </PaySection>
          )}

          {/* 특전: 이번 주문으로 받는 특전을 실시간으로 표시 */}
          <window.GoodsPerkBoard form={f} cart={cartMap} amount={total} />

          {/* 주문자 정보: 계정과 동기화(변경 불가) + 배송지 */}
          <PaySection icon="user" title="주문자 정보" desc="계정 정보와 동일하게 처리돼요. 변경은 마이페이지에서 할 수 있어요.">
            <div style={{ display: "flex", alignItems: "center", gap: 12, padding: "2px 0 8px" }}>
              <div style={{ width: 46, height: 46, borderRadius: "50%", background: "var(--blue-50)", color: "var(--blue-600)", display: "flex", alignItems: "center", justifyContent: "center", fontSize: 18, fontWeight: 800, flexShrink: 0 }}>{((user.name || "").trim().charAt(0) || "K").toUpperCase()}</div>
              <div style={{ minWidth: 0 }}>
                <div style={{ fontSize: 15, fontWeight: 800, color: "var(--text-strong)" }}>{user.name}</div>
                <div style={{ fontSize: 12.5, color: "var(--text-tertiary)", overflow: "hidden", textOverflow: "ellipsis", whiteSpace: "nowrap" }}>{user.email}</div>
              </div>
            </div>
            <div className="kg-idrow"><span className="kg-idlabel">연락처</span><span className="kg-idval">{user.phone}</span></div>
            <div className="kg-idrow"><span className="kg-idlabel">영수증</span><span className="kg-idval">{user.email}</span></div>

            {/* 실물 배송 선택 시 배송지 입력이 인디고 액센트로 부드럽게 펼쳐져요(색 다른 리빌). ship 가능 주문이면 래퍼는 유지하고 open 만 토글해 닫힘 모션까지 재생 */}
            {(commonShip.indexOf("ship") >= 0 || needShip) && (
              <div className={"kg-addr-reveal" + (needShip ? " open" : "")} aria-hidden={!needShip}>
                <div className="kg-addr-clip">
                  <div className="kg-addr-inner">
                    <div style={{ display: "flex", alignItems: "center", gap: 7, marginBottom: 10 }}>
                      <Icon name="mapPin" size={15} color="var(--track-600)" />
                      <span style={{ fontSize: 13.5, fontWeight: 800, color: "var(--track-700)" }}>배송지</span>
                      {prefilledAddr && <span style={{ fontSize: 11.5, fontWeight: 700, color: "var(--track-700)", background: "var(--track-50)", padding: "2px 8px", borderRadius: 999 }}>저장된 주소</span>}
                    </div>
                    <div style={{ display: "flex", gap: 8 }}>
                      <input value={zonecode} readOnly placeholder="우편번호" style={Object.assign({}, fieldStyle, { maxWidth: 120, background: "var(--gray-50)" })} />
                      <Button variant="secondary" onClick={openPostcode}>주소 검색</Button>
                    </div>
                    <input value={roadAddr} readOnly placeholder="도로명 주소" style={Object.assign({}, fieldStyle, { marginTop: 8, background: "var(--gray-50)" })} />
                    <input id="kg-addr-detail" value={addrDetail} onChange={(e) => setAddrDetail(e.target.value)} placeholder="상세주소 (동·호수 등)" style={Object.assign({}, fieldStyle, { marginTop: 8 })} />
                  </div>
                </div>
              </div>
            )}
          </PaySection>

          {/* 환불 수령 계좌: 취소·환불 시 송금 대상(선택 입력, 저장됨) */}
          <PaySection icon="bookmark" title="환불 수령 계좌" desc="주문이 취소되면 이 계좌로 환불해 드려요. 입력하면 다음 결제에도 자동으로 채워져요.">
            <div style={{ display: "flex", flexDirection: "column", gap: 10 }}>
              <Input label="은행" value={refund.bank} onChange={(e) => setRefundK("bank", e.target.value)} placeholder="예: 카카오뱅크" />
              <Input label="계좌번호" value={refund.number} onChange={(e) => setRefundK("number", e.target.value)} placeholder="'-' 없이 입력" />
              <Input label="예금주" value={refund.holder} onChange={(e) => setRefundK("holder", e.target.value)} placeholder="예금주명" />
            </div>
          </PaySection>
        </div>

        {/* 결제 요약 레일: 데스크톱에서 sticky, 모바일에서 하단으로 흐름 */}
        <div className="kg-pay-rail">
          <div className="kg-sec" style={{ boxShadow: "var(--shadow-lg)" }}>
            <div className="kg-sec-body" style={{ padding: "18px 18px 20px" }}>
              <div style={{ fontSize: 13, fontWeight: 800, color: "var(--text-secondary)", marginBottom: 12 }}>결제 요약</div>
              <div className="kg-sum-row"><span style={{ fontSize: 13.5, color: "var(--text-tertiary)" }}>상품 {totalQty}개</span><span style={{ fontSize: 14, fontWeight: 700, color: "var(--text-strong)" }}>{won(total)}원</span></div>
              <div className="kg-sum-row"><span style={{ fontSize: 13.5, color: "var(--text-tertiary)" }}>받는 방식</span><span style={{ fontSize: 14, fontWeight: 700, color: "var(--text-strong)" }}>{SHIP_LABEL[effOrderShip] || SHIP_LABEL[chosenShip(lines[0])] || "실물 배송"}</span></div>
              <div style={{ height: 1, background: "var(--border-subtle)", margin: "12px 0" }} />
              <div style={{ display: "flex", justifyContent: "space-between", alignItems: "baseline" }}>
                <span style={{ fontSize: 14, fontWeight: 700, color: "var(--text-secondary)" }}>총 결제금액</span>
                <span style={{ fontSize: 24, fontWeight: 800, color: "var(--ink)", letterSpacing: "-0.02em" }}>{won(total)}원</span>
              </div>

              {/* 결제 수단: 계좌이체 단일 */}
              <div style={{ marginTop: 16, padding: "13px 14px", borderRadius: 14, border: "1.5px solid var(--ink)", background: "var(--gray-0)", display: "flex", alignItems: "center", gap: 10 }}>
                <span style={{ width: 18, height: 18, borderRadius: "50%", border: "5px solid var(--ink)", flexShrink: 0 }} />
                <div><div style={{ fontSize: 14, fontWeight: 800, color: "var(--text-strong)" }}>계좌이체</div><div style={{ fontSize: 12, color: "var(--text-tertiary)", marginTop: 1 }}>주문 후 안내되는 계좌로 입금해요.</div></div>
              </div>

              {err && <div style={{ marginTop: 12, color: "var(--red-500)", fontSize: 13, lineHeight: 1.5 }}>{err}</div>}
              <div style={{ marginTop: 14 }}><Button variant="primary" size="lg" fullWidth disabled={busy} onClick={submit}>{busy ? "주문 접수 중…" : "계좌이체로 결제하기"}</Button></div>
              <p style={{ marginTop: 10, fontSize: 11.5, color: "var(--text-tertiary)", textAlign: "center", lineHeight: 1.5 }}>결제하기를 누르면 입금 계좌를 안내해 드려요.</p>
            </div>
          </div>
        </div>
      </div>

      {/* 도로명 주소 검색: body 로 포털해 변형 조상을 탈출(스크림이 전체 화면을 덮음) + 전역 모달 모션 */}
      {pcRender && ReactDOM.createPortal(
        <div style={{ position: "fixed", inset: 0, zIndex: 2200, display: "flex", alignItems: "center", justifyContent: "center", padding: 20, pointerEvents: pcActive ? "auto" : "none" }}>
          <div onClick={() => setPcOpen(false)} className={"kasha-modal-scrim" + (pcActive ? " open" : "")} style={{ position: "absolute", inset: 0, background: "rgba(15,17,21,0.5)" }} />
          <div onClick={(e) => e.stopPropagation()} className={"kasha-modal-panel" + (pcActive ? " open" : "")} style={{ position: "relative", width: "100%", maxWidth: 460, background: "var(--gray-0)", borderRadius: 18, overflow: "hidden", boxShadow: "var(--shadow-lg)" }}>
            <div style={{ display: "flex", alignItems: "center", justifyContent: "space-between", padding: "14px 16px", borderBottom: "1px solid var(--border-subtle)" }}>
              <span style={{ fontSize: 15, fontWeight: 800, color: "var(--text-strong)" }}>주소 검색</span>
              <button onClick={() => setPcOpen(false)} aria-label="닫기" style={{ border: "none", background: "transparent", cursor: "pointer", color: "var(--text-tertiary)", display: "flex" }}><Icon name="x" size={20} /></button>
            </div>
            <div ref={pcRef} style={{ width: "100%", height: 480 }} />
          </div>
        </div>,
        document.body
      )}
    </div>
  );
}
const fieldStyle = { width: "100%", padding: "12px 14px", borderRadius: "var(--radius-input)", border: "1.5px solid var(--border-default)", fontFamily: "var(--font-sans)", fontSize: 15, boxSizing: "border-box", color: "var(--text-strong)" };
function Row({ label, value, strong }) {
  return <div style={{ display: "flex", justifyContent: "space-between", alignItems: "center", padding: "6px 0" }}><span style={{ fontSize: 13.5, color: "var(--text-tertiary)" }}>{label}</span><span style={{ fontSize: 14.5, fontWeight: strong ? 800 : 600, color: "var(--text-strong)" }}>{value}</span></div>;
}
// 결제 화면 공용 섹션 카드: 아이콘 칩 헤더 + 설명 + 본문(각 솔리드에 일관된 아이덴티티 부여)
function PaySection({ icon, title, desc, children }) {
  const { Icon } = window.DS;
  return (
    <section className="kg-sec">
      <div className="kg-sec-head">
        <span className="kg-sec-chip"><Icon name={icon} size={18} /></span>
        <div style={{ flex: 1, minWidth: 0 }}>
          <div className="kg-sec-title">{title}</div>
          {desc && <div className="kg-sec-desc">{desc}</div>}
        </div>
      </div>
      <div className="kg-sec-body">{children}</div>
    </section>
  );
}
window.GoodsPayScreen = GoodsPayScreen;
