#!/usr/bin/env python3
import argparse,json
from pathlib import Path
from validate_catalog import validate

def build(catalog,out):
    root=Path(__file__).resolve().parent.parent
    data=json.loads(Path(catalog).read_text());errors,_=validate(data)
    if errors: raise ValueError('\n'.join(errors))
    demos=[]
    definitions=[('task-finder','目的から探す','情報を整理したい、比べたい。利用者の言葉を入口にする。','一覧が長く、目的が複数ある場合に使う。項目が数件なら分類を増やさない。','目的に近い言葉で検索する→0件の案内を確認する→項目から次の行動へ進む。'),('compare-options','条件を揃えて比較する','料金だけでなく、単位と制約を同じ位置で見せる。','選択肢の比較に使う。ユーザー条件を把握せず「おすすめ」を断定しない。','一人とチームを切り替える→候補と理由の変化を確認する。'),('evidence-note','根拠と判断を分ける','事実・設計仮説・未確認事項を混ぜず、判断を持ち帰れるようにする。','調査記事や検討資料に使う。引用リンクがあるだけで主張を確認済みにしない。','検証手順を開く→メモをコピーする。コピー不可の環境では手動入力欄に切り替わる。')]
    for slug,title,reason,limits,test in definitions:
        demos.append(dict(id=slug,title=title,reason=reason,limits=limits,test=test,code=(root/'assets/components'/f'{slug}.html').read_text(),prompt=f'次の課題を解く独自UIを実装してください：{title}。{reason} {limits} 既存の技術とデザイントークンを確認し、320px・キーボード操作・空状態・長い日本語で検証してください。第三者サイトのコード・画像は転載せず、仮の数値はサンプルと明示してください。'))
    serialized=json.dumps({'catalog':data,'demos':demos},ensure_ascii=False).replace('<','\\u003c').replace('\u2028','\\u2028').replace('\u2029','\\u2029')
    template=(root/'assets/atlas-template.html').read_text()
    if template.count('__PAYLOAD__')!=1: raise ValueError('payload placeholder count')
    output=Path(out);output.parent.mkdir(parents=True,exist_ok=True)
    output.write_text(template.replace('__PAYLOAD__',serialized))
    print(f'Built {output} ({output.stat().st_size} bytes)')

if __name__=='__main__':
    p=argparse.ArgumentParser();p.add_argument('--catalog',required=True);p.add_argument('--out',required=True);a=p.parse_args();build(a.catalog,a.out)
