#!/usr/bin/env python3
"""把当日日报 markdown append 到本周聚合 Gitea issue。

每人每周一个 issue，标题：`[daily-report] <user> · YYYY-W##`，labels：
`daily-report` + `user/<git-username>`。找不到则创建，找到则 POST 一条 comment。

被 run.py 调用：从 stdin 读 markdown 正文，flags: --user --date --raw-url。

stdout 打印：issue URL（成功）；非零 exit 表示失败。
"""
from __future__ import annotations

import argparse
import datetime as dt
import json
import os
import sys
from pathlib import Path

SCRIPT_DIR = Path(__file__).resolve().parent
REPO_ROOT = SCRIPT_DIR.parents[2]

# 模块级一次性插入 sys.path 让 _gitea_api 可 import（避免每个函数重复 sys.path.insert）
sys.path.insert(0, str(REPO_ROOT / "scripts" / "ops"))
from _gitea_api import Api, ensure_label, find_issue_by_title, get_token  # noqa: E402

GITEA_HOST = os.environ.get("GITEA_HOST", "43.130.59.228")
GITEA_REPO = os.environ.get("GITEA_REPO", "FFAIWorkspace/workspace")
ROLLING_BRANCH = "chore/daily-reports-rolling"

LABEL_DAILY = "daily-report"
LABEL_DAILY_COLOR = "#4f46e5"  # indigo
LABEL_USER_COLOR = "#0ea5e9"  # sky


def iso_week_label(date_str: str) -> str:
    """2026-05-21 → 2026-W21（ISO week date 表示）。"""
    d = dt.date.fromisoformat(date_str)
    iso_year, iso_week, _ = d.isocalendar()
    return f"{iso_year}-W{iso_week:02d}"


def weekday_zh(date_str: str) -> str:
    """返回中文星期字（单字），调用方负责拼"周"前缀。避免 off-by-one。"""
    d = dt.date.fromisoformat(date_str)
    return "一二三四五六日"[d.weekday()]


def find_open_issue(api, title_exact: str):
    """按 label=daily-report 拉 issue 列表，title exact 匹配。"""
    return find_issue_by_title(api, label=LABEL_DAILY, title=title_exact)


def ensure_labels(api, user: str) -> list[int]:
    """返回 [daily_label_id, user_label_id]，跳过创建失败的（None）。"""
    ids: list[int] = []
    daily_id = ensure_label(api, name=LABEL_DAILY, color=LABEL_DAILY_COLOR, description="每日开发日报聚合")
    if daily_id is not None:
        ids.append(daily_id)
    user_id = ensure_label(api, name=f"user/{user}", color=LABEL_USER_COLOR, description=f"{user} 的日报 / 任务")
    if user_id is not None:
        ids.append(user_id)
    return ids


def create_issue(api, user: str, week_label: str, label_ids: list[int]) -> dict:
    title = f"[daily-report] {user} · {week_label}"
    body = (
        f"本周聚合日报。每天 00:05 cron 自动 append 一条 comment。\n\n"
        f"- 数据源：commits / PR / Claude Code 对话\n"
        f"- L2 信号 → Haiku 4.5 转化为行动建议\n"
        f"- 完整 markdown 文件落在 `{ROLLING_BRANCH}` 分支\n\n"
        f"ref: [scripts/ops/daily-report/](http://{GITEA_HOST}/{GITEA_REPO}/src/branch/develop/scripts/ops/daily-report)\n"
    )
    payload = {"title": title, "body": body}
    if label_ids:
        payload["labels"] = label_ids
    status, resp = api.post("/issues", body=payload)
    if status not in (200, 201):
        raise RuntimeError(f"create issue {status}: {resp[:300]}")
    return json.loads(resp)


def post_comment(api, issue_number: int, body: str) -> None:
    status, resp = api.post(f"/issues/{issue_number}/comments", body={"body": body})
    if status not in (200, 201):
        raise RuntimeError(f"post comment {status}: {resp[:300]}")


def assemble_comment(date_str: str, markdown: str, raw_url: str, user: str) -> str:
    return (
        f"### {date_str}（周{weekday_zh(date_str)}）\n\n"
        f"{markdown.strip()}\n\n"
        f"---\n"
        f"[📄 完整 markdown 文件]({raw_url}) · @{user}\n"
    )


def main() -> int:
    p = argparse.ArgumentParser(description="Post daily report to weekly Gitea aggregation issue")
    p.add_argument("--user", required=True)
    p.add_argument("--date", required=True, help="YYYY-MM-DD")
    p.add_argument("--raw-url", required=True, help="Gitea raw URL of the daily-reports md file")
    args = p.parse_args()

    markdown = sys.stdin.read().strip()
    if not markdown:
        print("ERROR: empty markdown from stdin", file=sys.stderr)
        return 2

    token = get_token()
    api = Api(token=token, repo=GITEA_REPO)

    week_label = iso_week_label(args.date)
    title = f"[daily-report] {args.user} · {week_label}"

    label_ids = ensure_labels(api, args.user)
    issue = find_open_issue(api, title)
    if not issue:
        issue = create_issue(api, args.user, week_label, label_ids)
        print(f"created issue #{issue['number']}", file=sys.stderr)
    else:
        print(f"using existing issue #{issue['number']}", file=sys.stderr)

    comment_body = assemble_comment(args.date, markdown, args.raw_url, args.user)
    post_comment(api, issue["number"], comment_body)

    issue_url = f"http://{GITEA_HOST}/{GITEA_REPO}/issues/{issue['number']}"
    print(issue_url)
    return 0


if __name__ == "__main__":
    sys.exit(main())
