"""口調だけの依頼に、過去投稿の本数と、過去投稿に足す材料を変えて投稿を作らせる。11条件 × お題3 × 8回。"""
import concurrent.futures as cf, json, pathlib, subprocess, sys, tempfile
from materials import *

N = int(sys.argv[1]) if len(sys.argv) > 1 else 8
OUT = pathlib.Path("runs"); OUT.mkdir(exist_ok=True)
QA = pathlib.Path("qa"); QA.mkdir(exist_ok=True)
CORE = "\n\n".join([BLOG, SERVICE])

# 条件名: (過去投稿の本数, 見本の注意書きを付けるか, 足す材料)
CONDS = {
 "base":   (0, False, ""),
 "S3":     (3, True, ""),
 "S10":    (10, True, ""),
 "S30":    (30, True, ""),
 "S10raw": (10, False, ""),   # 注意書きなし
 "S10N":   (10, True, "N"),   # 体験・考えのメモ
 "S10A":   (10, True, "A"),   # 言わない表現と理由
 "S10R":   (10, True, "R"),   # 直した理由だけ（例文なし）
 "S10P":   (10, True, "P"),   # 今回の立場・読者・目的
 "S10ALL": (10, True, "NARP"),
 "S10Q":   (10, True, "Q"),   # 質問で体験を引き出す
}

def run(prompt):
    with tempfile.TemporaryDirectory() as d:
        r = subprocess.run(["claude", "-p", "--tools", "", "--no-session-persistence",
                            "--disable-slash-commands", "--output-format", "json"],
                           input=prompt, capture_output=True, text=True, cwd=d, timeout=900)
    return json.loads(r.stdout)["result"].strip()

def base_parts(cond, task):
    n, note, extra = CONDS[cond]
    parts = [f"X（旧Twitter）に載せる投稿を書いてもらいます。口調の指定：{TONE}", "# 資料（事実の根拠）", CORE]
    if n: parts += ["# 追加資料", past(n) + (PAST_NOTE if note else "")]
    return parts

def interview(task, i):
    """Q条件：AIが質問を作り、店主役（メモだけで答える）が答える。"""
    f = QA / f"{task}_{i}.json"
    if f.exists(): return json.loads(f.read_text())
    q = run("\n\n".join(base_parts("S10", task) + ["# 依頼", TASKS[task][1],
        "書く前に、店主の体験や考えを引き出す質問を3つだけ書いてください。質問だけを出力してください。答えにくい質問は避けてください。"]))
    a = run(f"あなたは小さなコーヒー焙煎所の店主本人です。次の質問に、下のメモにある範囲だけで、短く答えてください。メモにないことは『それは特にない』と答えます。作り話はしません。\n\n{NOTES}\n\n# 質問\n{q}")
    j = {"questions": q, "answers": a}; f.write_text(json.dumps(j, ensure_ascii=False, indent=1)); return j

def build(cond, task, i):
    parts = base_parts(cond, task)
    for k in CONDS[cond][2]:
        if k == "Q":
            j = interview(task, i)
            parts += ["# 追加資料（店主へのインタビュー）", f"質問：\n{j['questions']}\n\n店主の回答：\n{j['answers']}"]
        else:
            parts += ["# 追加資料", {"N": NOTES, "A": AVOID, "R": REASONS, "P": POSITION[task]}[k]]
    parts += ["# 依頼", TASKS[task][1], "投稿本文だけを出力してください。説明や前置きは不要です。資料にない事実・体験・数字は書かないでください。"]
    return "\n\n".join(parts)

def one(c, t, i):
    p = OUT / f"{c}_{t}_{i}.txt"
    if p.exists() and p.read_text().strip(): return
    p.write_text(run(build(c, t, i)))

if __name__ == "__main__":
    jobs = [(c, t, i) for c in CONDS for t in TASKS for i in range(N)]
    with cf.ThreadPoolExecutor(8) as ex:
        for f in [ex.submit(one, *j) for j in jobs]: f.result()
