﻿/* =========================================================
   pages_browse.jsx — Landing, Hotels list, Hotel detail
   ========================================================= */

/* ---------------- landing ---------------- */
function LandingPage(){
  const { hotels } = useStore();
  const featured = [...hotels].sort((a,b)=>b.depositRatio-a.depositRatio).slice(0,3);
  return (
    <div className="page">
      {/* hero */}
      <section style={{position:"relative", overflow:"hidden"}}>
        <Photo seed="jeju-ocean-cliff" w={1800} h={1000} style={{position:"absolute",inset:0,background:"linear-gradient(135deg, oklch(0.45 0.11 250), oklch(0.30 0.10 264) 55%, oklch(0.40 0.09 200))"}} />
        <div style={{position:"absolute",inset:0,background:"linear-gradient(100deg, oklch(0.24 0.05 266 / .82) 0%, oklch(0.28 0.06 262 / .55) 50%, oklch(0.28 0.06 262 / .12) 100%)"}}></div>
        <div className="wrap wrap-wide" style={{position:"relative", padding:"108px 28px 108px"}}>
          <div style={{maxWidth:680, color:"#fff"}}>
            <span className="badge" style={{background:"oklch(1 0 0 / .16)",color:"#fff",backdropFilter:"blur(6px)",marginBottom:20}}>
              <Icon name="shieldCheck" size={14}/>보증금으로 안심하는 호텔 예약
            </span>
            <h1 className="display d1" style={{color:"#fff", textWrap:"balance"}}>예약금을 호텔이 아니라,<br/>약속에 맡기세요.</h1>
            <p className="lead" style={{color:"oklch(0.93 0.015 250)", maxWidth:560, marginTop:18}}>
              호텔이 회원님의 예약금만큼 <b style={{color:"#fff"}}>보증금을 함께 맡겨</b> 둡니다.
              문제가 생기면 복잡한 절차 없이 곧바로 전액을 돌려받을 수 있어요.
            </p>
            <div className="row gap-12" style={{marginTop:26}}>
              <button className="btn btn-primary btn-lg" onClick={()=>navigate("/hotels")}>신뢰 호텔 둘러보기<Icon name="arrowRight" size={18}/></button>
              <button className="btn btn-lg" onClick={()=>navigate("/connect")} style={{background:"oklch(1 0 0 / .14)",color:"#fff",backdropFilter:"blur(6px)"}}><Icon name="wallet" size={18}/>지갑 연결</button>
            </div>
          </div>
        </div>
      </section>

      {/* how it works */}
      <section className="wrap wrap-wide section" style={{paddingTop:72}}>
        <div className="row between wrap-row gap-16" style={{alignItems:"flex-end",marginBottom:28}}>
          <div>
            <span className="eyebrow">신뢰 메커니즘</span>
            <h2 className="display d2" style={{marginTop:8}}>보증금이 곧 신뢰 지표입니다</h2>
          </div>
          <p className="muted" style={{maxWidth:420}}>호텔이 더 많은 보증금을 예치할수록, 호텔은 약속을 지킬 이유가 커집니다. 그래서 보증금 비율이 높은 호텔이 상단에 노출됩니다.</p>
        </div>
        <div className="grid-cards" style={{gridTemplateColumns:"repeat(3,1fr)"}}>
          {[
            ["1","예약금 맡기기","회원님이 예약금을 맡기면, 호텔도 그 비율만큼 보증금을 함께 맡겨 둡니다.","coins"],
            ["2","이용 & 체크인","호텔 도착 후 직접 체크인을 누르고, 이용을 마치면 체크아웃을 눌러 마무리합니다.","key"],
            ["3","자동 정산 / 보상","정상 완료 시 호텔로 정산되고, 문제 신고 시 예약금+보증금 전액이 즉시 회원님께 환급됩니다.","shieldCheck"],
          ].map(([n,t,d,ic])=>(
            <div className="card card-pad col gap-12" key={n}>
              <div className="row between">
                <span className="logo-mark" style={{width:40,height:40,borderRadius:12,background:"var(--clay-soft)"}}><Icon name={ic} size={20} style={{color:"var(--clay-ink)"}}/></span>
                <span className="serif" style={{fontSize:34,color:"var(--line-2)",fontWeight:700,whiteSpace:"nowrap"}}>0{n}</span>
              </div>
              <div className="h-md">{t}</div>
              <div className="small muted" style={{lineHeight:1.6}}>{d}</div>
            </div>
          ))}
        </div>
      </section>

      {/* featured trusted hotels */}
      <section className="wrap wrap-wide" style={{paddingBottom:64}}>
        <div className="row between" style={{marginBottom:22}}>
          <div className="row gap-10" style={{alignItems:"baseline"}}>
            <h2 className="display d3">신뢰 호텔 추천</h2>
            <span className="badge badge-green"><Icon name="shieldCheck" size={13}/>보증금 비율 상위</span>
          </div>
          <a className="link-clay row gap-4 small" onClick={()=>navigate("/hotels")} style={{cursor:"pointer"}}>전체 보기<Icon name="arrowRight" size={15}/></a>
        </div>
        <div className="grid-cards" style={{gridTemplateColumns:"repeat(3,1fr)"}}>
          {featured.map(h=> <HotelCard key={h.id} hotel={h} />)}
          {featured.length===0 && (
            <div className="card card-pad col center gap-12" style={{gridColumn:"1 / -1",padding:"48px",textAlign:"center"}}>
              <Icon name="building" size={30} style={{color:"var(--faint)"}}/>
              <div className="h-md">아직 등록된 호텔이 없습니다</div>
              <div className="small muted" style={{maxWidth:340}}>호텔 관리자로 접속해 첫 호텔을 등록하면 여기에 노출됩니다.</div>
              <button className="btn btn-soft btn-sm" onClick={()=>navigate("/hotel/dashboard")}><Icon name="building" size={15}/>호텔 등록하러 가기</button>
            </div>
          )}
        </div>
      </section>

      {/* dispute reassurance band */}
      <section className="wrap wrap-wide" style={{paddingBottom:72}}>
        <div className="card" style={{padding:0, overflow:"hidden", display:"grid", gridTemplateColumns:"1.1fr 1fr"}}>
          <div className="col gap-16" style={{padding:"44px 44px"}}>
            <span className="badge badge-clay" style={{alignSelf:"flex-start"}}><Icon name="bolt" size={13}/>분쟁 즉시 집행</span>
            <h3 className="display d2">고객센터를 기다릴 필요가<br/>없습니다.</h3>
            <p className="muted" style={{lineHeight:1.7}}>호텔 귀책으로 문제가 발생하면 "문제 발생 신고" 한 번으로 예약금과 호텔 보증금 전액이 회원님 지갑으로 즉시 이체됩니다. 중개자도, 대기시간도 없습니다.</p>
            <div className="chip-row">
              <span className="tag"><Icon name="check" size={14} style={{color:"var(--green)"}}/>복잡한 승인 절차 없음</span>
              <span className="tag"><Icon name="check" size={14} style={{color:"var(--green)"}}/>거래 내역 확인 가능</span>
              <span className="tag"><Icon name="check" size={14} style={{color:"var(--green)"}}/>예약금+보증금 전액</span>
            </div>
          </div>
          <Photo seed="bali-ubud" w={900} h={700} style={{minHeight:340,background:"linear-gradient(150deg, oklch(0.55 0.10 200), oklch(0.40 0.10 250))"}} />
        </div>
      </section>

      {/* demo disclaimer */}
      <section className="wrap wrap-wide" style={{paddingBottom:64}}>
        <div className="row gap-10" style={{justifyContent:"center",textAlign:"center",color:"var(--faint)",fontSize:12.5,lineHeight:1.6,maxWidth:680,margin:"0 auto"}}>
          <Icon name="info" size={15} style={{flex:"none",marginTop:1}}/>
          <span>본 페이지는 실제 서비스가 아닌 디자인 시연용 데모입니다. 호텔 정보·가격·후기·거래 내역은 모두 가상의 예시이며, 실제 결제나 블록체인 거래는 이루어지지 않습니다.</span>
        </div>
      </section>
    </div>
  );
}

/* ---------------- hotels list ---------------- */
function HotelsPage(){
  const { hotels } = useStore();
  const [sort, setSort] = useState("deposit");
  const [maxPrice, setMaxPrice] = useState(0.15);
  const [minRatio, setMinRatio] = useState(0);

  let list = hotels.filter(h=> { const p=hotelPrice(h); return (p==null || p<=maxPrice) && h.depositRatio>=minRatio; });
  list = [...list].sort((a,b)=>{
    if(sort==="deposit") return b.depositRatio-a.depositRatio;
    if(sort==="price") return (hotelPrice(a)??1e9)-(hotelPrice(b)??1e9);
    return 0;
  });

  return (
    <div className="page wrap wrap-wide" style={{padding:"36px 28px 64px"}}>
      <div className="row between wrap-row gap-12" style={{marginBottom:8}}>
        <div>
          <span className="eyebrow">신뢰 호텔</span>
          <h1 className="display d2" style={{marginTop:6}}>호텔 둘러보기</h1>
          <p className="muted small" style={{marginTop:6}}>보증금 비율이 높은 호텔이 위쪽에 노출됩니다. 마음에 드는 호텔을 눌러 자세히 살펴보세요.</p>
        </div>
      </div>

      <div style={{display:"grid", gridTemplateColumns:"260px 1fr", gap:28, marginTop:24, alignItems:"start"}}>
        {/* filters */}
        <aside className="card card-pad col gap-20" style={{position:"sticky", top:"calc(var(--header-h) + 20px)"}}>
          <div className="row gap-8" style={{whiteSpace:"nowrap"}}><Icon name="sliders" size={17} style={{color:"var(--clay)"}}/><b>필터 &amp; 정렬</b></div>

          <div className="field">
            <label>정렬 기준</label>
            <div className="col gap-6">
              {[["deposit","보증금 비율 높은순"],["price","가격 낮은순"]].map(([k,l])=>(
                <button key={k} className={"btn btn-sm "+(sort===k?"btn-soft":"btn-line")} style={{justifyContent:"flex-start"}} onClick={()=>setSort(k)}>
                  {sort===k && <Icon name="check" size={15}/>}{l}
                </button>
              ))}
            </div>
          </div>

          <div className="field">
            <label>1박 최대 가격 · <b className="mono">{fmtEth(maxPrice)} ETH</b></label>
            <input type="range" min="0.03" max="0.15" step="0.005" value={maxPrice} onChange={e=>setMaxPrice(+e.target.value)} style={{accentColor:"var(--clay)"}} />
          </div>

          <div className="field">
            <label>최소 보증금 비율 · <b className="mono" style={{color:"var(--green-deep)"}}>{minRatio}%</b></label>
            <input type="range" min="0" max="150" step="5" value={minRatio} onChange={e=>setMinRatio(+e.target.value)} style={{accentColor:"var(--green)"}} />
            <div className="row between xs muted" style={{whiteSpace:"nowrap"}}><span>전체</span><span>최고 신뢰</span></div>
          </div>

          <hr className="hairline"/>
          <div className="panel" style={{padding:"12px 14px"}}>
            <div className="row gap-8 xs" style={{fontWeight:700,color:"var(--green-deep)",whiteSpace:"nowrap"}}><Icon name="shieldCheck" size={14}/>신뢰 등급 안내</div>
            <div className="col gap-6" style={{marginTop:8}}>
              {[[145,"최고 신뢰"],[120,"높은 신뢰"],[95,"신뢰"],[70,"기본"]].map(([r,l])=>(
                <div className="row between xs" key={r}><TierChip ratio={r}/></div>
              ))}
            </div>
          </div>
        </aside>

        {/* results */}
        <div>
          <div className="row between" style={{marginBottom:16}}>
            <span className="muted small" style={{whiteSpace:"nowrap"}}><b style={{color:"var(--ink)"}}>{list.length}</b>개 호텔</span>
            <span className="badge badge-green"><Icon name="shieldCheck" size={13}/>보증금 비율순 정렬</span>
          </div>
          <div className="grid-cards">
            {list.map(h=> <HotelCard key={h.id} hotel={h} />)}
          </div>
          {hotels.length===0 ? (
            <div className="card card-pad col center gap-12" style={{padding:60,textAlign:"center"}}>
              <Icon name="building" size={32} style={{color:"var(--faint)"}}/>
              <div className="h-md">아직 등록된 호텔이 없습니다</div>
              <div className="small muted" style={{maxWidth:340}}>호텔 관리자로 접속해 호텔을 등록하면 여기에 표시됩니다.</div>
              <button className="btn btn-soft btn-sm" onClick={()=>navigate("/hotel/dashboard")}><Icon name="building" size={15}/>호텔 등록하러 가기</button>
            </div>
          ) : list.length===0 && <div className="card card-pad center muted" style={{padding:60}}>조건에 맞는 호텔이 없습니다.</div>}
        </div>
      </div>
    </div>
  );
}
/* ---------------- hotel detail ---------------- */
function HotelDetailPage({ id }){
  const hotel = getHotel(id);
  const rooms = hotel ? hotel.rooms.filter(r => r.isAvailable !== false) : [];
  const firstListable = rooms.findIndex(roomListable);
  const [roomIdx, setRoomIdx] = useState(firstListable>=0?firstListable:0);
  if(!hotel) return <div className="wrap" style={{padding:80}}>호텔을 찾을 수 없습니다. <a className="link-clay" onClick={()=>navigate("/hotels")} style={{cursor:"pointer"}}>호텔 둘러보기</a></div>;
  const t = trustTier(hotel.depositRatio);
  const selectable = rooms[roomIdx] && roomListable(rooms[roomIdx]) ? roomIdx : (firstListable>=0?firstListable:roomIdx);
  const room = rooms[selectable] || rooms[0];
  const anyAvailable = firstListable>=0;
  const price = room ? +(room.price).toFixed(4) : 0;
  const isNew = !hotel.reviews;

  return (
    <div className="page wrap wrap-wide" style={{padding:"24px 28px 64px"}}>
      <button className="btn btn-line btn-sm" onClick={()=>navigate("/hotels")} style={{marginBottom:16}}><Icon name="chevron" size={15} style={{transform:"rotate(180deg)"}}/>호텔 목록</button>

      {/* gallery */}
      <div style={{display:"grid", gridTemplateColumns:"2fr 1fr 1fr", gridTemplateRows:"1fr 1fr", gap:10, height:380, marginBottom:44}}>
        <Photo seed={hotel.photos[0]} src={hotel.image} w={1100} h={760} rounded={18} style={{gridRow:"1 / span 2"}} />
        <Photo seed={hotel.photos[1]} w={600} h={420} rounded={14} />
        <Photo seed={hotel.photos[2]} w={600} h={420} rounded={14} />
        <Photo seed={hotel.photos[3]} w={600} h={420} rounded={14} style={{gridColumn:"2 / span 2"}} />
      </div>

      <div style={{display:"grid", gridTemplateColumns:"1fr 380px", gap:36, alignItems:"start"}}>
        {/* left: info */}
        <div className="col gap-22">
          <div>
            <div className="row gap-10 wrap-row" style={{marginBottom:8}}>
              <TierChip ratio={hotel.depositRatio} withRatio />
              {isNew
                ? <span className="badge badge-clay"><Icon name="sparkle" size={13}/>신규 등록</span>
                : <><Stars rating={hotel.rating} size={14}/><span className="muted small">· 후기 {hotel.reviews}</span></>}
            </div>
            <h1 className="display d2">{hotel.name}</h1>
            <div className="row gap-6 muted" style={{marginTop:6}}><Icon name="mapPin" size={16}/>{hotel.city}{hotel.area&&hotel.area!==hotel.city?" · "+hotel.area:""}</div>
            <p className="lead" style={{marginTop:14}}>{hotel.tagline}</p>
            <p className="muted" style={{marginTop:8,lineHeight:1.7}}>{hotel.desc}</p>
          </div>

          <hr className="hairline"/>

          {/* trust spotlight */}
          <div className="card" style={{padding:24, background:"linear-gradient(165deg, var(--green-soft), var(--surface))", border:"1px solid oklch(0.585 0.115 156 / .25)"}}>
            <div className="row gap-24 wrap-row" style={{alignItems:"center"}}>
              <TrustMeter ratio={hotel.depositRatio} size={128} />
              <div className="grow col gap-12" style={{minWidth:240}}>
                <div>
                  <div className="row gap-8"><Icon name="shieldCheck" size={18} style={{color:"var(--green-deep)"}}/><b style={{color:"var(--green-deep)"}}>{t.label} 호텔</b></div>
                  <div className="muted small" style={{marginTop:4}}>이 호텔은 예약금의 <b className="mono" style={{color:"var(--green-deep)"}}>{hotel.depositRatio}%</b>를 보증금으로 함께 맡겨 둡니다.</div>
                </div>
                <DepositViz ratio={hotel.depositRatio} />
              </div>
            </div>
          </div>

          {/* rooms */}
          <div>
            <div className="h-lg" style={{marginBottom:14}}>객실 선택</div>
            <div className="col gap-12">
              {rooms.map((r,i)=>{
                const p = +(r.price).toFixed(4);
                const on = i===selectable;
                const listable = roomListable(r);
                const booked = roomBookedCount(r);
                return (
                  <button key={i} onClick={()=>listable&&setRoomIdx(i)} disabled={!listable}
                    className="card" style={{display:"flex",gap:16,padding:14,textAlign:"left",alignItems:"center",cursor:!listable?"not-allowed":"pointer",opacity:!listable?.6:1,
                      borderColor:on?"var(--clay)":"var(--line)", boxShadow:on?"0 0 0 3px oklch(0.525 0.145 264 / .14)":"var(--sh-sm)"}}>
                    <Photo seed={r.name+hotel.id} src={r.image} w={240} h={200} rounded={12} style={{width:108,height:84,flex:"none",filter:!listable?"grayscale(.5)":"none"}} />
                    <div className="grow">
                      <div className="row gap-8"><b>{r.name}</b>{r.type&&<span className="badge badge-line xs">{r.type}</span>}{!listable?<span className="badge badge-gray xs">판매 종료</span>:on && <Icon name="check" size={15} style={{color:"var(--clay)"}}/>}</div>
                      <div className="row gap-12 muted xs" style={{marginTop:5, flexWrap:"nowrap", whiteSpace:"nowrap"}}>
                        <span className="row gap-4"><Icon name="bed" size={13}/>{r.beds}</span>
                        <span>{r.size}</span>
                        <span className="row gap-4"><Icon name="user" size={13}/>최대 {r.cap}인</span>
                      </div>
                      {r.availFrom && <div className="xs muted row gap-4" style={{marginTop:4,whiteSpace:"nowrap"}}><Icon name="calendar" size={12}/>{fmtDate(r.availFrom)}–{fmtDate(r.availTo)}{booked>0 && <span style={{color:"var(--clay-ink)"}}>· 일부 날짜 예약됨</span>}</div>}
                    </div>
                    <div className="col" style={{textAlign:"right"}}>
                      <b className="mono" style={{fontSize:17}}>{fmtEth(p)}</b>
                      <span className="xs muted" style={{whiteSpace:"nowrap"}}>ETH / 박</span>
                    </div>
                  </button>
                );
              })}
            </div>
          </div>
        </div>

        {/* right: booking summary */}
        <aside className="card card-pad col gap-16" style={{position:"sticky",top:"calc(var(--header-h) + 20px)"}}>
          <div className="row between" style={{alignItems:"baseline"}}>
            <div className="row gap-6" style={{alignItems:"baseline"}}>
              <b className="mono serif" style={{fontSize:26}}>{fmtEth(price)}</b>
              <span className="muted small" style={{whiteSpace:"nowrap"}}>ETH / 박</span>
            </div>
            {!isNew && <Stars rating={hotel.rating} />}
          </div>
          <div className="panel" style={{padding:14}}>
            <div className="row gap-8 xs" style={{fontWeight:700,color:"var(--green-deep)",marginBottom:8,whiteSpace:"nowrap"}}><Icon name="shieldCheck" size={14}/>보증금 보호 요약</div>
            <div className="kvs">
              <div className="kv"><span className="k">선택 객실</span><span className="v">{room?room.name:"-"}</span></div>
              <div className="kv"><span className="k">호텔 보증금</span><span className="v mono" style={{color:"var(--green-deep)"}}>{fmtEth(price*hotel.depositRatio/100)} ETH</span></div>
              <div className="kv"><span className="k">신뢰 등급</span><span className="v"><TierChip ratio={hotel.depositRatio}/></span></div>
            </div>
          </div>
          <button className="btn btn-primary btn-lg btn-block" disabled={!anyAvailable} onClick={()=>navigate(`/book/${hotel.id}?room=${selectable}`)}>
            <Icon name="calendar" size={18}/>{anyAvailable?"예약하기":"예약 가능한 객실 없음"}
          </button>
          <div className="row gap-8 xs muted center" style={{textAlign:"center"}}>
            <Icon name="lock" size={13}/>예약금은 이용이 끝날 때까지 안전하게 보관돼요
          </div>
        </aside>
      </div>
    </div>
  );
}

Object.assign(window, { LandingPage, HotelsPage, HotelDetailPage });
