#!/usr/bin/env python3
"""
即时提醒检查器。

执行时机：由 OpenClaw Cron 高频触发（如每 5 分钟），或手动执行。

流程：
  1. 拉取今天剩余的日程
  2. 计算每个事件的提醒时间
  3. 筛选出提醒时间在未来 N 分钟内的事件
  4. 有提醒时输出提醒内容（供 OpenClaw 投递）
  5. 无提醒时只输出 NO_REPLY

即时提醒检查器，此处补齐实现。

用法：
  python3 apps/check_reminders.py              # 默认检查窗口 30 分钟
  python3 apps/check_reminders.py --window 15  # 只检查 15 分钟内
"""

from __future__ import annotations

import argparse
import json
import logging
import sys
from datetime import timedelta
from pathlib import Path

# ── sys.path ─────────────────────────────────────────────────────
sys.path.insert(0, str(Path(__file__).parent.parent))

from config.settings import TIMEZONE
from services.calendar_backend import active_provider, list_events
from services.time_window import get_remaining_today_window, now_tz
from services.reminder_planner import plan_reminders

logging.basicConfig(level=logging.WARNING, format="%(levelname)s %(message)s")
logger = logging.getLogger(__name__)

NO_REPLY = "NO_REPLY"


def main():
    parser = argparse.ArgumentParser(description="即时提醒检查")
    parser.add_argument(
        "--window", type=int, default=30,
        help="检查提醒时间在未来多少分钟内的事件（默认 30）",
    )
    parser.add_argument(
        "--json", action="store_true",
        help="输出结构化 JSON，供 HTTP API 使用",
    )
    args = parser.parse_args()

    now = now_tz(TIMEZONE)
    check_until = now + timedelta(minutes=args.window)

    # ── 1. 拉取今天剩余日程 ───────────────────────────────────────
    t_min, t_max = get_remaining_today_window(TIMEZONE)

    try:
        events = list_events(t_min, t_max)
    except Exception as e:
        logger.error(f"拉取日程失败: {e}")
        print(str(e), file=sys.stderr)
        sys.exit(1)

    # ── 2. 计算提醒计划 ───────────────────────────────────────────
    plans = plan_reminders(events, now=now, tz=TIMEZONE)

    # ── 3. 筛选窗口内需要提醒的事件 ─────────────────────────────
    due = [
        p for p in plans
        if p.should_schedule and now <= p.remind_at <= check_until
    ]

    if args.json:
        items = [
            {
                "summary": p.event.summary,
                "start": p.event.start.isoformat(),
                "end": p.event.end.isoformat(),
                "lead_minutes": p.lead_minutes,
                "trigger_at": p.remind_at.isoformat(),
                "message": p.reminder_message(),
            }
            for p in due
        ]
        print(json.dumps(
            {
                "ok": True,
                "window_minutes": args.window,
                "provider": active_provider(),
                "active_mode": active_provider(),
                "reminders": items,
            },
            ensure_ascii=False,
        ))
        return

    if not due:
        print(NO_REPLY)
        sys.exit(0)

    # ── 4. 输出提醒 ───────────────────────────────────────────────
    for p in due:
        print(p.reminder_message())


if __name__ == "__main__":
    main()
