// Shared components for dentaltourismreview.com
const { useState, useEffect, useMemo } = React;
const { destinations, procedures, clinics, reviews, forumThreads, concierges, featuredCombos } = window.DTR_DATA;

const fmtUSD = (n) => '$' + n.toLocaleString('en-US');

const Stars = ({ value, size = 13 }) => {
  const full = Math.floor(value);
  const half = value - full >= 0.5;
  return (
    <span className="stars" style={{fontSize:size,letterSpacing:'0.08em'}}>
      {'★'.repeat(full)}{half ? '⯨' : ''}{'☆'.repeat(5 - full - (half?1:0))}
    </span>
  );
};

const Tag = ({ children, variant = '', dot = false }) => (
  <span className={`tag tag-${variant}`}>
    {dot && <span className="tag-dot"></span>}
    {children}
  </span>
);

const Mark = () => <span className="dtr-mark">✚</span>;

const Wordmark = ({ size = 24, color = 'var(--ink)' }) => (
  <span style={{fontFamily:'var(--font-serif)',fontSize:size,lineHeight:1,color,letterSpacing:'-0.01em',display:'inline-flex',alignItems:'baseline'}}>
    dentaltourismreview<Mark/><span style={{fontFamily:'var(--font-mono)',fontSize:size*0.42,color:'var(--fg-3)',marginLeft:6,letterSpacing:'0.05em'}}>.com</span>
  </span>
);

const Nav = ({ route, navigate }) => {
  const [tab, setTab] = useState('all');
  return (
    <header className="nav-frost" style={{position:'sticky',top:0,zIndex:50}}>
      <div className="page" style={{display:'flex',alignItems:'center',gap:32,padding:'14px 40px'}}>
        <a href="#/" onClick={(e)=>{e.preventDefault();navigate('home');}} style={{textDecoration:'none'}}>
          <Wordmark size={20}/>
        </a>
        <nav style={{display:'flex',gap:22,flex:1,fontFamily:'var(--font-serif)',fontSize:15}}>
          {[['search','Browse'],['forum','Community'],['math','The Math'],['concierges','Concierges'],['account','Saved trips']].map(([k,l]) => (
            <a key={k} href={`#/${k}`} onClick={(e)=>{e.preventDefault();navigate(k);}} style={{color: route===k ? 'var(--ink)' : 'var(--fg-2)',textDecoration:'none',padding:'6px 12px',borderRadius:999,background: route===k ? 'linear-gradient(180deg,#FFFFFF 0%,#ECEEF1 100%)' : 'transparent',border: route===k ? '1px solid var(--silver-300)' : '1px solid transparent',boxShadow: route===k ? '0 1px 0 rgba(255,255,255,0.9) inset, 0 1px 2px rgba(15,18,22,0.04)' : 'none',transition:'all 160ms ease'}}>{l}</a>
          ))}
        </nav>
        <a href="#/write" onClick={(e)=>{e.preventDefault();navigate('write');}} className="btn btn-ghost btn-sm" style={{textDecoration:'none'}}>
          <span style={{fontFamily:'var(--font-mono)'}}>+</span> Write a review
        </a>
        <a href="#/account" onClick={(e)=>{e.preventDefault();navigate('account');}} style={{textDecoration:'none'}}>
          <span className="avatar">JD</span>
        </a>
      </div>
      {/* Region tabs — second row */}
      <div className="page" style={{display:'flex',gap:8,borderTop:'1px solid rgba(15,18,22,0.06)',padding:'10px 40px',fontFamily:'var(--font-mono)',fontSize:11,letterSpacing:'0.08em',textTransform:'uppercase'}}>
        {[['all','All destinations'],['mx','Mexican dental tourism'],['latam','Latin America'],['europe','Europe'],['asia','Asia'],['emerging','Emerging']].map(([k,l]) => (
          <button key={k} onClick={()=>setTab(k)} style={{
            border:'1px solid ' + (tab===k ? 'var(--silver-400)' : 'transparent'),
            background: tab===k ? 'linear-gradient(180deg,#FFFFFF 0%,#ECEEF1 100%)' : 'transparent',
            boxShadow: tab===k ? '0 1px 0 rgba(255,255,255,0.9) inset, 0 1px 2px rgba(15,18,22,0.05)' : 'none',
            padding:'7px 14px',cursor:'pointer',borderRadius:999,
            fontFamily:'inherit',fontSize:'inherit',letterSpacing:'inherit',textTransform:'inherit',
            color: tab===k ? 'var(--ink)' : 'var(--silver-500)',
            transition:'all 160ms ease'
          }}>{l}</button>
        ))}
      </div>
    </header>
  );
};

// Real photo destinations — Unsplash CDN (public domain hotlinkable URLs)
const DEST_PHOTOS = {
  tijuana:        'https://images.unsplash.com/photo-1583414913768-94c5c1b46cdf?w=1200&q=80&auto=format&fit=crop',
  'tijuana-alt':  'https://images.unsplash.com/photo-1518105779142-d975f22f1b0a?w=1200&q=80&auto=format&fit=crop',
  cancun:         'https://images.unsplash.com/photo-1552074284-5e88ef1aef18?w=1200&q=80&auto=format&fit=crop',
  'cancun-alt':   'https://images.unsplash.com/photo-1510097467424-192d713fd8b2?w=1200&q=80&auto=format&fit=crop',
  bangkok:        'https://images.unsplash.com/photo-1508009603885-50cf7c579365?w=1200&q=80&auto=format&fit=crop',
  'bangkok-alt':  'https://images.unsplash.com/photo-1563492065599-3520f775eeed?w=1200&q=80&auto=format&fit=crop',
  budapest:       'https://images.unsplash.com/photo-1541849546-216549ae216d?w=1200&q=80&auto=format&fit=crop',
  'budapest-alt': 'https://images.unsplash.com/photo-1551867633-194f125bddfa?w=1200&q=80&auto=format&fit=crop',
  sanjose:        'https://images.unsplash.com/photo-1518509562904-e7ef99cddc85?w=1200&q=80&auto=format&fit=crop',
  'sanjose-alt':  'https://images.unsplash.com/photo-1580500550469-7e7e7e7e7e7e?w=1200&q=80&auto=format&fit=crop',
  // Clinic / interior shots
  'clinic-modern':'https://images.unsplash.com/photo-1606811971618-4486d14f3f99?w=1200&q=80&auto=format&fit=crop',
  'clinic-chair': 'https://images.unsplash.com/photo-1588776814546-1ffcf47267a5?w=1200&q=80&auto=format&fit=crop',
  'clinic-team':  'https://images.unsplash.com/photo-1629909613654-28e377c37b09?w=1200&q=80&auto=format&fit=crop',
};

const DestinationArt = ({ id, height = 240 }) => {
  const photo = DEST_PHOTOS[id];
  if (photo) {
    return (
      <div style={{height,overflow:'hidden',background:'var(--bone)',position:'relative'}}>
        <img src={photo} alt={id} loading="lazy" style={{width:'100%',height:'100%',objectFit:'cover',display:'block'}}/>
      </div>
    );
  }
  // fallback to SVG art
  return <div style={{height,overflow:'hidden',background:'var(--bone)'}} dangerouslySetInnerHTML={{__html: window.DTR_ART.get(id)}}/>;
};

const Footer = () => (
  <footer style={{borderTop:'1px solid var(--ink)',marginTop:96,background:'var(--ivory)'}}>
    <div className="page" style={{padding:'56px 40px 32px'}}>
      <div style={{display:'grid',gridTemplateColumns:'2fr 1fr 1fr 1fr',gap:48,alignItems:'flex-start'}}>
        <div>
          <Wordmark size={26}/>
          <p style={{fontSize:15,color:'var(--fg-2)',margin:'18px 0 24px',maxWidth:380,lineHeight:1.6}}>
            Independent reviews of dentists, clinics and the trips around them. Written by patients. Verified by mods. We don't sell leads.
          </p>
          <img src="assets/badge-powered-by.svg" alt="Powered by AI¹ Dental" style={{height:36}}/>
        </div>
        {[
          ['Destinations',[['Tijuana, MX','tijuana'],['Cancún, MX','cancun'],['San José, CR','sanjose'],['Bangkok, TH','bangkok'],['Budapest, HU','budapest']]],
          ['The site',[['Browse all','search'],['Community','forum'],['Concierges','concierges'],['Write a review','write']]],
          ['About',[['How we verify',''],['Editorial standards',''],['Press',''],['Contact','']]],
        ].map(([h,items]) => (
          <div key={h}>
            <div className="num-eyebrow" style={{marginBottom:14}}>{h}</div>
            <ul style={{listStyle:'none',padding:0,margin:0,fontSize:14,lineHeight:2,fontFamily:'var(--font-serif)'}}>
              {items.map(([l,_]) => (
                <li key={l}><a href="#" style={{color:'var(--ink)',textDecoration:'none'}}>{l}</a></li>
              ))}
            </ul>
          </div>
        ))}
      </div>
      <hr className="rule-thin" style={{margin:'40px 0 16px'}}/>
      <div style={{display:'flex',justifyContent:'space-between',fontFamily:'var(--font-mono)',fontSize:11,color:'var(--fg-3)',textTransform:'uppercase',letterSpacing:'0.1em'}}>
        <span>© 2026 dentaltourismreview.com · Independent · Patient-funded</span>
        <span>2,847 verified reviews · 47 clinics · 5 destinations</span>
      </div>
    </div>
  </footer>
);

// The Ledger: side-by-side US vs. abroad cost comparison
const Ledger = ({ procedure, destination, dark = true }) => {
  const usPrice = procedure.usPrice;
  const abroad = procedure.abroadAvg;
  const flight = destination.flightHrs.includes('Drive') ? 0 : destination.flightHrs.includes('3') ? 380 : destination.flightHrs.includes('5') ? 540 : destination.flightHrs.includes('9') ? 720 : 1200;
  const hotel = destination.flightHrs.includes('17') ? 1568 : destination.flightHrs.includes('Drive') ? 320 : 580;
  const food = destination.flightHrs.includes('17') ? 800 : 380;
  const totalAbroad = abroad + flight + hotel + food;
  const savings = usPrice - totalAbroad;
  return (
    <div className="ledger">
      <div className="ledger-col">
        <div className="ledger-head">Option A · The status quo</div>
        <div className="ledger-place" style={{fontFamily:'var(--font-serif)'}}>{procedure.name} at home</div>
        <div className="ledger-row"><span className="ledger-row-label">{procedure.name}</span><span className="ledger-row-val">{fmtUSD(usPrice)}</span></div>
        <div className="ledger-row"><span className="ledger-row-label">Time off work</span><span className="ledger-row-val">1–2 days</span></div>
        <div className="ledger-row"><span className="ledger-row-label">Vacation</span><span className="ledger-row-val">—</span></div>
        <div className="ledger-row ledger-row-total"><span>Total</span><span className="ledger-row-val">{fmtUSD(usPrice)}</span></div>
      </div>
      <div className={"ledger-col " + (dark ? 'ledger-col-dark' : '')}>
        <div className="ledger-head">Option B · {destination.name}</div>
        <div className="ledger-place">{procedure.name} + a trip</div>
        <div className="ledger-row"><span className="ledger-row-label">{procedure.name} ({destination.name})</span><span className="ledger-row-val">{fmtUSD(abroad)}</span></div>
        <div className="ledger-row"><span className="ledger-row-label">Round-trip flight</span><span className="ledger-row-val">{flight === 0 ? 'Drive' : fmtUSD(flight)}</span></div>
        <div className="ledger-row"><span className="ledger-row-label">Hotel · {destination.flightHrs.includes('17') ? '14 nights' : '4 nights'}</span><span className="ledger-row-val">{fmtUSD(hotel)}</span></div>
        <div className="ledger-row"><span className="ledger-row-label">Food + excursions</span><span className="ledger-row-val">{fmtUSD(food)}</span></div>
        <div className="ledger-row ledger-row-total"><span>Total</span><span className="ledger-row-val">{fmtUSD(totalAbroad)}</span></div>
        <div style={{marginTop:18,padding:'14px 16px',border:'1px solid var(--ivory)',background:'rgba(244,241,234,0.08)'}}>
          <div className="ledger-head" style={{color:'var(--ivory)',marginBottom:6,opacity:0.7}}>You save</div>
          <div style={{fontSize:32,fontFamily:'var(--font-serif)',letterSpacing:'-0.02em'}}>{fmtUSD(Math.max(0, savings))}<span style={{fontSize:14,fontFamily:'var(--font-mono)',marginLeft:10,color:'var(--graphite-300)'}}>+ a {destination.flightHrs.includes('17') ? '16-day' : '4-day'} trip</span></div>
        </div>
      </div>
    </div>
  );
};

// Destination "postcard" card used in grids
const DestinationCard = ({ d, navigate, compact = false }) => (
  <a href={`#/destination/${d.id}`} onClick={(e)=>{e.preventDefault();navigate('destination',d.id);}} style={{display:'block',textDecoration:'none',color:'var(--ink)'}}>
    <div className="card" style={{padding:0,overflow:'hidden'}}>
      <DestinationArt id={d.art} height={compact ? 160 : 220}/>
      <div style={{padding:'18px 20px 22px'}}>
        <div style={{display:'flex',justifyContent:'space-between',alignItems:'baseline',marginBottom:6}}>
          <div style={{fontFamily:'var(--font-mono)',fontSize:11,color:'var(--fg-3)',textTransform:'uppercase',letterSpacing:'0.08em'}}>{d.region}</div>
          <div style={{fontFamily:'var(--font-mono)',fontSize:11,color:'var(--moss)'}}>SAVE {d.avgSavings}%</div>
        </div>
        <div style={{fontFamily:'var(--font-serif)',fontSize:26,letterSpacing:'-0.01em',lineHeight:1.1,marginBottom:6}}>{d.name}</div>
        {!compact && <div style={{fontSize:14,color:'var(--fg-2)',lineHeight:1.5,marginBottom:14}}>{d.tagline}</div>}
        <div style={{display:'flex',justifyContent:'space-between',alignItems:'center',fontFamily:'var(--font-mono)',fontSize:11,color:'var(--fg-3)',textTransform:'uppercase',letterSpacing:'0.08em',paddingTop:12,borderTop:'1px solid var(--line)'}}>
          <span><Stars value={d.rating} size={11}/> <span style={{marginLeft:6}}>{d.rating} · {d.reviewCount.toLocaleString()} reviews</span></span>
          <span>{d.clinicCount} clinics</span>
        </div>
      </div>
    </div>
  </a>
);

// Clinic row card
const ClinicCard = ({ c, navigate, showDest = true }) => {
  const dest = destinations.find(d => d.id === c.destinationId);
  return (
    <a href={`#/clinic/${c.id}`} onClick={(e)=>{e.preventDefault();navigate('clinic',c.id);}} style={{display:'block',textDecoration:'none',color:'var(--ink)'}}>
      <div className="card" style={{display:'grid',gridTemplateColumns:'160px 1fr auto',gap:24,alignItems:'flex-start',padding:0}}>
        <div style={{height:160}}><DestinationArt id={c.photos?.[0] || dest.art} height={160}/></div>
        <div style={{padding:'18px 0'}}>
          {showDest && <div className="num-eyebrow" style={{marginBottom:8}}>{dest.name} · {dest.region}</div>}
          <div style={{fontFamily:'var(--font-serif)',fontSize:22,marginBottom:6,letterSpacing:'-0.01em'}}>{c.name}</div>
          <div style={{fontSize:14,color:'var(--fg-2)',marginBottom:10,lineHeight:1.5,maxWidth:540}}>{c.blurb}</div>
          <div style={{display:'flex',gap:8,flexWrap:'wrap'}}>
            {c.specialties.slice(0,3).map(s => <span key={s} style={{fontFamily:'var(--font-mono)',fontSize:10,letterSpacing:'0.08em',textTransform:'uppercase',color:'var(--fg-2)',padding:'3px 7px',border:'1px solid var(--line-strong)'}}>{s}</span>)}
          </div>
        </div>
        <div style={{padding:'18px 24px 0',textAlign:'right',borderLeft:'1px solid var(--line)',height:'100%'}}>
          <div style={{fontFamily:'var(--font-serif)',fontSize:30,letterSpacing:'-0.01em',lineHeight:1}}>{c.rating}</div>
          <div style={{margin:'4px 0 0'}}><Stars value={c.rating} size={11}/></div>
          <div className="num-eyebrow" style={{marginTop:6}}>{c.reviewCount} reviews</div>
          <div style={{fontFamily:'var(--font-mono)',fontSize:11,color:'var(--fg-3)',marginTop:14,paddingTop:10,borderTop:'1px solid var(--line)'}}>From <span style={{color:'var(--ink)',fontSize:14}}>{fmtUSD(Math.min(...c.priceList.map(p=>p[1])))}</span></div>
        </div>
      </div>
    </a>
  );
};

// Trip-report excerpt card
const TripReportCard = ({ r, navigate }) => {
  const dest = destinations.find(d => d.id === r.destinationId);
  const clinic = clinics.find(c => c.id === r.clinicId);
  return (
    <a href={`#/review/${r.id}`} onClick={(e)=>{e.preventDefault();navigate('review',r.id);}} style={{display:'block',textDecoration:'none',color:'var(--ink)'}}>
      <article className="card" style={{padding:'24px 26px'}}>
        <div style={{display:'flex',alignItems:'center',gap:12,marginBottom:14}}>
          <span className="avatar">{r.initials}</span>
          <div>
            <div style={{fontFamily:'var(--font-serif)',fontSize:14}}>{r.author} · {r.location}</div>
            <div className="num-eyebrow">{r.date} · {r.procedure}</div>
          </div>
        </div>
        <div style={{fontFamily:'var(--font-serif)',fontSize:22,letterSpacing:'-0.01em',lineHeight:1.2,marginBottom:10}}>"{r.title}"</div>
        <p style={{fontSize:15,color:'var(--fg-2)',lineHeight:1.55,margin:'0 0 16px',display:'-webkit-box',WebkitLineClamp:3,WebkitBoxOrient:'vertical',overflow:'hidden'}}>{r.body.split('\n')[0]}</p>
        <div style={{display:'flex',justifyContent:'space-between',alignItems:'center',paddingTop:14,borderTop:'1px solid var(--line)',fontFamily:'var(--font-mono)',fontSize:11,color:'var(--fg-3)',textTransform:'uppercase',letterSpacing:'0.08em'}}>
          <span>{dest.name} · {clinic?.name.split(' ·')[0] || ''}</span>
          <span style={{color:'var(--moss)'}}>SAVED {fmtUSD(r.wouldHaveSpent - r.spent)}</span>
        </div>
      </article>
    </a>
  );
};

const SectionHead = ({ num, eyebrow, title, lead, action }) => (
  <div style={{display:'grid',gridTemplateColumns:'80px 1fr auto',gap:32,alignItems:'flex-end',marginBottom:36,paddingBottom:18,borderBottom:'1px solid var(--ink)'}}>
    <div style={{fontFamily:'var(--font-mono)',fontSize:13,color:'var(--fg-3)',letterSpacing:'0.05em'}}>{num}</div>
    <div>
      <div className="num-eyebrow" style={{marginBottom:8}}>{eyebrow}</div>
      <h2 style={{fontSize:42,lineHeight:1.05,letterSpacing:'-0.02em',margin:0}}>{title}</h2>
      {lead && <p style={{fontSize:17,color:'var(--fg-2)',margin:'10px 0 0',maxWidth:680}}>{lead}</p>}
    </div>
    {action}
  </div>
);

Object.assign(window, { Nav, Footer, DestinationArt, DestinationCard, ClinicCard, TripReportCard, Ledger, Stars, Tag, Mark, Wordmark, SectionHead, fmtUSD });
