import json, time, re
from pathlib import Path
from langchain_ollama import ChatOllama

OUT = Path("posts.jsonl")
llm = ChatOllama(model="llama3.2", temperature=0.7)

def clean_line(s: str) -> str:
    s = s.strip()
    s = re.sub(r'^\d+\s*[\.\)、-]\s*', '', s)     # 去编号
    s = s.strip().strip('"').strip("'")          # 去引号
    s = re.sub(r'\s+\|\s+', ' | ', s)            # 统一分隔符
    return s.strip()

def ensure_fields(line: str) -> str:
    # 目标格式：TEXT=... || CTA=... || TAGS=...
    # 如果模型没给，就自动补一个 CTA 和 TAGS 占位
    if "TEXT=" in line and "CTA=" in line and "TAGS=" in line:
        return line

    # 尝试解析你之前的：正文 | 互动句 | #tag #tag
    parts = [p.strip() for p in line.split("|")]
    text = parts[0] if parts else line
    cta = parts[1] if len(parts) >= 2 else "你会想试试哪一款？"
    tags = parts[2] if len(parts) >= 3 else "#曼彻斯特美食 #探店"

    # 清理：去掉可能的“CTA:”前缀
    cta = re.sub(r'^(CTA:|cta:)\s*', '', cta).strip()
    tags = re.sub(r'^(TAGS:|tags:)\s*', '', tags).strip()

    # 确保 tags 里每个以 # 开头
    if "#" not in tags:
        tags = "#曼彻斯特美食 #探店"

    return f"TEXT={text} || CTA={cta} || TAGS={tags}"

def generate(platform: str, brand: str, city: str, style: str, n: int = 5):
    prompt = f"""
你是餐饮品牌的社交媒体运营，只输出内容本身，不要解释。
平台：{platform}
门店：{brand}
城市：{city}
风格：{style}

请输出 {n} 条中文短帖，每条独立一行。
每条尽量包含：正文 + 一句互动引导 + 1-3个话题标签（#开头）。
规则：
- 60~140字
- 像真人分享，不要官方口吻
- 每条都要有具体场景（下班/周末/雨天/约会/外卖/加班/通勤）
- 不夸张虚假
"""
    raw = llm.invoke(prompt).content.strip()
    lines = [clean_line(ln) for ln in raw.splitlines() if ln.strip()]
    lines = [ln for ln in lines if len(ln) >= 10]
    # 兜底：如果模型输出很怪，就至少返回一条原文
    if not lines and raw:
        lines = [clean_line(raw)]
    # 统一成可机器解析格式
    fixed = [ensure_fields(ln) for ln in lines[:n]]
    return fixed[:n]

def save(platform: str, posts):
    ts = int(time.time())
    OUT.parent.mkdir(parents=True, exist_ok=True)
    with OUT.open("a", encoding="utf-8") as f:
        for p in posts:
            f.write(json.dumps(
                {"ts": ts, "platform": platform, "status": "draft", "text": p},
                ensure_ascii=False
            ) + "\n")

if __name__ == "__main__":
    posts = generate(platform="X", brand="你的店名", city="Manchester", style="自然、像朋友推荐", n=5)
    save("X", posts)
    print("已生成：")
    for i, p in enumerate(posts, 1):
        print(i, p)
