"""
时间窗口工具。

所有窗口均基于指定时区的自然日边界（00:00:00），
不依赖系统本地时区，不使用 timedelta 滚动计算。
"""

from __future__ import annotations

import sys
from pathlib import Path

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

from datetime import datetime, timedelta
from compat import ZoneInfo, make_aware

_DEFAULT_TZ = "Asia/Shanghai"


def get_today_window(tz: str = _DEFAULT_TZ) -> tuple[datetime, datetime]:
    """
    今天的时间窗口：[今天 00:00, 明天 00:00)，timezone-aware。
    """
    zone  = ZoneInfo(tz)
    now   = datetime.now(zone)
    start = now.replace(hour=0, minute=0, second=0, microsecond=0)
    end   = start + timedelta(days=1)
    return start, end


def get_today_and_tomorrow_window(tz: str = _DEFAULT_TZ) -> tuple[datetime, datetime]:
    """
    今天 + 明天：[今天 00:00, 后天 00:00)，timezone-aware。

    对应产品语义"监控今天+明天到明天 24:00 为止"。
    """
    start, _ = get_today_window(tz)
    return start, start + timedelta(days=2)


def get_next_n_days_window(
    days: int,
    tz: str = _DEFAULT_TZ,
    from_now: bool = False,
) -> tuple[datetime, datetime]:
    """
    未来 N 个自然日的窗口。
      from_now=False（默认）：从今天 00:00 开始
      from_now=True         ：从当前时刻开始
    """
    zone = ZoneInfo(tz)
    now  = datetime.now(zone)
    start = now if from_now else now.replace(hour=0, minute=0, second=0, microsecond=0)
    end   = now.replace(hour=0, minute=0, second=0, microsecond=0) + timedelta(days=days)
    return start, end


def get_remaining_today_window(tz: str = _DEFAULT_TZ) -> tuple[datetime, datetime]:
    """
    今天剩余时间：[当前时刻, 今天 24:00)。
    用于"只查今天还没开始的事件"（check_reminders 场景）。
    """
    zone  = ZoneInfo(tz)
    now   = datetime.now(zone)
    end   = now.replace(hour=0, minute=0, second=0, microsecond=0) + timedelta(days=1)
    return now, end


def now_tz(tz: str = _DEFAULT_TZ) -> datetime:
    """返回当前指定时区时间（aware datetime）。"""
    return datetime.now(ZoneInfo(tz))
