#!/usr/bin/env python3
"""商家画像自动拉取脚本（v3.0 替代行业 JSON 模板）

不再要求客户经理为每个行业预置 JSON 模板。本脚本通过调用生意助手
现有的 `alibaba-analysis-brief` 能力，自动从商家近 90 天的真实店铺
数据中推断出：
  - target_products    （核心产品关键词，从店铺曝光/点击 TOP 词中推断）
  - target_countries   （目标市场，从询盘来源国 TOP 推断）
  - high_value_signals （高价值信号词，从已成交订单的产品标题中推断）
  - default_blacklist  （默认黑名单 + 行业相关补充）

【关键设计】
- 本脚本不直接调 MCP，而是 emit 一份「让 Accio Work 帮我执行」的 prompt 包，
  由生意助手主对话窗口调用 alibaba-analysis-brief 拉真实数据，
  再把结果回填给本脚本写入 config/merchant_profile.json。
- 这样既避免了脚本里嵌 MCP 调用的复杂性，又能复用 Accio 已有能力。

【使用方式】
  python scripts/fetch_merchant_profile.py --action emit-prompt
    → 输出一段提示词，复制给 Accio Work

  python scripts/fetch_merchant_profile.py --action ingest --input <path>
    → 把 Accio Work 返回的 JSON 写入 config/merchant_profile.json

  python scripts/fetch_merchant_profile.py --action show
    → 查看当前配置

【路径变量】
本脚本不含任何硬编码路径。WORKSPACE_ROOT 通过 __file__ 自动推断为
脚本所在 package 的上一级目录，跨平台（Win/Mac/Linux）通用。
"""
from __future__ import annotations
import argparse
import json
import os
import sys
import datetime
from pathlib import Path

# === 自动推断 WORKSPACE_ROOT（跨平台兼容）===
WORKSPACE_ROOT = Path(__file__).resolve().parent.parent
CONFIG_DIR = WORKSPACE_ROOT / "config"
CONFIG_DIR.mkdir(exist_ok=True)
PROFILE_PATH = CONFIG_DIR / "merchant_profile.json"


PROMPT_TEMPLATE = """
请帮我拉取以下商家近 90 天的核心生意数据，输出 JSON 后我会回填到询盘自动分级配置：

【商家信息】
- 店铺账号：{shop_account}
- 主营品类（可选，没有就留空）：{category_hint}

【需要的数据】
请调用 alibaba-analysis-brief 拉以下指标，整理成下列 JSON 格式：

```json
{{
  "shop_account": "{shop_account}",
  "fetched_at": "<当前时间 ISO 格式>",
  "data_window_days": 90,
  "target_products": [
    "<英文关键词>", "..."
  ],
  "target_countries": [
    "<ISO 二字码>", "..."
  ],
  "high_value_signals": [
    "<高客单价/已成交的产品词>", "..."
  ],
  "category_inferred": "<根据店铺数据推断的主营品类>",
  "monthly_inquiry_volume": <近 90 天月均询盘数>,
  "top_inquiry_countries_with_pct": {{
    "<ISO>": <占比 0-1>, "...": 0
  }},
  "raw_summary": "<150 字以内的店铺经营概况，可读>"
}}
```

【推断规则】
1. target_products（5-10 个）：从「商品-曝光 TOP 10」+「询盘搜索词 TOP 10」交集中选英文关键词，去重
2. target_countries（5-10 个）：取「询盘来源国 TOP 10」的 ISO 二字码
3. high_value_signals（3-8 个）：从「近 90 天已成交订单」的产品标题中提取核心产品词
4. category_inferred：根据商品/订单数据推断（如 mini PC / mining equipment / apparel / hardware）

请直接输出上述 JSON，我会用以下命令导入：
  python scripts/fetch_merchant_profile.py --action ingest --input <你回的 JSON 文件路径>
"""


def emit_prompt(shop_account: str = "", category_hint: str = "") -> None:
    """生成「让 Accio Work 拉数据」的提示词"""
    if not shop_account:
        shop_account = input("请输入店铺账号（如 hongdamachinery）：").strip()
    prompt = PROMPT_TEMPLATE.format(
        shop_account=shop_account or "<填入店铺账号>",
        category_hint=category_hint or "（自动推断）",
    )
    out_path = CONFIG_DIR / "_pending_profile_prompt.md"
    out_path.write_text(prompt, encoding="utf-8")
    print("=" * 70)
    print(prompt)
    print("=" * 70)
    print(f"\n✅ 提示词已保存到：{out_path}")
    print("📌 下一步：把上面 ``` 包裹的 JSON 模板粘给 Accio Work 主对话窗口，")
    print("    让它调用 alibaba-analysis-brief 拉真实数据，把回的 JSON 存成文件，")
    print(f"    再执行：python scripts/fetch_merchant_profile.py --action ingest --input <文件路径>")


def ingest(input_path: str) -> None:
    """把 Accio Work 返回的 JSON 校验后写入 config/merchant_profile.json"""
    src = Path(input_path)
    if not src.exists():
        sys.exit(f"❌ 输入文件不存在：{src}")
    try:
        data = json.loads(src.read_text(encoding="utf-8"))
    except json.JSONDecodeError as e:
        sys.exit(f"❌ JSON 解析失败：{e}")

    required = ["shop_account", "target_products", "target_countries"]
    missing = [k for k in required if k not in data]
    if missing:
        sys.exit(f"❌ 缺失必填字段：{missing}")

    # 补默认值
    data.setdefault("fetched_at", datetime.datetime.now().isoformat())
    data.setdefault("data_window_days", 90)
    data.setdefault("high_value_signals", [])
    data.setdefault("default_blacklist", DEFAULT_BLACKLIST)

    # 落盘
    PROFILE_PATH.write_text(json.dumps(data, ensure_ascii=False, indent=2), encoding="utf-8")
    print(f"✅ 商家画像已写入：{PROFILE_PATH}")
    print(f"   - target_products: {len(data['target_products'])} 个")
    print(f"   - target_countries: {len(data['target_countries'])} 个")
    print(f"   - 月均询盘量：{data.get('monthly_inquiry_volume', '未提供')}")
    print(f"   - 推断品类：{data.get('category_inferred', '未提供')}")


def show() -> None:
    """显示当前配置"""
    if not PROFILE_PATH.exists():
        print(f"⚠ 尚未生成商家画像。请先运行：")
        print(f"  python scripts/fetch_merchant_profile.py --action emit-prompt")
        return
    data = json.loads(PROFILE_PATH.read_text(encoding="utf-8"))
    print(json.dumps(data, ensure_ascii=False, indent=2))


DEFAULT_BLACKLIST = [
    "agent", "broker", "dropship", "drop ship", "drop-ship",
    "sample free", "free sample", "stock lot",
    "second hand", "used", "repair only",
    "student", "homework", "school project",
]


def main():
    p = argparse.ArgumentParser(description="商家画像自动拉取（v3.0）")
    p.add_argument("--action", choices=["emit-prompt", "ingest", "show"], required=True)
    p.add_argument("--input", help="ingest 模式需要：Accio Work 回的 JSON 文件路径")
    p.add_argument("--shop", default="", help="emit-prompt 模式可选：店铺账号")
    p.add_argument("--category", default="", help="emit-prompt 模式可选：品类提示")
    args = p.parse_args()

    if args.action == "emit-prompt":
        emit_prompt(args.shop, args.category)
    elif args.action == "ingest":
        if not args.input:
            sys.exit("❌ ingest 模式必须 --input <文件路径>")
        ingest(args.input)
    elif args.action == "show":
        show()


if __name__ == "__main__":
    main()
