"""清測試殘留:
- agent_activity 中 sim / rgs / SIM / 測試 留下的
- reflection_note 中我自己塞的測試體悟
- 任務:已在前次清過,只 sweep 新增 sim 痕跡

「保留」:真實使用者操作 / 真實派工 / 真實認領 / scheduler 跑出來的 brief。
"""
import os, sys
ENV = "/volume1/homes/robertsu/coba/app/.env"
if os.path.exists(ENV):
    for l in open(ENV):
        if "=" in l and not l.startswith("#"):
            k, v = l.strip().split("=", 1); os.environ.setdefault(k, v)
sys.path.insert(0, "/volume1/homes/robertsu/coba/app")

import asyncio
from datetime import datetime, timezone
from sqlalchemy import select, or_, delete, func
from app.database import AsyncSessionLocal
from app.models.agent_activity import AgentActivity
from app.models.task import Task


# 「明顯是測試」的 marker
TEST_MARKERS = ["[SIM", "rgs", "rgs1-", "rgs2-", "rgs3-", "ping 自動",
                "自動化測試", "整理報表 #", "regression", "測試派工"]


async def main():
    async with AsyncSessionLocal() as db:
        # 1. activity 清測試殘留
        all_acts = (await db.execute(select(AgentActivity).limit(2000))).scalars().all()
        print(f"=== Activity 總數 {len(all_acts)} ===")
        to_delete_acts = []
        for a in all_acts:
            summary = a.summary or ""
            extra_str = str(a.extra or {})
            is_test = any(m in summary for m in TEST_MARKERS) or any(m in extra_str for m in TEST_MARKERS)
            # reflection_note: 我之前測試丟「優先級應按『不做會死』排序」是真實 robert 發的,留
            if is_test:
                to_delete_acts.append(a)
        print(f"要刪 {len(to_delete_acts)} 筆 activity:")
        for a in to_delete_acts[:20]:
            print(f"  - {a.activity_type:20s} | {(a.summary or '')[:60]}")
        if len(to_delete_acts) > 20:
            print(f"  ... 另 {len(to_delete_acts) - 20} 筆")

        # 真刪(physical delete activity 沒有 deleted_at)
        for a in to_delete_acts:
            await db.delete(a)
        await db.commit()
        print(f"✓ 刪 {len(to_delete_acts)} 筆 activity")

        # 2. 任務:再 sweep 一次
        live_tasks = (await db.execute(
            select(Task).where(Task.deleted_at.is_(None))
        )).scalars().all()
        print(f"\n=== 活著任務 {len(live_tasks)} ===")
        to_kill_tasks = []
        for t in live_tasks:
            if any(m in (t.title or "") for m in TEST_MARKERS):
                to_kill_tasks.append(t)
        print(f"要軟刪 {len(to_kill_tasks)} 筆任務:")
        for t in to_kill_tasks:
            print(f"  - {t.title!r}")
        now = datetime.now(timezone.utc)
        for t in to_kill_tasks:
            t.deleted_at = now
        await db.commit()
        if to_kill_tasks:
            print(f"✓ 軟刪 {len(to_kill_tasks)} 筆")

        # 最終狀態
        remaining_tasks = (await db.execute(
            select(func.count()).select_from(Task).where(Task.deleted_at.is_(None))
        )).scalar()
        remaining_acts = (await db.execute(
            select(func.count()).select_from(AgentActivity)
        )).scalar()
        print(f"\n剩餘:任務 {remaining_tasks} 筆 / activity {remaining_acts} 筆")


asyncio.run(main())
