// 声形义三位一体重组实验
// 选择声部、形部、义部 → 模拟重组生成新字并展示拓扑结构

const { useState } = React;

function SoundformTool({ onNavigate }) {
  const [selectedSound, setSelectedSound] = useState(soundformData.soundParts[0]);
  const [selectedForm, setSelectedForm] = useState(soundformData.formParts[0]);
  const [meaningLayer, setMeaningLayer] = useState(soundformData.meaningLayers[0]);
  const [isRecombining, setIsRecombining] = useState(false);
  const [showResult, setShowResult] = useState(true);

  // 组合结果
  const comboKey = `${selectedForm.char}+${selectedSound.char}`;
  const comboResult = soundformData.combos[comboKey] || {
    char: generateNewChar(selectedForm, selectedSound),
    meaning: `此为仓颉Ⅲ型系统模拟生成之新字，${selectedForm.name}表义，${selectedSound.name}表音。其义待考，其音近${selectedSound.pinyin}。`,
    layer: meaningLayer.name,
    isNew: true
  };

  function generateNewChar(form, sound) {
    // 模拟生成新字：左边形旁 + 右边声旁（用 CSS 组合展示）
    return { left: form.char, right: sound.char };
  }

  const handleRecombine = () => {
    setIsRecombining(true);
    setShowResult(false);
    setTimeout(() => {
      setShowResult(true);
      setIsRecombining(false);
    }, 1200);
  };

  // 随机组合
  const handleRandom = () => {
    const randomSound = soundformData.soundParts[Math.floor(Math.random() * soundformData.soundParts.length)];
    const randomForm = soundformData.formParts[Math.floor(Math.random() * soundformData.formParts.length)];
    const randomLayer = soundformData.meaningLayers[Math.floor(Math.random() * soundformData.meaningLayers.length)];
    setSelectedSound(randomSound);
    setSelectedForm(randomForm);
    setMeaningLayer(randomLayer);
    setIsRecombining(true);
    setShowResult(false);
    setTimeout(() => {
      setShowResult(true);
      setIsRecombining(false);
    }, 1200);
  };

  return (
    <div className="tool-container">
      <ToolHeader
        icon="造"
        title="声形义三位一体重组实验"
        subtitle="择声部、形部、义部而重组之，观新字之拓扑结构。此乃好悬君主导之核心实验也。"
      />

      {/* 选择区 */}
      <div className="tool-panel">
        <h3 className="tool-panel-title">三部选择</h3>
        
        <div className="sf-parts-grid" style={{ display: "grid", gridTemplateColumns: "repeat(3, 1fr)", gap: "20px" }}>
          <div>
            <div style={{
              fontFamily: "var(--font-brush)",
              fontSize: "18px",
              color: "var(--seal)",
              marginBottom: "12px",
              letterSpacing: "0.15em",
              textAlign: "center"
            }}>
              形 部
            </div>
            <div style={{
              display: "grid",
              gridTemplateColumns: "repeat(3, 1fr)",
              gap: "8px"
            }}>
              {soundformData.formParts.map(part => (
                <button
                  key={part.char}
                  onClick={() => setSelectedForm(part)}
                  style={{
                    padding: "12px 4px",
                    background: selectedForm.char === part.char ? "var(--seal)" : "var(--paper)",
                    color: selectedForm.char === part.char ? "var(--paper-light)" : "var(--ink)",
                    border: `1px solid ${selectedForm.char === part.char ? "var(--seal)" : "var(--line-strong)"}`,
                    borderRadius: "3px",
                    fontFamily: "var(--font-brush)",
                    fontSize: "24px",
                    cursor: "pointer",
                    transition: "all 0.25s"
                  }}
                  title={part.meaning}
                >
                  {part.char}
                </button>
              ))}
            </div>
            <div style={{
              marginTop: "10px",
              padding: "10px 12px",
              background: "var(--paper)",
              border: "1px solid var(--line)",
              borderRadius: "3px",
              fontSize: "12px",
              color: "var(--ink-light)",
              fontFamily: "var(--font-body)",
              lineHeight: "1.7",
              minHeight: "60px"
            }}>
              <strong style={{ color: "var(--seal)" }}>{selectedForm.name}</strong><br/>
              {selectedForm.meaning}
            </div>
          </div>

          {/* 声部选择 */}
          <div>
            <div style={{
              fontFamily: "var(--font-brush)",
              fontSize: "18px",
              color: "var(--ochre)",
              marginBottom: "12px",
              letterSpacing: "0.15em",
              textAlign: "center"
            }}>
              声 部
            </div>
            <div style={{
              display: "grid",
              gridTemplateColumns: "repeat(3, 1fr)",
              gap: "8px"
            }}>
              {soundformData.soundParts.map(part => (
                <button
                  key={part.char}
                  onClick={() => setSelectedSound(part)}
                  style={{
                    padding: "12px 4px",
                    background: selectedSound.char === part.char ? "var(--ochre)" : "var(--paper)",
                    color: selectedSound.char === part.char ? "var(--paper-light)" : "var(--ink)",
                    border: `1px solid ${selectedSound.char === part.char ? "var(--ochre)" : "var(--line-strong)"}`,
                    borderRadius: "3px",
                    fontFamily: "var(--font-brush)",
                    fontSize: "24px",
                    cursor: "pointer",
                    transition: "all 0.25s"
                  }}
                  title={part.meaning}
                >
                  {part.char}
                </button>
              ))}
            </div>
            <div style={{
              marginTop: "10px",
              padding: "10px 12px",
              background: "var(--paper)",
              border: "1px solid var(--line)",
              borderRadius: "3px",
              fontSize: "12px",
              color: "var(--ink-light)",
              fontFamily: "var(--font-body)",
              lineHeight: "1.7",
              minHeight: "60px"
            }}>
              <strong style={{ color: "var(--ochre)" }}>{selectedSound.name}</strong>（{selectedSound.pinyin}）<br/>
              {selectedSound.meaning}
            </div>
          </div>

          {/* 义层选择 */}
          <div>
            <div style={{
              fontFamily: "var(--font-brush)",
              fontSize: "18px",
              color: "var(--azure)",
              marginBottom: "12px",
              letterSpacing: "0.15em",
              textAlign: "center"
            }}>
              义 层
            </div>
            <div style={{ display: "flex", flexDirection: "column", gap: "8px" }}>
              {soundformData.meaningLayers.map(layer => (
                <button
                  key={layer.name}
                  onClick={() => setMeaningLayer(layer)}
                  style={{
                    padding: "10px 14px",
                    background: meaningLayer.name === layer.name ? layer.color : "var(--paper)",
                    color: meaningLayer.name === layer.name ? "var(--paper-light)" : "var(--ink)",
                    border: `1px solid ${meaningLayer.name === layer.name ? layer.color : "var(--line-strong)"}`,
                    borderRadius: "3px",
                    fontFamily: "var(--font-body)",
                    fontSize: "13px",
                    cursor: "pointer",
                    transition: "all 0.25s",
                    textAlign: "left"
                  }}
                >
                  {layer.name}
                </button>
              ))}
            </div>
            <div style={{
              marginTop: "10px",
              padding: "10px 12px",
              background: "var(--paper)",
              border: "1px solid var(--line)",
              borderRadius: "3px",
              fontSize: "12px",
              color: "var(--ink-light)",
              fontFamily: "var(--font-body)",
              lineHeight: "1.7",
              minHeight: "60px"
            }}>
              <strong style={{ color: meaningLayer.color }}>{meaningLayer.name}</strong><br/>
              {meaningLayer.desc}
            </div>
          </div>
        </div>

        {/* 操作按钮 */}
        <div style={{ 
          marginTop: "28px", 
          display: "flex", 
          gap: "16px", 
          justifyContent: "center",
          flexWrap: "wrap"
        }}>
          <button 
            className="btn btn-seal"
            onClick={handleRecombine}
            disabled={isRecombining}
          >
            {isRecombining ? "重组中..." : "◉ 重组实验"}
          </button>
          <button 
            className="btn"
            onClick={handleRandom}
            disabled={isRecombining}
          >
            ✦ 随机组合
          </button>
        </div>
      </div>

      {/* 结果展示区 */}
      <div className="tool-panel">
        <h3 className="tool-panel-title">
          重组结果 · 拓扑结构
          <span style={{
            fontSize: "13px",
            fontFamily: "var(--font-body)",
            color: "var(--ink-faint)",
            marginLeft: "auto",
            fontWeight: "normal"
          }}>
            形：{selectedForm.char} + 声：{selectedSound.char}
          </span>
        </h3>

        <div className="sf-result-grid" style={{
          display: "grid",
          gridTemplateColumns: "auto 1fr",
          gap: "40px",
          alignItems: "start"
        }}>
          {/* 新字展示 */}
          <div style={{ 
            textAlign: "center",
            flexShrink: "0"
          }}>
            <div style={{
              width: "180px",
              height: "180px",
              margin: "0 auto 20px",
              background: "var(--paper)",
              border: "3px solid var(--seal)",
              borderRadius: "6px",
              display: "flex",
              alignItems: "center",
              justifyContent: "center",
              position: "relative",
              overflow: "hidden"
            }}>
              {/* 田字格背景 */}
              <svg viewBox="0 0 100 100" style={{ position: "absolute", inset: "0", width: "100%", height: "100%" }}>
                <line x1="50" y1="0" x2="50" y2="100" stroke="var(--line)" strokeWidth="0.5" strokeDasharray="2 3" />
                <line x1="0" y1="50" x2="100" y2="50" stroke="var(--line)" strokeWidth="0.5" strokeDasharray="2 3" />
              </svg>
              
              {/* 新字 */}
              {showResult && (
                <div 
                  style={{
                    fontFamily: "var(--font-song)",
                    fontWeight: "700",
                    fontSize: "110px",
                    color: "var(--ink)",
                    position: "relative",
                    zIndex: "1",
                    lineHeight: "1",
                    animation: "inkSpread 0.6s ease-out"
                  }}
                >
                  {typeof comboResult.char === "string" ? comboResult.char : (
                    <span style={{ display: "inline-flex" }}>
                      <span style={{ fontSize: "0.6em", opacity: "0.9" }}>{comboResult.char.left}</span>
                      <span style={{ fontSize: "0.6em", opacity: "0.9" }}>{comboResult.char.right}</span>
                    </span>
                  )}
                </div>
              )}
              
              {isRecombining && (
                <div style={{
                  position: "absolute",
                  inset: "0",
                  display: "flex",
                  alignItems: "center",
                  justifyContent: "center",
                  background: "rgba(245, 236, 215, 0.9)",
                  fontFamily: "var(--font-body)",
                  color: "var(--seal)",
                  fontSize: "16px",
                  zIndex: "2"
                }}>
                  <span style={{ animation: "fadeInUp 1s infinite" }}>拓扑重组中...</span>
                </div>
              )}
            </div>
            
            {/* 新字标签 */}
            <div style={{
              display: "inline-block",
              padding: "6px 18px",
              background: comboResult.isNew ? "var(--azure)" : "var(--seal)",
              color: "var(--paper-light)",
              fontFamily: "var(--font-body)",
              fontSize: "13px",
              borderRadius: "20px",
              letterSpacing: "0.15em"
            }}>
              {comboResult.isNew ? "新生成字" : "传世字"}
            </div>
            
            <div style={{
              marginTop: "12px",
              fontFamily: "var(--font-brush)",
              fontSize: "20px",
              color: "var(--ink)"
            }}>
              {meaningLayer.name}
            </div>
          </div>

          {/* 右侧信息 */}
          <div>
            {/* 字的释义 */}
            <div style={{
              padding: "20px 24px",
              background: "var(--paper)",
              border: "1px solid var(--line)",
              borderLeft: "4px solid var(--seal)",
              borderRadius: "0 4px 4px 0",
              marginBottom: "20px"
            }}>
              <div style={{
                fontFamily: "var(--font-brush)",
                fontSize: "18px",
                color: "var(--seal)",
                marginBottom: "8px",
                letterSpacing: "0.1em"
              }}>
                字 义 解 析
              </div>
              <p style={{
                fontFamily: "var(--font-body)",
                fontSize: "15px",
                color: "var(--ink-soft)",
                lineHeight: "2",
                margin: "0"
              }}>
                {comboResult.meaning}
              </p>
            </div>

            {/* 拓扑结构信息 */}
            <div className="sf-topo-grid" style={{
              display: "grid",
              gridTemplateColumns: "repeat(3, 1fr)",
              gap: "12px"
            }}>
              <div style={{
                padding: "14px",
                border: "1px solid var(--line)",
                borderRadius: "4px",
                textAlign: "center",
                background: "var(--paper)"
              }}>
                <div style={{ fontFamily: "var(--font-body)", fontSize: "12px", color: "var(--ink-faint)", marginBottom: "4px" }}>结构类型</div>
                <div style={{ fontFamily: "var(--font-brush)", fontSize: "18px", color: "var(--seal)" }}>左形右声</div>
              </div>
              <div style={{
                padding: "14px",
                border: "1px solid var(--line)",
                borderRadius: "4px",
                textAlign: "center",
                background: "var(--paper)"
              }}>
                <div style={{ fontFamily: "var(--font-body)", fontSize: "12px", color: "var(--ink-faint)", marginBottom: "4px" }}>笔画数</div>
                <div style={{ fontFamily: "var(--font-brush)", fontSize: "18px", color: "var(--ochre)" }}>
                  {selectedForm.char.length * 4 + selectedSound.char.length * 5}画
                </div>
              </div>
              <div style={{
                padding: "14px",
                border: "1px solid var(--line)",
                borderRadius: "4px",
                textAlign: "center",
                background: "var(--paper)"
              }}>
                <div style={{ fontFamily: "var(--font-body)", fontSize: "12px", color: "var(--ink-faint)", marginBottom: "4px" }}>归属义层</div>
                <div style={{ fontFamily: "var(--font-brush)", fontSize: "18px", color: meaningLayer.color }}>{meaningLayer.name}</div>
              </div>
            </div>
          </div>
        </div>

        {/* 拓扑结构示意图 */}
        <div style={{ marginTop: "24px" }}>
          <div style={{
            fontFamily: "var(--font-brush)",
            fontSize: "16px",
            color: "var(--ink-light)",
            marginBottom: "12px",
            letterSpacing: "0.15em"
          }}>
            ◇ 拓扑结构示意
          </div>
          <div style={{
            background: "var(--paper)",
            border: "1px solid var(--line)",
            borderRadius: "4px",
            padding: "24px",
            overflowX: "auto"
          }}>
            <svg viewBox="0 0 600 180" style={{ width: "100%", minWidth: "400px", height: "auto" }}>
              {/* 中心字 */}
              <circle cx="300" cy="90" r="35" fill="var(--seal)" opacity="0.15" />
              <text x="300" y="100" textAnchor="middle" fontFamily="var(--font-brush)" fontSize="28" fill="var(--ink)" fontWeight="700">
                {typeof comboResult.char === "string" ? comboResult.char : "◈"}
              </text>
              
              {/* 形部 */}
              <circle cx="100" cy="40" r="28" fill="var(--seal)" opacity="0.2" stroke="var(--seal)" strokeWidth="1.5" />
              <text x="100" y="47" textAnchor="middle" fontFamily="var(--font-brush)" fontSize="22" fill="var(--seal)">{selectedForm.char}</text>
              <text x="100" y="80" textAnchor="middle" fontFamily="var(--font-kai)" fontSize="12" fill="var(--ink-light)">形部 · 表义</text>
              
              {/* 声部 */}
              <circle cx="500" cy="40" r="28" fill="var(--ochre)" opacity="0.2" stroke="var(--ochre)" strokeWidth="1.5" />
              <text x="500" y="47" textAnchor="middle" fontFamily="var(--font-brush)" fontSize="22" fill="var(--ochre)">{selectedSound.char}</text>
              <text x="500" y="80" textAnchor="middle" fontFamily="var(--font-kai)" fontSize="12" fill="var(--ink-light)">声部 · 表音</text>
              
              {/* 义层 */}
              <circle cx="300" cy="160" r="28" fill={meaningLayer.color} opacity="0.2" stroke={meaningLayer.color} strokeWidth="1.5" />
              <text x="300" y="152" textAnchor="middle" fontFamily="var(--font-brush)" fontSize="14" fill={meaningLayer.color}>{meaningLayer.name}</text>
              <text x="300" y="170" textAnchor="middle" fontFamily="var(--font-kai)" fontSize="11" fill="var(--ink-light)">义层 · 归域</text>
              
              {/* 连接线 */}
              <line x1="130" y1="50" x2="270" y2="75" stroke="var(--seal)" strokeWidth="1.5" opacity="0.5" />
              <line x1="470" y1="50" x2="330" y2="75" stroke="var(--ochre)" strokeWidth="1.5" opacity="0.5" />
              <line x1="300" y1="125" x2="300" y2="135" stroke={meaningLayer.color} strokeWidth="1.5" opacity="0.5" />
              
              {/* 箭头 */}
              <polygon points="270,75 275,70 275,80" fill="var(--seal)" opacity="0.5" />
              <polygon points="330,75 325,70 325,80" fill="var(--ochre)" opacity="0.5" />
            </svg>
          </div>
        </div>
      </div>

      {/* 实验说明 */}
      <div className="tool-panel" style={{ background: "var(--paper)" }}>
        <h3 className="tool-panel-title">实验说明</h3>
        <div className="sf-explain" style={{ 
          fontFamily: "var(--font-body)", 
          fontSize: "14px", 
          color: "var(--ink-light)",
          lineHeight: "2",
          columnCount: "2",
          columnGap: "32px"
        }}>
          <p style={{ textIndent: "2em", marginBottom: "12px", breakInside: "avoid" }}>
            声形义三位一体，乃汉字造字之根本法则。许慎《说文解字·叙》云：「仓颉之初作书，盖依类象形，故谓之文；其后形声相益，即谓之字。」
          </p>
          <p style={{ textIndent: "2em", marginBottom: "12px", breakInside: "avoid" }}>
            本实验以仓颉Ⅲ型系统为基础，将传统六书之学与现代拓扑学结合，可模拟生成形声字并解析其多维语义结构。
          </p>
          <p style={{ textIndent: "2em", margin: "0", breakInside: "avoid" }}>
            实验编号：MCT-Ω-003 · 好悬君主导研发。当前版本支持六声部 × 六形部 × 四义层，共计一百四十四种组合可能。
          </p>
        </div>
      </div>

      <BackButton onNavigate={onNavigate} />
    </div>
  );
}

window.SoundformTool = SoundformTool;
