#!/usr/bin/env python3
"""Regenerate the Research Institute PRO Hub home page from safe repo metadata."""

from __future__ import annotations

from datetime import datetime
from html import escape
from pathlib import Path
from urllib.parse import quote


ROOT = Path(__file__).resolve().parents[1]
BUCKET = "research-institute-pro-1408992348164428"
REGION = "oss-cn-beijing"
CONSOLE_ROOT = f"https://oss.console.aliyun.com/bucket/{REGION}/{BUCKET}/object?path="


def names_under(relative: str, pattern: str, limit: int = 8) -> list[str]:
    directory = ROOT / relative
    if not directory.exists():
        return []
    return sorted(item.name for item in directory.glob(pattern) if item.name != "README.md")[:limit]


def nested_skill_names() -> list[str]:
    directory = ROOT / "skills"
    if not directory.exists():
        return []
    return sorted(item.parent.name for item in directory.glob("*/SKILL.md"))


def console_object_link(object_key: str) -> str:
    return f"{CONSOLE_ROOT}{quote(object_key, safe='/')}"


def chips(items: list[str], empty: str) -> str:
    if not items:
        return f'<span class="muted">{escape(empty)}</span>'
    return "".join(f'<span class="chip">{escape(item)}</span>' for item in items)


def main() -> None:
    skills = nested_skill_names()
    workflows = names_under("workflows", "*/")
    programs = names_under("programs", "*/")
    topics = names_under("topics/skills-and-workflows", "*.md")
    docs = names_under("docs", "*.md")
    imports = names_under("imports", "*.html")
    meeting_packages = [item for item in (ROOT / "meetings").glob("*") if item.is_dir()] if (ROOT / "meetings").exists() else []
    daily_archives = [item for item in (ROOT / "archives" / "daily").glob("*") if item.is_dir()] if (ROOT / "archives" / "daily").exists() else []
    updated = datetime.now().astimezone().strftime("%Y-%m-%d")

    import_links = "".join(
        f'<a class="button" target="_blank" rel="noopener" href="{console_object_link("html/imports/" + item)}">{escape(item.removesuffix(".html"))}</a>'
        for item in imports
    ) or '<span class="muted">暂无已导入 HTML</span>'

    page = f'''<!doctype html>
<html lang="zh-CN">
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <meta name="description" content="研究院 PRO 的共享 skill、workflow、衍生子项目、协作规则与每日归档入口。">
  <title>研究院 PRO Skill Hub</title>
  <style>
    :root {{ --ink:#152033; --muted:#5f6b7a; --line:#d9e1ec; --paper:#f7f9fc; --blue:#2458d3; --green:#17805c; --white:#fff; }}
    * {{ box-sizing:border-box; }} body {{ margin:0; font-family:-apple-system,BlinkMacSystemFont,"Segoe UI","Microsoft YaHei",sans-serif; color:var(--ink); background:var(--paper); line-height:1.65; }}
    header,.band {{ background:var(--white); border-bottom:1px solid var(--line); }} .wrap {{ max-width:1120px; margin:0 auto; padding:28px 24px; }}
    .eyebrow {{ color:var(--blue); font-weight:700; margin-bottom:10px; }} h1 {{ margin:0; font-size:clamp(30px,5vw,54px); line-height:1.1; }} h2 {{ margin:0 0 10px; font-size:20px; }}
    .lead,.muted {{ color:var(--muted); }} .lead {{ max-width:820px; margin:18px 0 0; font-size:18px; }} .toolbar {{ display:flex; flex-wrap:wrap; gap:12px; margin-top:24px; }}
    .button {{ display:inline-flex; align-items:center; min-height:42px; padding:0 16px; border:1px solid var(--line); border-radius:6px; background:var(--white); color:var(--ink); text-decoration:none; font-weight:650; }} .button.primary {{ border-color:var(--blue); background:var(--blue); color:#fff; }}
    main .wrap {{ padding-top:34px; }} .grid {{ display:grid; grid-template-columns:repeat(3,minmax(0,1fr)); gap:16px; }} .card {{ background:#fff; border:1px solid var(--line); border-radius:8px; padding:20px; }} .card p {{ margin:0; color:var(--muted); }}
    .section {{ margin-top:28px; }} table {{ width:100%; border-collapse:collapse; background:#fff; border:1px solid var(--line); border-radius:8px; overflow:hidden; }} th,td {{ padding:13px 14px; border-bottom:1px solid var(--line); text-align:left; vertical-align:top; }} th {{ background:#eef3fa; color:#2b384b; font-size:14px; }} tr:last-child td {{ border-bottom:0; }}
    .status {{ display:inline-block; padding:2px 8px; border-radius:999px; background:#e8f5ef; color:var(--green); font-weight:700; font-size:13px; }} .chip {{ display:inline-block; margin:0 6px 6px 0; padding:3px 8px; border-radius:999px; background:#eef3fa; color:#2b384b; font-size:13px; }}
    .notice {{ border-left:4px solid var(--blue); padding:14px 16px; background:#eef3fa; }} footer {{ color:var(--muted); font-size:14px; padding:20px 24px 40px; text-align:center; }}
    @media (max-width:820px) {{ .grid {{ grid-template-columns:1fr; }} .wrap {{ padding-left:18px; padding-right:18px; }} table,thead,tbody,th,td,tr {{ display:block; }} thead {{ display:none; }} td {{ border-bottom:0; padding:10px 14px; }} tr {{ border-bottom:1px solid var(--line); }} tr:last-child {{ border-bottom:0; }} td::before {{ content:attr(data-label); display:block; color:var(--muted); font-size:12px; margin-bottom:2px; }} }}
  </style>
</head>
<body>
  <header><div class="wrap">
    <div class="eyebrow">Research Institute PRO · 每日同步</div>
    <h1>研究院 PRO Skill Hub</h1>
    <p class="lead">团队共享的 skills、workflows、衍生子项目、协作规则与日常知识归档都在这里。首次接入后，Codex 会在每次安全同步时自动更新项目 skills 和公开长期记忆；成员只需描述目标，不需要先学习 skill 清单。</p>
    <div class="toolbar">
      <a class="button primary" target="_blank" rel="noopener" href="{console_object_link("html")}">打开私有 OSS 内容</a>
      {import_links}
      <a class="button" href="#how">协作方式</a>
    </div>
  </div></header>
  <main><div class="wrap">
    <section class="grid" aria-label="项目定位">
      <article class="card"><h2>1. 先同步</h2><p>每次实质问答或改动前，从主分支快进同步，并自动安装最新项目 skills 与公开默认记忆。</p></article>
      <article class="card"><h2>2. 再沉淀</h2><p>把可复用做法放入 skill 或 workflow；个人问答仅归档在自己的当天目录。</p></article>
      <article class="card"><h2>3. 私有查看</h2><p>HTML 统一发布到加密的私有 OSS。协作人使用自己的 RAM 账号登录控制台查看。</p></article>
    </section>
    <section id="how" class="section"><h2>这套系统如何运转</h2><div class="notice">项目仓库是协作源头；Codex 自动安装项目 skills 并同步项目公开默认记忆；成员直接描述任务即可。互联网获取默认使用 Agent Reach，未安装时直接说“帮我装 Agent-Reach”。每日归档按协作人隔离；面向阅读的 HTML 通过私有 OSS 发布。</div></section>
    <section class="section"><h2>衍生子项目</h2><div class="notice"><strong>康比特经营决策 Agent 系统与 AI 精准运动营养中枢</strong> 已作为独立衍生子项目进入 <code>programs/kangbite-business-agent-system/</code>。当前状态为 <code>paused_discovery</code>：橘袋、精准/个性化营养内容、18 个代表产品、AI 图谱和一页纸 V2 已归档，工程尚未初始化；它不代表整个 Research Institute PRO Skill Hub，通过真实验证的通用能力才晋级到根级 skills 或 workflows。</div></section>
    <section class="section"><h2>当前目录地图</h2>
      <table><thead><tr><th>目录</th><th>当前内容</th><th>团队如何使用</th></tr></thead><tbody>
        <tr><td data-label="目录"><strong>skills/</strong></td><td data-label="当前内容">{len(skills)} 个项目 skill<br>{chips(skills, "暂无 skill")}</td><td data-label="团队如何使用">首次接入安装；以后每次项目预同步自动刷新并按任务加载。</td></tr>
        <tr><td data-label="目录"><strong>workflows/</strong></td><td data-label="当前内容">{len(workflows)} 个工作流目录<br>{chips(workflows, "暂无独立工作流")}</td><td data-label="团队如何使用">沉淀跨项目 SOP，必须包含输入、验证和失败恢复。</td></tr>
        <tr><td data-label="目录"><strong>programs/</strong></td><td data-label="当前内容">{len(programs)} 个衍生子项目<br>{chips(programs, "暂无衍生子项目")}</td><td data-label="团队如何使用">子项目独立维护入口、计划、运行材料和边界；验证后的通用能力再向根级沉淀。</td></tr>
        <tr><td data-label="目录"><strong>topics/skills-and-workflows/</strong></td><td data-label="当前内容">{len(topics)} 篇新手专题<br>{chips(topics, "暂无专题")}</td><td data-label="团队如何使用">直接描述任务即可；专题用于快速理解默认触发、边界和验收。</td></tr>
        <tr><td data-label="目录"><strong>docs/</strong></td><td data-label="当前内容">{len(docs)} 份说明<br>{chips(docs, "暂无说明")}</td><td data-label="团队如何使用">查看协作、归档、OSS 发布及限时访问规则。</td></tr>
        <tr><td data-label="目录"><strong>imports/</strong></td><td data-label="当前内容">{len(imports)} 个已迁入 HTML<br>{chips(imports, "暂无 HTML")}</td><td data-label="团队如何使用">统一以 OSS 对象方式查看，不引用本机文件链接。</td></tr>
        <tr><td data-label="目录"><strong>meetings/</strong></td><td data-label="当前内容">{len(meeting_packages)} 个会议材料包<br>{chips([item.name for item in meeting_packages], "暂无会议材料")}</td><td data-label="团队如何使用">保留原始材料、结构化纪要和可追踪待办，供成员共同迭代。</td></tr>
        <tr><td data-label="目录"><strong>archives/daily/</strong></td><td data-label="当前内容">{len(daily_archives)} 个个人-日期归档目录</td><td data-label="团队如何使用">每人只归档自己当天的问答；不记录密码、token 或客户敏感数据。</td></tr>
      </tbody></table>
    </section>
    <section class="section"><h2>今日状态</h2><p><span class="status">已生成</span> 本页由目录刷新脚本生成，最近同步日期：<strong>{escape(updated)}</strong>。定时任务每天重新生成、校验、提交并发布此首页。</p></section>
  </div></main>
  <footer>Research Institute PRO Skill Hub · 私有 OSS + 账号授权协作</footer>
</body>
</html>
'''
    (ROOT / "index.html").write_text(page, encoding="utf-8")


if __name__ == "__main__":
    main()
