// equipment-tab.jsx
// 「設備を選ぶ」タブ。カテゴリ別オプション選択 + 詳細カード + スコア（控えめ）。

const { useState: useStateEq } = React;
const {
  CATS, DEFAULT_SELECTION, SCORE_AXES, REASONS,
  OPTIMAL_ASSUMPTIONS, DECISION_RULES, RECOMMENDED_BUILD, COMFORT_SPECS
} = window.HOUSE_DATA;

// ─── 共通ヘルパー（メインから流用したいので window で共有） ───
function getOption(catId, optId) {
  const c = CATS.find(c => c.id === catId);
  return c?.options.find(o => o.id === optId) || c?.options[0];
}
window.getOption = getOption;

function calcScore(selection) {
  const t = {time:0, clean:0, comfort:0, cost:0, future:0};
  CATS.forEach(c => {
    const o = getOption(c.id, selection[c.id]);
    Object.keys(t).forEach(k => t[k] += o.scores[k]);
  });
  const n = CATS.length;
  Object.keys(t).forEach(k => t[k] /= n);
  const w = {time:.25, clean:.20, comfort:.20, cost:.25, future:.10};
  return {
    dims: t,
    total: Math.round(Object.keys(w).reduce((s,k) => s + t[k]*w[k], 0) * 20)
  };
}
window.calcScore = calcScore;

// ─── オプション行 ───
function OptionRow({ cat, opt, selected, onClick, isPropane }) {
  const showPropaneNote = opt.p;
  return (
    <div onClick={onClick}
      style={{
        padding:'12px 14px',
        cursor:'pointer',
        borderBottom:'1px solid var(--border)',
        display:'flex',
        alignItems:'flex-start',
        gap:'10px',
        background: selected ? 'rgba(91,156,246,.06)' : 'transparent',
        borderLeft: `3px solid ${selected ? 'var(--blue)' : 'transparent'}`,
        transition:'all .12s'
      }}>
      <div style={{
        width:'14px', height:'14px', borderRadius:'50%',
        border:`2px solid ${selected ? 'var(--blue)' : 'var(--border2)'}`,
        background: selected ? 'var(--blue)' : 'transparent',
        flexShrink:0, marginTop:'2px',
        boxShadow: selected ? '0 0 6px rgba(91,156,246,.4)' : 'none'
      }}/>
      <div style={{flex:1, minWidth:0}}>
        <div style={{fontSize:'13px', fontWeight:600, color:'var(--text)'}}>{opt.label}</div>
        <div style={{fontSize:'10px', color:'var(--text3)', marginTop:'2px', fontFamily:'var(--mono)'}}>{opt.maker}</div>
        <div style={{fontSize:'11px', color:'var(--text2)', marginTop:'4px', fontFamily:'var(--mono)'}}>
          初期 <span style={{color:'var(--text)'}}>¥{opt.init}万</span>
          <span style={{color:'var(--text3)', margin:'0 6px'}}>/</span>
          年間 <span style={{color: opt.annual < 0 ? 'var(--green)' : 'var(--text)'}}>
            {opt.annual < 0 ? `-¥${Math.abs(opt.annual)}万（売電）` : `¥${opt.annual}万`}
          </span>
        </div>
        {showPropaneNote && (
          <div style={{
            marginTop:'6px', padding:'4px 8px', borderRadius:'4px',
            fontSize:'10px', lineHeight:1.5,
            background: opt.p.r === 'good' ? 'rgba(45,217,143,.08)' : 'rgba(240,165,0,.08)',
            color: opt.p.r === 'good' ? 'var(--green)' : 'var(--amber)',
            border: `1px solid ${opt.p.r === 'good' ? 'rgba(45,217,143,.2)' : 'rgba(240,165,0,.2)'}`
          }}>
            {opt.p.r === 'good' ? '✓ ' : '⚠ '}{opt.p.t}
          </div>
        )}
      </div>
    </div>
  );
}

// ─── カテゴリブロック ───
function CategoryBlock({ cat, selected, onSelect, isPropane }) {
  return (
    <div style={{
      background:'var(--surface)',
      border:'1px solid var(--border)',
      borderRadius:'10px',
      overflow:'hidden'
    }}>
      <div style={{
        padding:'10px 14px',
        background:'var(--surface2)',
        borderBottom:'1px solid var(--border)',
        fontSize:'12px', fontWeight:700, color:'var(--text2)',
        letterSpacing:'.02em',
        display:'flex', alignItems:'center', gap:'7px'
      }}>
        <span style={{fontSize:'14px'}}>{cat.icon}</span>
        {cat.label}
      </div>
      <div>
        {cat.options.map(opt => (
          <OptionRow key={opt.id} cat={cat} opt={opt}
            selected={selected === opt.id}
            onClick={() => onSelect(cat.id, opt.id)}
            isPropane={isPropane}
          />
        ))}
      </div>
    </div>
  );
}

// ─── スコアミニ表示（控えめ） ───
function ScoreMini({ selection }) {
  const { dims, total } = calcScore(selection);
  const color = total >= 80 ? 'var(--green)' : total >= 60 ? 'var(--amber)' : 'var(--red)';
  const rank = total >= 85 ? 'S' : total >= 70 ? 'A' : total >= 55 ? 'B' : 'C';
  return (
    <div style={{
      display:'grid', gridTemplateColumns:'auto 1fr', gap:'18px',
      background:'var(--surface)', border:'1px solid var(--border)',
      borderRadius:'10px', padding:'14px 18px', alignItems:'center'
    }}>
      <div style={{textAlign:'center', borderRight:'1px solid var(--border)', paddingRight:'18px'}}>
        <div style={{fontSize:'36px', fontWeight:700, color, fontFamily:'var(--mono)', lineHeight:1, letterSpacing:'-.04em'}}>
          {total}
        </div>
        <div style={{fontSize:'9px', color:'var(--text3)', fontFamily:'var(--mono)', marginTop:'2px', letterSpacing:'.08em'}}>
          / 100 — {rank}ランク
        </div>
      </div>
      <div style={{display:'flex', flexDirection:'column', gap:'4px'}}>
        {SCORE_AXES.map(a => (
          <div key={a.k} style={{display:'flex', alignItems:'center', gap:'8px'}}>
            <div style={{fontSize:'10px', color:'var(--text3)', width:'60px', flexShrink:0, fontFamily:'var(--mono)'}}>{a.l}</div>
            <div style={{flex:1, height:'4px', background:'var(--bg)', borderRadius:'2px', overflow:'hidden'}}>
              <div style={{height:'100%', width:`${(dims[a.k]/5)*100}%`, background:a.c, borderRadius:'2px', transition:'width .4s'}}/>
            </div>
            <div style={{fontSize:'10px', color:a.c, fontFamily:'var(--mono)', width:'24px', textAlign:'right'}}>
              {dims[a.k].toFixed(1)}
            </div>
          </div>
        ))}
      </div>
    </div>
  );
}

// ─── 詳細カード ───
function DetailCard({ cat, opt }) {
  const avg = Math.round(Object.values(opt.scores).reduce((a,b)=>a+b, 0) / 5 * 20);
  return (
    <div style={{
      background:'var(--surface)',
      border:'1px solid var(--border)',
      borderRadius:'10px',
      padding:'14px'
    }}>
      <div style={{display:'flex', justifyContent:'space-between', alignItems:'flex-start', marginBottom:'8px'}}>
        <div style={{minWidth:0}}>
          <div style={{fontSize:'10px', color:'var(--text3)', fontFamily:'var(--mono)', letterSpacing:'.04em', marginBottom:'2px'}}>
            {cat.icon} {cat.label}
          </div>
          <div style={{fontSize:'13px', fontWeight:600, color:'var(--text)'}}>{opt.label}</div>
          <div style={{fontSize:'10px', color:'var(--text3)', marginTop:'2px', fontFamily:'var(--mono)'}}>{opt.maker}</div>
        </div>
        <div style={{
          fontSize:'10px', fontWeight:700, fontFamily:'var(--mono)',
          padding:'2px 8px', borderRadius:'4px',
          background:'rgba(45,217,143,.12)',
          color:'var(--green)',
          border:'1px solid rgba(45,217,143,.25)',
          flexShrink:0, marginLeft:'8px'
        }}>{avg}点</div>
      </div>
      <div style={{fontSize:'11px', color:'var(--text2)', marginBottom:'10px', fontFamily:'var(--mono)'}}>
        初期 <span style={{color:'var(--text)'}}>¥{opt.init}万</span> /
        年間 <span style={{color: opt.annual < 0 ? 'var(--green)' : 'var(--text)'}}>
          {opt.annual < 0 ? `-¥${Math.abs(opt.annual)}万` : `¥${opt.annual}万`}
        </span>
      </div>
      <div className="mobile-stack" style={{display:'grid', gridTemplateColumns:'1fr 1fr', gap:'10px'}}>
        <div>
          <div style={{fontSize:'9px', fontFamily:'var(--mono)', letterSpacing:'.08em', color:'var(--green)', marginBottom:'4px', fontWeight:600}}>MERITS</div>
          {opt.pros.map((p,i) => (
            <div key={i} style={{display:'flex', gap:'5px', fontSize:'11px', color:'var(--text2)', lineHeight:1.55, marginBottom:'3px'}}>
              <span style={{color:'var(--green)', flexShrink:0}}>+</span>
              <span>{p}</span>
            </div>
          ))}
        </div>
        <div>
          <div style={{fontSize:'9px', fontFamily:'var(--mono)', letterSpacing:'.08em', color:'var(--amber)', marginBottom:'4px', fontWeight:600}}>CONS</div>
          {opt.cons.map((p,i) => (
            <div key={i} style={{display:'flex', gap:'5px', fontSize:'11px', color:'var(--text2)', lineHeight:1.55, marginBottom:'3px'}}>
              <span style={{color:'var(--amber)', flexShrink:0}}>-</span>
              <span>{p}</span>
            </div>
          ))}
        </div>
      </div>
    </div>
  );
}

// ─── 軸別根拠 ───
function ReasoningGrid({ selection }) {
  const [activeAxis, setActiveAxis] = useStateEq('time');
  return (
    <div>
      <div style={{display:'flex', gap:'5px', marginBottom:'12px', flexWrap:'wrap'}}>
        {SCORE_AXES.map(a => (
          <button key={a.k} onClick={()=>setActiveAxis(a.k)} style={{
            padding:'5px 12px', borderRadius:'6px', border:'1px solid', fontSize:'11px',
            background: activeAxis===a.k ? 'rgba(91,156,246,.1)' : 'transparent',
            borderColor: activeAxis===a.k ? a.c : 'var(--border)',
            color: activeAxis===a.k ? a.c : 'var(--text2)',
            transition:'all .15s', fontWeight: activeAxis===a.k ? 600 : 400
          }}>
            {a.l}
          </button>
        ))}
      </div>
      <div className="mobile-stack" style={{display:'grid', gridTemplateColumns:'repeat(2, 1fr)', gap:'8px'}}>
        {CATS.map(c => {
          const opt = getOption(c.id, selection[c.id]);
          const score = opt.scores[activeAxis];
          const reason = (REASONS[activeAxis] || {})[opt.id] || '—';
          const axis = SCORE_AXES.find(a=>a.k===activeAxis);
          return (
            <div key={c.id} style={{
              background:'var(--surface)',
              border:'1px solid var(--border)',
              borderRadius:'8px',
              padding:'10px 12px',
              display:'flex', alignItems:'flex-start', gap:'10px'
            }}>
              <div style={{
                fontSize:'12px', fontWeight:700, fontFamily:'var(--mono)',
                color: axis.c,
                background: `${axis.c}1a`,
                border: `1px solid ${axis.c}40`,
                padding:'2px 7px', borderRadius:'4px',
                flexShrink:0, minWidth:'34px', textAlign:'center'
              }}>{score}/5</div>
              <div style={{minWidth:0, flex:1}}>
                <div style={{fontSize:'11px', color:'var(--text2)', fontWeight:600, marginBottom:'2px'}}>
                  {c.icon} {c.label} — <span style={{color:'var(--text)'}}>{opt.label}</span>
                </div>
                <div style={{fontSize:'11px', color:'var(--text3)', lineHeight:1.55}}>{reason}</div>
              </div>
            </div>
          );
        })}
      </div>
    </div>
  );
}

function BaselineGuide({ selection, setSelection, isPropane }) {
  const changedCount = CATS.filter(cat => selection[cat.id] !== DEFAULT_SELECTION[cat.id]).length;
  const reset = () => setSelection({...DEFAULT_SELECTION});

  return (
    <div style={{marginBottom:'24px'}}>
      <div style={{
        background:'linear-gradient(135deg, rgba(45,217,143,.12), rgba(91,156,246,.08))',
        border:'1px solid rgba(45,217,143,.24)',
        borderRadius:'10px',
        padding:'16px',
        marginBottom:'12px'
      }}>
        <div className="mobile-stack" style={{display:'grid', gridTemplateColumns:'1.15fr .85fr', gap:'14px'}}>
          <div>
            <div style={{display:'flex', gap:'6px', flexWrap:'wrap', marginBottom:'10px'}}>
              <Pill color="green">結論</Pill>
              <Pill color={isPropane ? 'amber' : 'muted'}>{isPropane ? 'LPガス地域' : 'LPガス想定を基準'}</Pill>
              <Pill color="blue">基本オール電化</Pill>
            </div>
            <div style={{fontSize:'20px', fontWeight:700, letterSpacing:'-.03em', lineHeight:1.4, color:'var(--text)', marginBottom:'8px'}}>
              エコキュート、IH、乾燥付きドラム、食洗機、床掃除ロボを先に採用
            </div>
            <div style={{fontSize:'12px', color:'var(--text2)', lineHeight:1.75}}>
              このページは「少し安いかも」ではなく、LPガス地域で毎日の手間と長期支出を減らす標準案を先に出します。
              ガスを残すのは料理や乾燥速度など、はっきりした理由がある時だけです。
            </div>
          </div>
          <div style={{
            background:'rgba(11,13,18,.42)',
            border:'1px solid var(--border)',
            borderRadius:'8px',
            padding:'12px'
          }}>
            <div style={{fontSize:'11px', fontWeight:700, color:'var(--text)', marginBottom:'8px'}}>今回の前提</div>
            {OPTIMAL_ASSUMPTIONS.map((line, i) => (
              <div key={i} style={{display:'flex', gap:'7px', fontSize:'11px', color:'var(--text2)', lineHeight:1.6, marginBottom:'5px'}}>
                <span style={{color:'var(--green)', flexShrink:0}}>✓</span>
                <span>{line}</span>
              </div>
            ))}
            <div style={{marginTop:'10px', display:'flex', flexWrap:'wrap', alignItems:'center', gap:'8px'}}>
              <button onClick={reset} style={{
                border:'1px solid rgba(91,156,246,.35)',
                background:'rgba(91,156,246,.12)',
                color:'var(--blue)',
                borderRadius:'6px',
                padding:'7px 10px',
                fontSize:'11px',
                fontWeight:600
              }}>推奨構成に戻す</button>
              <span style={{fontSize:'10px', color:'var(--text3)'}}>
                {changedCount === 0 ? '現在は推奨構成です' : `推奨構成から ${changedCount} 項目変更中`}
              </span>
            </div>
          </div>
        </div>
      </div>

      <div className="mobile-stack" style={{display:'grid', gridTemplateColumns:'repeat(2, minmax(0, 1fr))', gap:'10px'}}>
        {DECISION_RULES.map((rule, i) => (
          <div key={rule.title} style={{
            display:'flex',
            gap:'10px',
            background:'var(--surface)',
            border:'1px solid var(--border)',
            borderRadius:'10px',
            padding:'12px'
          }}>
            <div style={{
              width:'25px',
              height:'25px',
              borderRadius:'7px',
              background:'rgba(240,165,0,.12)',
              border:'1px solid rgba(240,165,0,.28)',
              color:'var(--amber)',
              display:'grid',
              placeItems:'center',
              flexShrink:0,
              fontSize:'12px',
              fontWeight:700,
              fontFamily:'var(--mono)'
            }}>{i + 1}</div>
            <div style={{minWidth:0}}>
              <div style={{fontSize:'12px', fontWeight:700, color:'var(--text)', marginBottom:'4px'}}>{rule.title}</div>
              <div style={{fontSize:'11px', color:'var(--text2)', lineHeight:1.65}}>{rule.body}</div>
            </div>
          </div>
        ))}
      </div>
    </div>
  );
}

function RecommendedBuild() {
  return (
    <div style={{marginBottom:'24px'}}>
      <SecHead icon="🎯" title="この家で先に採用するもの"
        sub="細かな点数より先に、生活の快適コスパへ効く順番を固定します。" />
      <div className="mobile-stack" style={{display:'grid', gridTemplateColumns:'repeat(2, minmax(0, 1fr))', gap:'10px'}}>
        {RECOMMENDED_BUILD.map(item => (
          <div key={item.title} style={{
            background:'var(--surface)',
            border:'1px solid var(--border)',
            borderRadius:'10px',
            padding:'14px'
          }}>
            <div style={{display:'flex', justifyContent:'space-between', alignItems:'flex-start', gap:'10px', marginBottom:'8px'}}>
              <div>
                <div style={{fontSize:'10px', color:'var(--text3)', fontFamily:'var(--mono)', marginBottom:'3px'}}>{item.title}</div>
                <div style={{fontSize:'14px', fontWeight:700, lineHeight:1.45, color:'var(--text)'}}>{item.pick}</div>
              </div>
              <Pill color={item.tag === '最優先' ? 'green' : 'blue'}>{item.tag}</Pill>
            </div>
            <div style={{fontSize:'11px', color:'var(--text2)', lineHeight:1.7, marginBottom:'9px'}}>{item.body}</div>
            <div style={{
              borderTop:'1px solid var(--border)',
              paddingTop:'8px',
              fontSize:'11px',
              color:'var(--text3)',
              lineHeight:1.65
            }}>
              <span style={{color:'var(--amber)', fontWeight:700}}>家づくりで先に確保: </span>{item.prep}
            </div>
          </div>
        ))}
      </div>
    </div>
  );
}

function ComfortSpecs() {
  return (
    <div style={{marginBottom:'24px'}}>
      <SecHead icon="🏡" title="家電と家具が働きやすい設置仕様"
        sub="設備だけ高くしても、置場と動線が悪いと使いにくいままです。図面に書いておきたい準備をまとめます。" />
      <div className="mobile-stack" style={{display:'grid', gridTemplateColumns:'repeat(3, minmax(0, 1fr))', gap:'10px'}}>
        {COMFORT_SPECS.map(spec => (
          <div key={spec.title} style={{
            background:'var(--surface)',
            border:'1px solid var(--border)',
            borderRadius:'10px',
            padding:'13px'
          }}>
            <div style={{display:'flex', gap:'8px', alignItems:'center', marginBottom:'9px'}}>
              <span style={{fontSize:'18px'}}>{spec.icon}</span>
              <div style={{fontSize:'12px', fontWeight:700, color:'var(--text)'}}>{spec.title}</div>
            </div>
            {spec.lines.map((line, i) => (
              <div key={i} style={{display:'flex', gap:'6px', fontSize:'11px', color:'var(--text2)', lineHeight:1.6, marginBottom:'5px'}}>
                <span style={{color:'var(--blue)', flexShrink:0}}>+</span>
                <span>{line}</span>
              </div>
            ))}
          </div>
        ))}
      </div>
    </div>
  );
}

// ─── 設備を選ぶタブ（シンプル版：選択グリッド優先） ───
function EquipmentTab({ selection, setSelection, isPropane }) {
  return (
    <div>
      <SecHead icon="⚙️" title="設備を選ぶ"
        sub="各カテゴリのオプションをタップして選択。推奨構成の根拠・詳細分析は「📊 診断結果」タブで確認できます。" />

      {/* スコア概要 */}
      <div style={{marginBottom:'18px'}}>
        <ScoreMini selection={selection} />
      </div>

      {/* カテゴリ選択グリッド — 最上部に配置 */}
      <div className="mobile-stack" style={{display:'grid', gridTemplateColumns:'1fr 1fr', gap:'10px', marginBottom:'18px'}}>
        {CATS.map(cat => (
          <CategoryBlock key={cat.id} cat={cat}
            selected={selection[cat.id]}
            onSelect={(cid, oid) => setSelection({...selection, [cid]: oid})}
            isPropane={isPropane}
          />
        ))}
      </div>

      {/* 診断結果タブへの誘導 */}
      <div style={{
        background:'rgba(91,156,246,.07)', border:'1px solid rgba(91,156,246,.2)',
        borderRadius:'8px', padding:'12px 16px', fontSize:'12px', color:'var(--text2)', lineHeight:1.65
      }}>
        📊 選択内容の詳細分析（推奨構成の根拠・採用すべき設備・設置仕様・スコア詳細）は
        <b style={{color:'var(--blue)'}}> 「診断結果」タブ</b> で確認できます。
      </div>
    </div>
  );
}

// ─── 診断結果タブ ───
function DiagnosisTab({ selection, setSelection, isPropane }) {
  return (
    <div>
      <SecHead icon="📊" title="診断結果"
        sub="推奨構成の根拠・判断基準・採用設備リスト・設置仕様・スコア詳細をまとめています。" />

      <BaselineGuide selection={selection} setSelection={setSelection} isPropane={isPropane} />
      <RecommendedBuild />
      <ComfortSpecs />

      {/* 選択中の設備 詳細 */}
      <SecHead icon="🔍" title="選択中の設備 — 詳細"
        sub="現在の選択構成のメリット・検討事項・スコアを一覧で確認。" />
      <div className="mobile-stack" style={{display:'grid', gridTemplateColumns:'repeat(2, 1fr)', gap:'10px', marginBottom:'22px'}}>
        {CATS.map(c => {
          const opt = getOption(c.id, selection[c.id]);
          return <DetailCard key={c.id} cat={c} opt={opt} />;
        })}
      </div>

      {/* スコア根拠（軸切替） */}
      <SecHead icon="📐" title="スコアの根拠（軸別）"
        sub="評価軸を切り替えると、現在の選択構成における各カテゴリの根拠が表示されます。" />
      <ReasoningGrid selection={selection} />
    </div>
  );
}

window.EquipmentTab = EquipmentTab;
window.DiagnosisTab = DiagnosisTab;
