// Skrrs portal — Contact form and Favorites.
const { Button: KBtn, Input: KInput, Select: KSelect, Checkbox: KCheck, Badge: KBadge, PropertyCard: KPCard } = window.SkrrsDesignSystem_6013e8;

// ── Contact ─────────────────────────────────────────────────
function ContactScreen({ onNav, presetType, property }) {
  const D = window.SKRRS_DATA;
  const { isMobile } = window.useViewport();
  const [sent, setSent] = React.useState(false);
  const [sending, setSending] = React.useState(false);
  const [error, setError] = React.useState('');
  const [tsToken, setTsToken] = React.useState('');
  const tsRef = React.useRef(null);
  const tsWid = React.useRef(null);
  const SITEKEY = '0x4AAAAAADl0zdk2Q3xosmTj';
  const resetTs = () => { try { if (window.turnstile && tsWid.current!=null) window.turnstile.reset(tsWid.current); } catch(e){} window.__skrrsTs=''; setTsToken(''); };
  const propMsg = (p) => p ? `下記の物件についてご相談を希望します。\n\n【物件名】${p.name}\n【物件番号】SK-${String(p.id).toUpperCase()}\n【所在地】${p.area}\n【賃料】${p.rent}\n\n` : '';
  const [form, setForm] = React.useState({
    name:'', company:'', email:'', tel:'',
    type: (property && property.type) || presetType || '',
    area:'', message: propMsg(property), agree:false,
  });
  const set = (k,v)=>setForm(f=>({...f,[k]:v}));
  const valid = form.name && form.email && form.agree;

  // 実送信：Cloudflare Pages Function /api/contact 経由で info@skrrs-jp.com へ
  const submit = async (e) => {
    e.preventDefault();
    if (!valid || sending || !tsToken) return;
    setSending(true); setError('');
    const typeLabel = ({office:'オフィス（借りたい）',retail:'店舗（借りたい）',rnd:'教室（借りたい）',industrial:'倉庫（借りたい）',datacenter:'工場（借りたい）',manage:'物件管理のご相談（貸したい）',other:'その他・複合'})[form.type] || form.type || '';
    try {
      const res = await fetch('/api/contact', {
        method:'POST', headers:{'Content-Type':'application/json'},
        body: JSON.stringify({
          name: form.name, company: form.company, email: form.email, phone: form.tel,
          inquiryType: typeLabel, area: form.area, message: form.message,
          propertyId: property ? ('SK-'+String(property.id).toUpperCase()) : '',
          propertyName: property ? property.name : '',
          turnstileToken: tsToken,
          sourcePage: (typeof location!=='undefined' ? location.pathname+location.hash : ''),
        }),
      });
      const data = await res.json().catch(()=>({}));
      if (res.ok && data.ok) { setSent(true); }
      else { setError(data.error || '送信に失敗しました。お手数ですが info@skrrs-jp.com まで直接ご連絡ください。'); resetTs(); }
    } catch (err) {
      setError('通信エラーが発生しました。時間をおいて再度お試しください。'); resetTs();
    } finally { setSending(false); }
  };

  // re-prefill if the linked property changes (navigating from a detail page)
  React.useEffect(() => {
    if (property) {
      setForm(f => ({ ...f, type: property.type || f.type, message: propMsg(property) }));
      setSent(false);
    }
  }, [property && property.id]);

  // Turnstile（スパム対策）ウィジェットを描画
  React.useEffect(() => {
    if (sent) return;
    let timer = null, cancelled = false;
    const render = () => {
      if (cancelled) return;
      if (window.turnstile && tsRef.current && tsWid.current == null) {
        tsWid.current = window.turnstile.render(tsRef.current, {
          sitekey: SITEKEY,
          callback: (t) => { window.__skrrsTs = t; setTsToken(t); },
          'expired-callback': () => { window.__skrrsTs=''; setTsToken(''); },
          'error-callback': () => { window.__skrrsTs=''; setTsToken(''); },
        });
      } else if (tsWid.current == null) { timer = setTimeout(render, 300); }
    };
    render();
    return () => {
      cancelled = true; if (timer) clearTimeout(timer);
      if (tsWid.current != null && window.turnstile) { try { window.turnstile.remove(tsWid.current); } catch(e){} }
      tsWid.current = null; window.__skrrsTs=''; setTsToken('');
    };
  }, [sent]);

  const aside = (
    <div style={{ display:'flex', flexDirection:'column', gap:'var(--sp-5)' }}>
      <div style={{ background:'var(--blue-900)', color:'#fff', borderRadius:'var(--r-lg)', padding:'var(--sp-6)', display:'flex', flexDirection:'column', gap:12 }}>
        <span style={{ font:'600 var(--t-2xs)/1 var(--font-latin)', letterSpacing:'0.16em', textTransform:'uppercase', color:'var(--blue-300)' }}>By phone</span>
        <span style={{ font:'var(--fw-medium) var(--t-sm)/1.5 var(--font-body)', color:'rgba(255,255,255,0.82)' }}>お電話でのご相談はこちら</span>
        <a href="tel:0359377544" style={{ display:'inline-flex', alignItems:'center', gap:9, color:'#fff', textDecoration:'none' }}>
          <window.Icon name="phone" size={20}/><span style={{ font:'700 1.7rem/1 var(--font-num)' }}>03-5937-7544</span>
        </a>
        <span style={{ font:'var(--fw-regular) var(--t-xs)/1.5 var(--font-body)', color:'rgba(255,255,255,0.6)' }}>営業時間／平日 10:00〜18:00</span>
      </div>
      <div style={{ background:'var(--blue-50)', border:'1px solid var(--blue-100)', borderRadius:'var(--r-md)', padding:'var(--sp-5)', display:'flex', flexDirection:'column', gap:10 }}>
        <span style={{ font:'700 var(--t-h4)/1.4 var(--font-display)', color:'var(--text-strong)' }}>ご相談は無料です</span>
        {['物件のご紹介・ご提案','移転・出店のご相談','物件管理のご相談'].map(t=>(
          <span key={t} style={{ display:'flex', alignItems:'center', gap:9, font:'var(--fw-medium) var(--t-sm)/1.4 var(--font-body)', color:'var(--text-body)' }}>
            <span style={{ display:'grid', placeItems:'center', width:20, height:20, borderRadius:'var(--r-pill)', background:'var(--blue-100)', color:'var(--blue-700)', flex:'none' }}><window.Icon name="check" size={13} stroke={3}/></span>{t}
          </span>
        ))}
      </div>
    </div>
  );

  return (
    <main>
      <window.PageHero marker="Contact" icon="mail" title="お問い合わせ・ご相談"
        lead="物件のご相談、移転・出店のご相談、物件管理のご相談など、お気軽にお問い合わせください。担当者より折り返しご連絡します。"
        crumbs={[{label:'ホーム',route:'home'},{label:'お問い合わせ'}]} onNav={onNav} />
      <window.Container style={{ paddingTop:'var(--sp-10)', paddingBottom: isMobile?'var(--sp-16)':'var(--sp-20)' }}>
        <div style={{ display:'grid', gridTemplateColumns: isMobile?'minmax(0,1fr)':'minmax(0,1fr) 320px', gap:'var(--sp-8)', alignItems:'start' }}>
          <div style={{ minWidth:0, background:'var(--surface)', border:'1px solid var(--border-subtle)', borderRadius:'var(--r-lg)', padding: isMobile?'var(--sp-6)':'var(--sp-8)', boxShadow:'var(--shadow-sm)' }}>
            {sent ? (
              <div style={{ display:'flex', flexDirection:'column', alignItems:'center', textAlign:'center', gap:16, padding:'var(--sp-10) 0' }}>
                <span style={{ display:'grid', placeItems:'center', width:64, height:64, borderRadius:'var(--r-pill)', background:'var(--blue-50)', color:'var(--blue-600)' }}><window.Icon name="check" size={30} stroke={2.4}/></span>
                <h2 style={{ margin:0, font:'700 var(--t-h2)/1.3 var(--font-display)', color:'var(--text-strong)' }}>送信が完了しました</h2>
                <p style={{ margin:0, maxWidth:420, font:'var(--fw-regular) var(--t-base)/1.8 var(--font-body)', color:'var(--text-body)' }}>
                  お問い合わせありがとうございます。担当者より2営業日以内にご連絡いたします。
                </p>
                <KBtn variant="secondary" onClick={()=>onNav('home')}>ホームへ戻る</KBtn>
              </div>
            ) : (
              <form onSubmit={submit} style={{ display:'flex', flexDirection:'column', gap:'var(--sp-5)' }}>
                {property && (
                  <div style={{ display:'flex', alignItems:'center', gap:14, padding:'var(--sp-4)', borderRadius:'var(--r-md)', background:'var(--blue-50)', border:'1px solid var(--blue-100)' }}>
                    <span style={{ display:'grid', placeItems:'center', width:42, height:42, borderRadius:'var(--r-sm)', background:'var(--blue-600)', color:'#fff', flex:'none' }}><window.Icon name="building" size={20}/></span>
                    <div style={{ display:'flex', flexDirection:'column', gap:3, minWidth:0 }}>
                      <span style={{ font:'var(--fw-medium) var(--t-2xs)/1 var(--font-body)', color:'var(--blue-700)' }}>お問い合わせ対象の物件</span>
                      <span style={{ font:'var(--fw-bold) var(--t-sm)/1.4 var(--font-body)', color:'var(--text-strong)' }}>{property.name}</span>
                      <span style={{ font:'var(--fw-regular) var(--t-2xs)/1.4 var(--font-num)', color:'var(--text-muted)' }}>物件番号 SK-{String(property.id).toUpperCase()}・{property.rent}</span>
                    </div>
                  </div>
                )}
                <div style={{ display:'grid', gridTemplateColumns: isMobile?'minmax(0,1fr)':'minmax(0,1fr) minmax(0,1fr)', gap:'var(--sp-5)' }}>
                  <KInput label="お名前 *" value={form.name} onChange={e=>set('name',e.target.value)} placeholder="山田 太郎" />
                  <KInput label="会社名" value={form.company} onChange={e=>set('company',e.target.value)} placeholder="株式会社サンプル" />
                  <KInput label="メールアドレス *" type="email" value={form.email} onChange={e=>set('email',e.target.value)} placeholder="you@example.com" />
                  <KInput label="電話番号" type="tel" value={form.tel} onChange={e=>set('tel',e.target.value)} placeholder="03-0000-0000" />
                  <KSelect label="ご相談の種別" value={form.type} onChange={e=>set('type',e.target.value)} placeholder="種別を選択"
                    options={[{value:'office',label:'オフィス（借りたい）'},{value:'retail',label:'店舗（借りたい）'},{value:'rnd',label:'教室（借りたい）'},{value:'industrial',label:'倉庫（借りたい）'},{value:'datacenter',label:'工場（借りたい）'},{value:'manage',label:'物件管理のご相談（貸したい）'},{value:'other',label:'その他・複合'}]} />
                  <KSelect label="ご希望エリア" value={form.area} onChange={e=>set('area',e.target.value)} placeholder="エリアを選択" options={D.areas} />
                </div>
                <div style={{ display:'flex', flexDirection:'column', gap:6 }}>
                  <label style={{ font:'var(--fw-medium) var(--t-sm)/1.3 var(--font-body)', color:'var(--text-strong)' }}>ご相談内容</label>
                  <textarea value={form.message} onChange={e=>set('message',e.target.value)} rows={5} placeholder="ご相談内容をご記入ください"
                    style={{ width:'100%', maxWidth:'100%', boxSizing:'border-box', padding:'12px 14px', border:'1.5px solid var(--border-default)', borderRadius:'var(--r-sm)',
                      font:'var(--fw-regular) var(--t-base)/1.6 var(--font-body)', color:'var(--text-strong)', resize:'vertical', outline:'none' }} />
                </div>
                <KCheck label="個人情報のお取扱いに同意する" checked={form.agree} onChange={e=>set('agree',e.target.checked)} />
                <div ref={tsRef} style={{ display:'flex', justifyContent:'center', minHeight:65 }} />
                {error && <span style={{ font:'var(--fw-medium) var(--t-xs)/1.6 var(--font-body)', color:'var(--danger)', textAlign:'center' }}>{error}</span>}
                <KBtn type="submit" variant="primary" size="lg" full pill disabled={!valid || sending || !tsToken} iconRight={<window.Icon name="arrowR" size={18}/>}>{sending ? '送信中…' : 'この内容で送信する'}</KBtn>
                <span style={{ font:'var(--fw-regular) var(--t-2xs)/1.5 var(--font-body)', color:'var(--text-faint)', textAlign:'center' }}>* は必須項目です</span>
              </form>
            )}
          </div>
          {aside}
        </div>
      </window.Container>
    </main>
  );
}

// ── Favorites ───────────────────────────────────────────────
function FavoritesScreen({ saved, onToggleSave, onOpen, onNav }) {
  const D = window.SKRRS_DATA;
  const { isMobile, isTablet } = window.useViewport();
  const list = D.properties.filter(p => saved[p.id]);
  const cols = isMobile?1:isTablet?2:3;
  return (
    <main style={{ minHeight:'60vh' }}>
      <window.PageHero marker="Mypage" icon="heart" title="お気に入り物件"
        lead="気になる物件を保存して、いつでも比較・ご相談いただけます。"
        crumbs={[{label:'ホーム',route:'home'},{label:'お気に入り'}]} onNav={onNav} />
      <window.Container style={{ paddingTop:'var(--sp-10)', paddingBottom: isMobile?'var(--sp-16)':'var(--sp-20)' }}>
        {list.length ? (
          <React.Fragment>
            <span style={{ display:'inline-flex', alignItems:'baseline', gap:6, marginBottom:'var(--sp-6)' }}>
              <span style={{ font:'700 1.4rem/1 var(--font-num)', color:'var(--blue-600)' }}>{list.length}</span>
              <span style={{ font:'var(--fw-medium) var(--t-sm)/1 var(--font-body)', color:'var(--text-muted)' }}>件のお気に入り</span>
            </span>
            <div style={{ display:'grid', gridTemplateColumns:`repeat(${cols},1fr)`, gap:'var(--sp-5)' }}>
              {list.map(p=>(
                <KPCard key={p.id} {...p} image={<window.Photo hue={p.hue} ratio="16 / 10" icon="building" label={p.typeLabel} />}
                  saved={true} onToggleSave={()=>onToggleSave(p.id)} onClick={()=>onOpen(p)} />
              ))}
            </div>
          </React.Fragment>
        ) : (
          <div style={{ display:'flex', flexDirection:'column', alignItems:'center', textAlign:'center', gap:16, padding:'var(--sp-16) 0' }}>
            <span style={{ display:'grid', placeItems:'center', width:64, height:64, borderRadius:'var(--r-pill)', background:'var(--blue-50)', color:'var(--blue-400)' }}><window.Icon name="heart" size={28}/></span>
            <h2 style={{ margin:0, font:'700 var(--t-h3)/1.3 var(--font-display)', color:'var(--text-strong)' }}>お気に入りはまだありません</h2>
            <p style={{ margin:0, font:'var(--fw-regular) var(--t-base)/1.8 var(--font-body)', color:'var(--text-muted)' }}>物件カードの♡を押すと、ここに保存されます。</p>
            <KBtn variant="primary" pill iconLeft={<window.Icon name="search" size={17}/>} onClick={()=>onNav('search')}>物件を探す</KBtn>
          </div>
        )}
      </window.Container>
    </main>
  );
}

Object.assign(window, { ContactScreen, FavoritesScreen });
