// 页面组件库
// 首页、团队简介、发展沿革、使命方向、核心项目、成员、团队赋、通知书、申请入队、申请记录

const { useState, useEffect } = React;

// ============================================
// 首页
// ============================================
function HomePage({ onNavigate }) {
  const h = teamData.hero;
  
  return (
    <div>
      {/* Hero 区 */}
      <HeroSection
        title={h.title}
        sealText={h.sealText}
        subtitle={h.subtitle}
        quote={h.quote}
        leftVertical={h.leftVertical}
        rightVertical={h.rightVertical}
      >
        <div className="hero-actions">
          <button className="btn btn-seal" onClick={() => onNavigate("apply")}>
            申 请 入 队
          </button>
          <button className="btn" onClick={() => onNavigate("ode")}>
            读团队赋
          </button>
        </div>
      </HeroSection>

      {/* 快速入口卡片 */}
      <section className="section" style={{ paddingTop: "0" }}>
        <div className="card-grid" style={{ marginBottom: "48px" }}>
          <GuCard
            kicker="团 队 沿 革"
            title="十二载征程"
            desc="从「造字」到「新文明」，自癸巳年肇基至今，虽经离乱而不改其志。"
            corner="史"
            onClick={() => onNavigate("history")}
          />
          <GuCard
            kicker="三 大 使 命"
            title="文明宏愿"
            desc="新文字基因库重编译、多维语义场构建、未来书写系统原型开发。"
            corner="志"
            onClick={() => onNavigate("mission")}
          />
          <GuCard
            kicker="核 心 项 目"
            title="伟绩昭昭"
            desc="仓颉Ⅲ型系统、跨文明对话研讨会、思维装备套装、人类语义长城计划。"
            corner="业"
            onClick={() => onNavigate("projects")}
          />
        </div>

        <div className="card-grid four">
          <GuCard
            kicker="交 互 工 具"
            title="仓颉Ⅲ型"
            desc="文字基因链十万维度解构，五体演变同观。"
            onClick={() => onNavigate("cangjie")}
          >
            <div style={{ marginTop: "12px", fontFamily: "var(--font-brush)", fontSize: "32px", color: "var(--seal)", textAlign: "center" }}>倉</div>
          </GuCard>
          <GuCard
            kicker="交 互 工 具"
            title="量子纠缠"
            desc="跨文明符号对应关系可视化，星图般的文字纠缠。"
            onClick={() => onNavigate("entanglement")}
          >
            <div style={{ marginTop: "12px", fontFamily: "var(--font-brush)", fontSize: "32px", color: "var(--ochre)", textAlign: "center" }}>綴</div>
          </GuCard>
          <GuCard
            kicker="交 互 工 具"
            title="多维语义"
            desc="五重语义叠加态：形义、礼制、哲思、神经、元宇宙。"
            onClick={() => onNavigate("semantic")}
          >
            <div style={{ marginTop: "12px", fontFamily: "var(--font-brush)", fontSize: "32px", color: "var(--azure)", textAlign: "center" }}>場</div>
          </GuCard>
          <GuCard
            kicker="交 互 工 具"
            title="声形义组"
            desc="三位一体重组实验，模拟造字之拓扑结构。"
            onClick={() => onNavigate("soundform")}
          >
            <div style={{ marginTop: "12px", fontFamily: "var(--font-brush)", fontSize: "32px", color: "var(--jade)", textAlign: "center" }}>造</div>
          </GuCard>
        </div>
      </section>

      {/* 赋文选读 */}
      <section className="section">
        <SectionHead
          eyebrow="FU WEN XUAN DU"
          title="赋文选读"
          subtitle="试看今日之世，文字滔滔，多沦为信息之载体；独新文明诸君，别出手眼，持文字为文明基因之手术刀。"
        />
        <ScrollContainer>
          <div style={{ 
            fontFamily: "var(--font-body)", 
            fontSize: "18px", 
            color: "var(--ink-soft)",
            lineHeight: "2.4",
            textAlign: "justify",
            textIndent: "2em"
          }}>
            <p style={{ marginBottom: "20px" }}>
              {teamData.ode.paragraphs[0].slice(0, 100)}......
            </p>
            <p style={{ marginBottom: "20px" }}>
              {teamData.ode.paragraphs[1].slice(0, 120)}......
            </p>
            <p style={{ textAlign: "right", textIndent: "0", marginTop: "24px" }}>
              <button className="btn" onClick={() => onNavigate("ode")}>
                阅读全文 →
              </button>
            </p>
          </div>
        </ScrollContainer>
      </section>

      {/* 入队号召 */}
      <section className="section">
        <div className="call-banner" style={{ 
          textAlign: "center", 
          padding: "64px 32px",
          background: "linear-gradient(135deg, rgba(184, 58, 42, 0.08), rgba(166, 93, 47, 0.06))",
          border: "1px solid var(--line-strong)",
          borderRadius: "6px",
          position: "relative",
          overflow: "hidden"
        }}>
          <div style={{
            fontFamily: "var(--font-brush)",
            fontSize: "clamp(22px, 5.5vw, 36px)",
            color: "var(--ink)",
            letterSpacing: "0.15em",
            marginBottom: "16px"
          }}>
            愿共襄文明之盛举乎？
          </div>
          <CloudDivider />
          <p style={{
            fontFamily: "var(--font-body)",
            fontSize: "17px",
            color: "var(--ink-light)",
            maxWidth: "600px",
            margin: "0 auto 32px",
            lineHeight: "2"
          }}>
            此非田心一人之业，实乃千秋万代之功也！<br/>
            新文明团队诚邀有志之士，共赴文字重构之征途。
          </p>
          <button className="btn btn-seal" onClick={() => onNavigate("apply")}>
            申 请 入 队
          </button>
        </div>
      </section>
    </div>
  );
}

// ============================================
// 团队简介
// ============================================
function AboutPage({ onNavigate }) {
  const a = teamData.about;
  return (
    <div>
      <HeroSection
        title="团队简介"
        sealText="源"
        subtitle="ABOUT US"
        quote="志在重铸华夏文明之精魄。"
        leftVertical="癸巳年肇基"
        rightVertical="乙巳年新局"
      />

      <section className="section" style={{ paddingTop: "0" }}>
        <div className="card-grid two">
          <div className="gu-card" style={{ cursor: "default" }}>
            <div className="card-kicker">起 源</div>
            <h3 className="card-title">{a.origin.title}</h3>
            <p className="card-desc">{a.origin.content}</p>
          </div>
          <div className="gu-card" style={{ cursor: "default" }}>
            <div className="card-kicker">定 位</div>
            <h3 className="card-title">{a.positioning.title}</h3>
            <p className="card-desc">{a.positioning.content}</p>
          </div>
          <div className="gu-card" style={{ cursor: "default" }}>
            <div className="card-kicker">变 故</div>
            <h3 className="card-title">{a.split.title}</h3>
            <p className="card-desc">{a.split.content}</p>
          </div>
          <div className="gu-card" style={{ cursor: "default" }}>
            <div className="card-kicker">愿 景</div>
            <h3 className="card-title">{a.vision.title}</h3>
            <p className="card-desc">{a.vision.content}</p>
          </div>
        </div>
      </section>

      <section className="section">
        <SectionHead
          eyebrow="GE GU DING XIN"
          title="革故鼎新"
          subtitle="团队更名暗合《周易》「革卦」之象，取「革故鼎新」之意。"
        />
        <ScrollContainer>
          <div style={{ textAlign: "center", fontFamily: "var(--font-body)", color: "var(--ink-soft)", lineHeight: "2.2", fontSize: "16px" }}>
            <p style={{ marginBottom: "16px", textIndent: "2em", textAlign: "justify" }}>
              壬寅冬月之变，摧氏率三十部众裂土而去。当是时也，田心独守空庭，秉烛三昼夜，终悟「孤阳不长」之理——
            </p>
            <div style={{ 
              fontFamily: "var(--font-brush)", 
              fontSize: "32px", 
              color: "var(--seal)",
              letterSpacing: "0.3em",
              margin: "24px 0"
            }}>
              「孤阳不长，独阴不生」
            </div>
            <p style={{ textIndent: "2em", textAlign: "justify" }}>
              遂更名「新文明」，誓以残躯续文明火种。好悬加盟时，正值春分节气，象征阴阳调和，双璧辉映之局始成。
            </p>
          </div>
        </ScrollContainer>
      </section>

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

// ============================================
// 发展沿革
// ============================================
function HistoryPage({ onNavigate }) {
  return (
    <div>
      <HeroSection
        title="发展沿革"
        sealText="史"
        subtitle="HISTORY"
        quote="十二载征程，虽遭离乱而不改其志，纵遇困顿犹自辟蹊径。"
        leftVertical="癸巳肇基"
        rightVertical="乙巳新局"
      />

      <section className="section" style={{ paddingTop: "0" }}>
        <BambooTimeline items={teamData.history} />
      </section>

      <section className="section">
        <div style={{ textAlign: "center" }}>
          <div style={{ 
            fontFamily: "var(--font-brush)", 
            fontSize: "24px", 
            color: "var(--seal)", 
            letterSpacing: "0.2em",
            marginBottom: "16px"
          }}>
            大事年表·终
          </div>
          <p style={{ 
            fontFamily: "var(--font-body)", 
            fontSize: "15px", 
            color: "var(--ink-light)",
            maxWidth: "600px",
            margin: "0 auto",
            lineHeight: "2"
          }}>
            观其十二载征程，若江河行地，虽经九曲而终归沧海。<br/>
            今新文明团队正筹「人类语义长城计划」，前路漫漫，来日方长。
          </p>
        </div>
      </section>

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

// ============================================
// 使命方向
// ============================================
function MissionPage({ onNavigate }) {
  return (
    <div>
      <HeroSection
        title="使命方向"
        sealText="志"
        subtitle="MISSION"
        quote="其使命之宏，可比女娲补天。"
        leftVertical="文字基因库"
        rightVertical="未来书写系统"
      />

      <section className="section" style={{ paddingTop: "0" }}>
        <div style={{ display: "flex", flexDirection: "column", gap: "32px" }}>
          {teamData.missions.map((m, idx) => (
            <div 
              key={idx} 
              className="mission-card fade-in-up"
              style={{
                display: "grid",
                gridTemplateColumns: "auto 1fr",
                gap: "32px",
                alignItems: "start",
                padding: "36px 40px",
                background: "var(--paper-light)",
                border: "1px solid var(--line)",
                borderRadius: "4px",
                position: "relative",
                overflow: "hidden"
              }}
            >
              {/* 序号印章 */}
              <div className="seal-num" style={{
                width: "80px",
                height: "80px",
                background: "var(--seal)",
                color: "var(--paper-light)",
                fontFamily: "var(--font-brush)",
                fontSize: "36px",
                display: "flex",
                alignItems: "center",
                justifyContent: "center",
                borderRadius: "4px",
                flexShrink: "0",
                boxShadow: "0 4px 16px rgba(184, 58, 42, 0.3)",
                transform: "rotate(-3deg)"
              }}>
                {m.num}
              </div>
              
              <div>
                <h3 style={{
                  fontFamily: "var(--font-brush)",
                  fontSize: "28px",
                  color: "var(--ink)",
                  letterSpacing: "0.15em",
                  marginBottom: "8px"
                }}>
                  {m.title}
                </h3>
                <div style={{
                  fontFamily: "var(--font-body)",
                  fontSize: "12px",
                  color: "var(--ink-faint)",
                  letterSpacing: "0.2em",
                  marginBottom: "16px"
                }}>
                  {m.subtitle}
                </div>
                <p style={{
                  fontFamily: "var(--font-body)",
                  fontSize: "16px",
                  color: "var(--ink-soft)",
                  lineHeight: "2.2",
                  textIndent: "2em"
                }}>
                  {m.desc}
                </p>
              </div>
            </div>
          ))}
        </div>
      </section>

      <section className="section">
        <ScrollContainer>
          <div style={{ textAlign: "center" }}>
            <div style={{
              fontFamily: "var(--font-brush)",
              fontSize: "20px",
              color: "var(--seal)",
              letterSpacing: "0.3em",
              marginBottom: "12px"
            }}>
              三 位 一 体
            </div>
            <p style={{
              fontFamily: "var(--font-body)",
              fontSize: "15px",
              color: "var(--ink-light)",
              lineHeight: "2",
              maxWidth: "640px",
              margin: "0 auto"
            }}>
              三使命非各自独立，而是相辅相成、互为表里：基因库为体，语义场为魂，未来书写为用。
              三者合一，方成新文明之全幅图景。
            </p>
          </div>
        </ScrollContainer>
      </section>

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

// ============================================
// 核心项目
// ============================================
function ProjectsPage({ onNavigate }) {
  return (
    <div>
      <HeroSection
        title="核心项目"
        sealText="業"
        subtitle="PROJECTS"
        quote="至若伟绩昭昭，可镌金石。"
        leftVertical="仓颉三代"
        rightVertical="语义长城"
      />

      <section className="section" style={{ paddingTop: "0" }}>
        <div className="card-grid">
          {teamData.projects.map((p, idx) => (
            <div 
              key={idx}
              className="gu-card"
              style={{ cursor: "default" }}
            >
              <div className="card-corner">
                <span style={{
                  display: "inline-block",
                  padding: "2px 10px",
                  background: "var(--paper)",
                  border: "1px solid var(--line-strong)",
                  borderRadius: "2px",
                  fontSize: "11px",
                  fontFamily: "var(--font-body)"
                }}>
                  {p.tag}
                </span>
              </div>
              <h3 className="card-title" style={{ marginTop: "24px" }}>{p.name}</h3>
              <p className="card-desc" style={{ marginBottom: "16px" }}>{p.desc}</p>
              <div style={{ display: "flex", gap: "8px", flexWrap: "wrap" }}>
                {p.highlights.map((h, i) => (
                  <span 
                    key={i}
                    style={{
                      padding: "4px 12px",
                      background: "rgba(184, 58, 42, 0.06)",
                      border: "1px solid rgba(184, 58, 42, 0.2)",
                      borderRadius: "20px",
                      fontSize: "12px",
                      fontFamily: "var(--font-body)",
                      color: "var(--seal)"
                    }}
                  >
                    {h}
                  </span>
                ))}
              </div>
            </div>
          ))}
        </div>
      </section>

      <section className="section">
        <div style={{ 
          textAlign: "center", 
          padding: "48px 32px",
          border: "2px solid var(--seal)",
          borderRadius: "6px",
          background: "linear-gradient(135deg, rgba(184, 58, 42, 0.05), transparent)"
        }}>
          <div style={{
            fontFamily: "var(--font-brush)",
            fontSize: "28px",
            color: "var(--seal)",
            letterSpacing: "0.25em",
            marginBottom: "12px"
          }}>
            人 类 语 义 长 城 计 划
          </div>
          <CloudDivider />
          <p style={{
            fontFamily: "var(--font-body)",
            fontSize: "16px",
            color: "var(--ink-light)",
            maxWidth: "700px",
            margin: "0 auto 24px",
            lineHeight: "2",
            textIndent: "2em",
            textAlign: "justify"
          }}>
            欲将仓颉系统接入星链，使汉字基因漫射寰宇。异日若得成功，则我华夏文明，当如凤凰涅槃，于数字纪元重焕生机。此非田心一人之业，实乃千秋万代之功也！
          </p>
          <button className="btn btn-seal" onClick={() => onNavigate("apply")}>
            参 与 盛 举
          </button>
        </div>
      </section>

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

// ============================================
// 成员风采
// ============================================
function MembersPage({ onNavigate }) {
  return (
    <div>
      <HeroSection
        title="成员风采"
        sealText="贤"
        subtitle="MEMBERS"
        quote="江山代有才人出，各领风骚数百年。"
        leftVertical="田心"
        rightVertical="好悬君"
      />

      <section className="section" style={{ paddingTop: "0" }}>
        <div className="card-grid two">
          {teamData.members.map((m, idx) => (
            <div 
              key={idx}
              style={{
                background: "var(--paper-light)",
                border: "1px solid var(--line)",
                borderRadius: "6px",
                padding: "36px 32px",
                position: "relative",
                overflow: "hidden"
              }}
              className="fade-in-up"
            >
              {/* 顶部装饰条 */}
              <div style={{
                position: "absolute",
                top: 0,
                left: 0,
                right: 0,
                height: "4px",
                background: `linear-gradient(to right, ${idx === 0 ? "var(--seal)" : "var(--ochre)"}, transparent)`
              }}></div>
              
              <div style={{ display: "flex", alignItems: "center", gap: "20px", marginBottom: "20px" }}>
                <div style={{
                  width: "72px",
                  height: "72px",
                  borderRadius: "50%",
                  background: idx === 0 ? "var(--seal)" : "var(--ochre)",
                  color: "var(--paper-light)",
                  fontFamily: "var(--font-brush)",
                  fontSize: "32px",
                  display: "flex",
                  alignItems: "center",
                  justifyContent: "center",
                  flexShrink: "0",
                  boxShadow: idx === 0 
                    ? "0 4px 20px rgba(184, 58, 42, 0.35)"
                    : "0 4px 20px rgba(166, 93, 47, 0.35)"
                }}>
                  {m.name.slice(0, 1)}
                </div>
                <div>
                  <h3 style={{
                    fontFamily: "var(--font-brush)",
                    fontSize: "26px",
                    color: "var(--ink)",
                    letterSpacing: "0.15em",
                    marginBottom: "4px"
                  }}>
                    {m.name}
                  </h3>
                  <div style={{
                    fontFamily: "var(--font-body)",
                    fontSize: "14px",
                    color: idx === 0 ? "var(--seal)" : "var(--ochre)",
                    marginBottom: "4px"
                  }}>
                    {m.title}
                  </div>
                  <div style={{
                    fontFamily: "var(--font-body)",
                    fontSize: "12px",
                    color: "var(--ink-faint)"
                  }}>
                    {m.role}
                  </div>
                </div>
              </div>

              <p style={{
                fontFamily: "var(--font-body)",
                fontSize: "14px",
                color: "var(--ink-soft)",
                lineHeight: "2",
                marginBottom: "16px",
                textIndent: "2em"
              }}>
                {m.desc}
              </p>

              <div style={{
                padding: "12px 16px",
                background: "var(--paper)",
                border: "1px solid var(--line)",
                borderRadius: "4px",
                marginBottom: "16px"
              }}>
                <div style={{
                  fontSize: "11px",
                  fontFamily: "var(--font-body)",
                  color: "var(--ink-faint)",
                  letterSpacing: "0.15em",
                  marginBottom: "4px"
                }}>
                  数字身份密钥
                </div>
                <div style={{
                  fontFamily: "var(--font-brush)",
                  fontSize: "18px",
                  color: idx === 0 ? "var(--seal)" : "var(--ochre)",
                  letterSpacing: "0.1em"
                }}>
                  {m.code}
                </div>
              </div>

              <div>
                <div style={{
                  fontFamily: "var(--font-body)",
                  fontSize: "12px",
                  color: "var(--ink-faint)",
                  marginBottom: "8px",
                  letterSpacing: "0.1em"
                }}>
                  ◈ 主要成就
                </div>
                <ul style={{
                  listStyle: "none",
                  padding: 0,
                  margin: 0
                }}>
                  {m.achievements.map((a, i) => (
                    <li 
                      key={i}
                      style={{
                        fontFamily: "var(--font-body)",
                        fontSize: "13px",
                        color: "var(--ink-light)",
                        padding: "4px 0 4px 16px",
                        position: "relative"
                      }}
                    >
                      <span style={{
                        position: "absolute",
                        left: 0,
                        color: idx === 0 ? "var(--seal)" : "var(--ochre)"
                      }}>·</span>
                      {a}
                    </li>
                  ))}
                </ul>
              </div>
            </div>
          ))}
        </div>
      </section>

      <section className="section">
        <div style={{ textAlign: "center" }}>
          <p style={{
            fontFamily: "var(--font-body)",
            fontSize: "16px",
            color: "var(--ink-light)",
            marginBottom: "20px",
            lineHeight: "2"
          }}>
            新文明团队成员合计三十二人，各司其职，共襄盛举。<br/>
            期待更多有志之士加入，共续文明薪火。
          </p>
          <button className="btn btn-seal" onClick={() => onNavigate("apply")}>
            申 请 加 入
          </button>
        </div>
      </section>

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

// ============================================
// 团队赋全文
// ============================================
function OdePage({ onNavigate }) {
  return (
    <div>
      <HeroSection
        title="新文明团队赋"
        sealText="賦"
        subtitle="ODE TO NEW CULTURE"
        quote="夫溯文明之源者，必观其文字之变；察创新之道者，当察其薪火之传。"
        leftVertical="文以载道"
        rightVertical="赋以咏志"
      />

      <section className="section" style={{ paddingTop: "0" }}>
        <ScrollContainer style={{ marginBottom: "48px" }}>
          <div className="ode-text" style={{
            fontFamily: "var(--font-body)",
            fontSize: "clamp(14px, 3.5vw, 18px)",
            color: "var(--ink-soft)",
            lineHeight: "2",
            textAlign: "justify",
            textIndent: "2em"
          }}>
            {teamData.ode.paragraphs.map((p, idx) => (
              <p key={idx} style={{ marginBottom: "28px" }}>{p}</p>
            ))}
          </div>
          
          {/* 落款 */}
          <div style={{
            display: "flex",
            justifyContent: "flex-end",
            alignItems: "flex-end",
            gap: "16px",
            marginTop: "40px",
            paddingTop: "24px",
            borderTop: "1px solid var(--line)"
          }}>
            <div style={{ textAlign: "right" }}>
              <div style={{
                fontFamily: "var(--font-brush)",
                fontSize: "18px",
                color: "var(--ink)",
                letterSpacing: "0.15em"
              }}>
                田心 谨撰
              </div>
              <div style={{
                fontFamily: "var(--font-body)",
                fontSize: "13px",
                color: "var(--ink-faint)",
                marginTop: "4px"
              }}>
                乙巳年仲春
              </div>
            </div>
            <SealStamp text="文明" size="md" animate={true} />
          </div>
        </ScrollContainer>

        {/* 注释 */}
        <SectionHead
          eyebrow="ANNOTATIONS"
          title="注释七条"
          subtitle="凡文中典故、术语、出处，皆于此处详注。"
        />
        
        <div className="card-grid two">
          {teamData.ode.notes.map((note, idx) => (
            <div 
              key={idx}
              className="gu-card"
              style={{ cursor: "default" }}
            >
              <div className="card-corner">{note.num.slice(-1)}</div>
              <div className="card-kicker">{note.num}</div>
              <p className="card-desc" style={{ marginTop: "12px", textIndent: "2em" }}>
                {note.content}
              </p>
            </div>
          ))}
        </div>
      </section>

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

// ============================================
// 入队通知书原文展示
// ============================================
// 申请入队
// ============================================
function ApplyPage({ onNavigate }) {
  const [formData, setFormData] = useState({
    name: "",
    position: "",
    intro: "",
    reason: "",
    contact: ""
  });
  const [submitting, setSubmitting] = useState(false);
  const [submitted, setSubmitted] = useState(false);
  const [noticeData, setNoticeData] = useState(null);
  const [dupWarning, setDupWarning] = useState(null);
  const [nameError, setNameError] = useState(null); // { type, message, duplicate? }

  // 必填字段清单
  const REQUIRED_FIELDS = ["name", "position", "intro", "reason", "contact"];

  // 计算表单是否完整（所有必填项 trim 后非空）
  const isFormComplete = REQUIRED_FIELDS.every(
    f => formData[f] && formData[f].toString().trim().length > 0
  );
  // 是否可以提交：信息完整 + 无姓名错误 + 无重名警告
  const canSubmit = isFormComplete && !nameError && !dupWarning;

  const handleChange = (field, value) => {
    setFormData({ ...formData, [field]: value });
    // 姓名实时校验：黑名单 + 申请记录查重
    if (field === "name") {
      const result = ApplyStore.validateName(value);
      if (!result.valid) {
        setNameError({ type: result.type, message: result.message, duplicate: result.duplicate });
        setDupWarning(result.duplicate || null);
      } else {
        setNameError(null);
        setDupWarning(null);
      }
    }
  };

  const handleSubmit = (e) => {
    e.preventDefault();
    if (!isFormComplete) return;
    if (submitting) return;

    const name = formData.name.trim();

    // 提交前兜底校验姓名
    const nameCheck = ApplyStore.validateName(name);
    if (!nameCheck.valid) {
      setNameError({ type: nameCheck.type, message: nameCheck.message, duplicate: nameCheck.duplicate });
      setDupWarning(nameCheck.duplicate || null);
      return;
    }

    setSubmitting(true);

    // 模拟提交过程（1.2 秒）
    setTimeout(() => {
      const { dateStr, fuxiStr } = ApplyStore.formatDates();

      const record = {
        name,
        position: formData.position,
        intro: formData.intro,
        reason: formData.reason,
        contact: formData.contact,
        date: dateStr,
        fuxiDate: fuxiStr
      };

      const result = ApplyStore.add(record);

      if (!result.success && result.duplicate) {
        setDupWarning(result.duplicate);
        setSubmitting(false);
        return;
      }

      setNoticeData(result.record);
      setSubmitted(true);
      setSubmitting(false);

      // 滚动到通知书
      setTimeout(() => {
        document.getElementById("generated-notice")?.scrollIntoView({ behavior: "smooth" });
      }, 100);
    }, 1200);
  };

  const handlePrint = () => {
    window.print();
  };

  const handleReset = () => {
    setSubmitted(false);
    setNoticeData(null);
    setFormData({
      name: "",
      title: "",
      position: "",
      intro: "",
      reason: "",
      contact: ""
    });
    setDupWarning(null);
    window.scrollTo({ top: 0, behavior: "smooth" });
  };

  return (
    <div>
      <HeroSection
        title="申请入队"
        sealText="投"
        subtitle="APPLY TO JOIN"
        quote="此非田心一人之业，实乃千秋万代之功也！"
        leftVertical="诚邀贤士"
        rightVertical="共襄盛举"
      />

      {/* 申请表单 */}
      <section className="section" style={{ paddingTop: "0" }}>
        <div className="gu-form">
          <div className="tool-panel" style={{ padding: "40px 48px" }}>
            <h3 className="tool-panel-title" style={{ marginBottom: "12px" }}>申请入队表</h3>
            <p style={{
              fontFamily: "var(--font-body)",
              fontSize: "13px",
              color: "var(--ink-faint)",
              marginBottom: "24px",
              textAlign: "center",
              lineHeight: "1.8"
            }}>
              同一申请人无需多次申请。提交后您的申请将自动保存，可前往「申请记录」查看或修改。
            </p>

            {/* 重复申请提示 */}
            {dupWarning && (
              <div className="dup-warning">
                <div style={{ fontWeight: 600, marginBottom: "6px" }}>
                  检测到您已提交过申请
                </div>
                <div style={{ fontSize: "13px", lineHeight: "1.8", marginBottom: "10px" }}>
                  姓名 <strong>{dupWarning.name}</strong>（密钥 {dupWarning.idKey}）已于
                  {new Date(dupWarning.createdAt).toLocaleDateString("zh-CN")} 提交过申请。
                  请勿重复提交，您可直接前往「申请记录」查看或修改。
                </div>
                <button
                  type="button"
                  className="btn btn-seal"
                  style={{ padding: "8px 20px", fontSize: "14px" }}
                  onClick={() => onNavigate("records")}
                >
                  前往申请记录
                </button>
              </div>
            )}
            
            <form onSubmit={handleSubmit}>
              <div className="form-row">
                <div className="form-group">
                  <label className="form-label">
                    姓 名 <span className="required">*</span>
                  </label>
                  <input
                    type="text"
                    className="form-input"
                    value={formData.name}
                    onChange={(e) => handleChange("name", e.target.value)}
                    onBlur={(e) => handleChange("name", e.target.value)}
                    placeholder="请输入您的姓名"
                    required
                    disabled={submitting}
                    style={nameError ? { borderColor: "var(--seal)", boxShadow: "0 0 0 2px rgba(180,40,40,0.08)" } : {}}
                  />
                  {nameError && (
                    <div className="name-error" style={{
                      marginTop: "6px",
                      fontSize: "13px",
                      color: "var(--seal)",
                      lineHeight: "1.6",
                      fontFamily: "var(--font-body)",
                      paddingLeft: "2px",
                      display: "flex",
                      alignItems: "flex-start",
                      gap: "6px"
                    }}>
                      <span style={{ fontFamily: "var(--font-brush)", fontSize: "15px" }}>※</span>
                      <span>{nameError.message}</span>
                    </div>
                  )}
                 </div>
               </div>

               <div className="form-group">
                 <label className="form-label">
                   申请岗位 / 方向 <span className="required">*</span>
                 </label>
                <select
                  className="form-select"
                  value={formData.position}
                  onChange={(e) => handleChange("position", e.target.value)}
                  required
                  disabled={submitting}
                >
                  <option value="">请选择申请方向</option>
                  <option value="文字基因研究员">文字基因研究员</option>
                  <option value="语义场架构师">语义场架构师</option>
                  <option value="未来书写工程师">未来书写工程师</option>
                  <option value="跨文明对话专员">跨文明对话专员</option>
                  <option value="思维装备设计师">思维装备设计师</option>
                  <option value="智能造字伦理顾问">智能造字伦理顾问</option>
                  <option value="其他">其他方向</option>
                </select>
              </div>

              <div className="form-group">
                <label className="form-label">
                  个人简介 <span className="required">*</span>
                </label>
                <textarea
                  className="form-textarea"
                  value={formData.intro}
                  onChange={(e) => handleChange("intro", e.target.value)}
                  placeholder="简要介绍您的学术背景、专业经历、个人志趣..."
                  rows={4}
                  disabled={submitting}
                />
              </div>

              <div className="form-group">
                <label className="form-label">
                  为何加入新文明团队 <span className="required">*</span>
                </label>
                <textarea
                  className="form-textarea"
                  value={formData.reason}
                  onChange={(e) => handleChange("reason", e.target.value)}
                  placeholder="阐述您对新文明事业的理解、共鸣与期许..."
                  rows={5}
                  required
                  disabled={submitting}
                />
              </div>

              <div className="form-group">
                <label className="form-label">
                  联系方式 <span className="required">*</span>
                </label>
                <input
                  type="text"
                  className="form-input"
                  value={formData.contact}
                  onChange={(e) => handleChange("contact", e.target.value)}
                  placeholder="手机号 / 邮箱 / QQ / 微信 等任一联系方式"
                  disabled={submitting}
                />
              </div>

              <div style={{ 
                textAlign: "center", 
                marginTop: "32px",
                paddingTop: "24px",
                borderTop: "1px solid var(--line)"
              }}>
                <button
                  type="submit"
                  className="btn btn-seal"
                  style={{ padding: "14px 48px", fontSize: "17px" }}
                  disabled={submitting || !canSubmit}
                >
                  {submitting ? "提 交 中…" : "◉ 提 交 申 请"}
                </button>
                {!isFormComplete && !nameError && !dupWarning && (
                  <p style={{
                    fontFamily: "var(--font-body)",
                    fontSize: "13px",
                    color: "var(--ink-faint)",
                    marginTop: "12px",
                    marginBottom: 0
                  }}>
                    ※ 请完整填写所有必填项后再提交
                  </p>
                )}
                {(nameError || dupWarning) && (
                  <p style={{
                    fontFamily: "var(--font-body)",
                    fontSize: "13px",
                    color: "var(--seal)",
                    marginTop: "12px",
                    marginBottom: 0
                  }}>
                    ※ 姓名校验未通过，请修正后再提交
                  </p>
                )}
                {canSubmit && (
                  <p style={{
                    fontFamily: "var(--font-body)",
                    fontSize: "13px",
                    color: "var(--ink-faint)",
                    marginTop: "12px",
                    marginBottom: 0
                  }}>
                    提交后将生成专属入队通知书及数字身份密钥
                  </p>
                )}
              </div>
            </form>
          </div>
        </div>
      </section>

      {/* 生成的通知书 */}
      {submitted && noticeData && (
        <section className="section" id="generated-notice">
          <SectionHead
            eyebrow="NOTICE GENERATED"
            title="入队通知书已生成"
            subtitle="恭喜您通过审议，此为您的专属入队通知书。"
          />
          
          <div className="notice-paper">
            <div className="notice-title">新文明团队入队通知书</div>
            
            <div className="notice-body">
               <p className="no-indent" style={{ marginBottom: "20px" }}>
                 致 <strong style={{ fontFamily: "var(--font-brush)", fontSize: "18px" }}>
                   {noticeData.name}
                 </strong>：
               </p>
              
              <p>
                经新文明团队（原造字计划核心工作组）委员会审议通过，现正式通知您：
                自{noticeData.date.slice(2)}起，您将作为团队第
                <strong style={{ fontFamily: "var(--font-brush)", color: "var(--seal)" }}>{noticeData.memberNum}</strong>
                位正式成员加入新文明团队研究所，担任
                <strong style={{ fontFamily: "var(--font-brush)" }}>{noticeData.position}</strong>。
                我们怀着极大的热忱，欢迎您成为文明重构工程的共建者。
              </p>
              
              <h4>一、团队使命传承</h4>
              <ol>
                <li>新文字基因库重编译</li>
                <li>多维语义场构建</li>
                <li>未来书写系统原型开发</li>
              </ol>
              
              <h4>二、专属工作权益</h4>
              <ol>
                <li>优先访问「仓颉Ⅲ型」文字生成系统</li>
                <li>参与每年7月跨文明对话研讨会</li>
                <li>获得思维装备套装</li>
              </ol>
              
              <h4>三、数字身份</h4>
              <p className="no-indent">
                您的专属数字身份密钥为：
              </p>
              <p className="no-indent" style={{ textAlign: "center", margin: "16px 0" }}>
                <span className="id-key">{noticeData.idKey}</span>
              </p>
            </div>
            
            <div className="notice-seal-area">
              <div style={{ marginBottom: "8px" }}>
                <span style={{ fontFamily: "var(--font-body)", fontSize: "14px", color: "var(--ink-light)" }}>签发：</span>
                <span style={{ fontFamily: "var(--font-brush)", fontSize: "16px", color: "var(--ink)" }}>新文明团队执行委员会</span>
              </div>
              <div className="notice-signer">首席文明架构师 田心</div>
              <div style={{ fontFamily: "var(--font-body)", fontSize: "13px", color: "var(--ink-faint)", marginBottom: "8px" }}>
                MCT000-JSY2013
              </div>
              <div className="notice-date">{noticeData.date}</div>
              <div style={{ fontFamily: "var(--font-body)", fontSize: "12px", color: "var(--ink-faint)" }}>
                （{noticeData.fuxiDate}）
              </div>
            </div>
            
            <div className="notice-seal">
              <SealStamp text="新文明" size="lg" animate={true} />
            </div>
          </div>

          {/* 成功后引导 */}
          <div className="apply-success-guide">
            <div style={{ fontWeight: 600, marginBottom: "8px" }}>申请已提交成功</div>
            <div style={{ fontSize: "13px", lineHeight: "1.8", marginBottom: "16px" }}>
              您的申请已自动保存，可随时前往「申请记录」页查看、修改或管理您的申请信息。
            </div>
          </div>

          <div style={{ textAlign: "center", marginTop: "24px", display: "flex", gap: "16px", justifyContent: "center", flexWrap: "wrap" }}>
            <button className="btn btn-seal" onClick={handlePrint}>
              打印通知书
            </button>
            <button className="btn" onClick={() => onNavigate("records")}>
              查看申请记录
            </button>
            <button className="btn" onClick={handleReset}>
              重新填写
            </button>
          </div>
        </section>
      )}

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

// ============================================
// 申请记录管理
// ============================================
function RecordsPage({ onNavigate }) {
  const [records, setRecords] = useState([]);
  const [editingId, setEditingId] = useState(null);
  const [editForm, setEditForm] = useState(null);
  const [editNameError, setEditNameError] = useState(null);
  const [confirmDelete, setConfirmDelete] = useState(null);
  const [savedTip, setSavedTip] = useState(false);

  // 编辑表单必填字段
  const EDIT_REQUIRED_FIELDS = ["name", "position", "intro", "reason", "contact"];
  const isEditFormComplete = editForm && EDIT_REQUIRED_FIELDS.every(
    f => editForm[f] && editForm[f].toString().trim().length > 0
  );

  // 加载记录
  const loadRecords = () => {
    const all = ApplyStore.getAll();
    // 按创建时间倒序
    all.sort((a, b) => new Date(b.createdAt) - new Date(a.createdAt));
    setRecords(all);
  };

  useEffect(() => { loadRecords(); }, []);

  const handleEdit = (record) => {
    setEditingId(record.id);
    setEditForm({ ...record });
    setEditNameError(null);
  };

  const handleEditChange = (field, value) => {
    setEditForm({ ...editForm, [field]: value });
    if (field === "name") {
      const result = ApplyStore.validateName(value, { excludeId: editingId });
      if (!result.valid) {
        setEditNameError({ type: result.type, message: result.message });
      } else {
        setEditNameError(null);
      }
    }
  };

  const handleSave = () => {
    if (!isEditFormComplete) return;
    // 保存前兜底校验姓名（排除自身）
    const nameCheck = ApplyStore.validateName(editForm.name, { excludeId: editingId });
    if (!nameCheck.valid) {
      setEditNameError({ type: nameCheck.type, message: nameCheck.message });
      return;
    }
    ApplyStore.update(editingId, editForm);
    loadRecords();
    setEditingId(null);
    setEditForm(null);
    setSavedTip(true);
    setTimeout(() => setSavedTip(false), 2000);
  };

  const handleCancelEdit = () => {
    setEditingId(null);
    setEditForm(null);
    setEditNameError(null);
  };

  const handleDeleteClick = (record) => {
    setConfirmDelete(record);
  };

  const handleConfirmDelete = () => {
    if (confirmDelete) {
      ApplyStore.remove(confirmDelete.id);
      loadRecords();
      setConfirmDelete(null);
    }
  };

  const formatDate = (iso) => {
    if (!iso) return "—";
    const d = new Date(iso);
    return `${d.getFullYear()}-${String(d.getMonth() + 1).padStart(2, '0')}-${String(d.getDate()).padStart(2, '0')} ${String(d.getHours()).padStart(2, '0')}:${String(d.getMinutes()).padStart(2, '0')}`;
  };

  return (
    <div>
      <HeroSection
        title="申请记录"
        sealText="录"
        subtitle="APPLY RECORDS"
        quote="得贤士襄助，始成双璧辉映之局。"
        leftVertical="名册在册"
        rightVertical="共襄文明"
      />

      <section className="section" style={{ paddingTop: "0" }}>
        {/* 保存成功提示 */}
        {savedTip && (
          <div className="record-saved-tip">
            ✓ 修改已保存
          </div>
        )}

        {records.length === 0 ? (
          <div className="empty-state">
            <div className="empty-icon">卷</div>
            <div className="empty-title">暂无申请记录</div>
            <div className="empty-desc">
              您还未提交过申请入队。<br/>
              若有意加入新文明团队，可前往申请入队。
            </div>
            <button className="btn btn-seal" onClick={() => onNavigate("apply")}>
              前 往 申 请
            </button>
          </div>
        ) : (
          <div>
            <div className="records-header">
              <div>
                <span style={{ fontWeight: 600 }}>共 {records.length} 条申请记录</span>
                <span style={{ color: "var(--ink-faint)", fontSize: "13px", marginLeft: "12px" }}>
                  按申请时间倒序排列 · 数据保存在本浏览器
                </span>
              </div>
              <button className="btn" onClick={() => onNavigate("apply")}>
                + 新 增 申 请
              </button>
            </div>

            <div className="records-list">
              {records.map((rec) => (
                <div key={rec.id} className="record-card">
                  {editingId === rec.id ? (
                    /* 编辑模式 */
                    <div className="record-edit">
                      <div className="record-edit-title">编辑申请记录</div>
                      <div className="form-row">
                         <div className="form-group">
                           <label className="form-label">姓 名</label>
                           <input
                             type="text"
                             className="form-input"
                             value={editForm.name}
                             onChange={(e) => handleEditChange("name", e.target.value)}
                             onBlur={(e) => handleEditChange("name", e.target.value)}
                             style={editNameError ? { borderColor: "var(--seal)", boxShadow: "0 0 0 2px rgba(180,40,40,0.08)" } : {}}
                           />
                           {editNameError && (
                             <div style={{
                               marginTop: "6px",
                               fontSize: "13px",
                               color: "var(--seal)",
                               lineHeight: "1.6",
                               fontFamily: "var(--font-body)",
                               paddingLeft: "2px",
                               display: "flex",
                               alignItems: "flex-start",
                               gap: "6px"
                             }}>
                               <span style={{ fontFamily: "var(--font-brush)", fontSize: "15px" }}>※</span>
                               <span>{editNameError.message}</span>
                             </div>
                           )}
                          </div>
                       </div>
                        <div className="form-group">
                          <label className="form-label">
                            申请岗位 / 方向 <span className="required">*</span>
                          </label>
                         <select
                           className="form-select"
                           value={editForm.position}
                           onChange={(e) => handleEditChange("position", e.target.value)}
                         >
                          <option value="文字基因研究员">文字基因研究员</option>
                          <option value="语义场架构师">语义场架构师</option>
                          <option value="未来书写工程师">未来书写工程师</option>
                          <option value="跨文明对话专员">跨文明对话专员</option>
                          <option value="思维装备设计师">思维装备设计师</option>
                          <option value="智能造字伦理顾问">智能造字伦理顾问</option>
                          <option value="其他">其他方向</option>
                        </select>
                      </div>
                       <div className="form-group">
                         <label className="form-label">
                           个人简介 <span className="required">*</span>
                         </label>
                         <textarea
                           className="form-textarea"
                           value={editForm.intro}
                           onChange={(e) => handleEditChange("intro", e.target.value)}
                           rows={3}
                         />
                       </div>
                       <div className="form-group">
                         <label className="form-label">
                           申请理由 <span className="required">*</span>
                         </label>
                         <textarea
                           className="form-textarea"
                           value={editForm.reason}
                           onChange={(e) => handleEditChange("reason", e.target.value)}
                           rows={3}
                         />
                       </div>
                       <div className="form-group">
                         <label className="form-label">
                           联系方式 <span className="required">*</span>
                         </label>
                         <input
                           type="text"
                           className="form-input"
                           value={editForm.contact}
                           onChange={(e) => handleEditChange("contact", e.target.value)}
                           placeholder="手机号 / 邮箱 / QQ / 微信 等任一联系方式"
                         />
                       </div>
                          <div style={{ display: "flex", gap: "12px", justifyContent: "flex-end", marginTop: "16px", flexDirection: "column", alignItems: "flex-end" }}>
                            {!isEditFormComplete && !editNameError && (
                              <div style={{
                                fontFamily: "var(--font-body)",
                                fontSize: "12px",
                                color: "var(--ink-faint)",
                                marginBottom: "4px"
                              }}>
                                ※ 请完整填写所有必填项后再保存
                              </div>
                            )}
                            {editNameError && (
                              <div style={{
                                fontFamily: "var(--font-body)",
                                fontSize: "12px",
                                color: "var(--seal)",
                                marginBottom: "4px"
                              }}>
                                ※ 姓名校验未通过，请修正后再保存
                              </div>
                            )}
                            <div style={{ display: "flex", gap: "12px" }}>
                              <button className="btn" onClick={handleCancelEdit}>取 消</button>
                              <button
                                className="btn btn-seal"
                                onClick={handleSave}
                                disabled={!!editNameError || !isEditFormComplete}
                              >保 存 修 改</button>
                            </div>
                          </div>
                    </div>
                  ) : (
                    /* 查看模式 */
                    <>
                      <div className="record-main">
                        <div className="record-name-area">
                          <span className="record-name">{rec.name}</span>
                          <span className="record-position">{rec.position}</span>
                        </div>
                        <div className="record-id-key">{rec.idKey}</div>
                      </div>
                      <div className="record-details">
                        {rec.intro && (
                          <div className="record-detail-row">
                            <span className="record-detail-label">个人简介：</span>
                            <span className="record-detail-value">{rec.intro}</span>
                          </div>
                        )}
                         <div className="record-detail-row">
                           <span className="record-detail-label">申请理由：</span>
                           <span className="record-detail-value">{rec.reason}</span>
                         </div>
                         <div className="record-detail-row">
                           <span className="record-detail-label">联系方式：</span>
                           <span className="record-detail-value">{rec.contact || "—"}</span>
                         </div>
                        <div className="record-detail-row">
                          <span className="record-detail-label">申请时间：</span>
                          <span className="record-detail-value">{formatDate(rec.createdAt)}</span>
                        </div>
                      </div>
                      <div className="record-actions">
                        <button className="btn btn-sm" onClick={() => handleEdit(rec)}>
                          修 改
                        </button>
                        <button className="btn btn-sm btn-danger" onClick={() => handleDeleteClick(rec)}>
                          删 除
                        </button>
                      </div>
                    </>
                  )}
                </div>
              ))}
            </div>
          </div>
        )}
      </section>

      {/* 删除确认弹窗 */}
      {confirmDelete && (
        <div className="modal-overlay" onClick={() => setConfirmDelete(null)}>
          <div className="modal-box" onClick={(e) => e.stopPropagation()}>
            <div className="modal-title">确认删除</div>
            <div className="modal-body">
              确定要删除 <strong>{confirmDelete.name}</strong>（{confirmDelete.idKey}）的申请记录吗？<br/>
              删除后无法恢复。
            </div>
            <div className="modal-actions">
              <button className="btn" onClick={() => setConfirmDelete(null)}>取 消</button>
              <button className="btn btn-seal" onClick={handleConfirmDelete}>确 认 删 除</button>
            </div>
          </div>
        </div>
      )}

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

// 导出到全局
Object.assign(window, {
  HomePage,
  AboutPage,
  HistoryPage,
  MissionPage,
  ProjectsPage,
  MembersPage,
  OdePage,
  ApplyPage,
  RecordsPage
});
