#!/usr/bin/env python3
from __future__ import annotations

import argparse
import os
from pathlib import Path


def find_vault_root(start: str, marker: str | None = None) -> Path:
    """Vault ルート探索。`.obsidian/` の存在で判定する。
    marker を指定すると、ディレクトリ名一致でも探索する（後方互換のフォールバック）。
    """
    path = Path(start).resolve()
    while True:
        if (path / ".obsidian").is_dir():
            return path
        if marker and path.name == marker:
            return path
        if path.parent == path:
            label = marker or ".obsidian/"
            raise RuntimeError(f"Vault root ({label}) が見つかりません: {start}")
        path = path.parent


def main() -> None:
    parser = argparse.ArgumentParser(description="Brain 配下の最近更新ノートを列挙します。")
    parser.add_argument("--limit", type=int, default=20, help="表示件数")
    parser.add_argument("--offset", type=int, default=0, help="先頭からスキップする件数")
    parser.add_argument("--subdir", default="Brain", help="対象ディレクトリ。既定は Brain")
    parser.add_argument("--exclude", action="append", default=["Brain/MOC"], help="除外パス")
    args = parser.parse_args()

    vault_root = find_vault_root(os.path.dirname(os.path.abspath(__file__)))
    root = vault_root / args.subdir
    excludes = [str((vault_root / ex).resolve()) for ex in args.exclude]

    if not root.exists():
        raise RuntimeError(f"対象ディレクトリが見つかりません: {root}")

    notes: list[tuple[int, Path]] = []
    for path in root.rglob("*.md"):
        resolved = str(path.resolve())
        if any(resolved.startswith(ex) for ex in excludes):
            continue
        stat = path.stat()
        notes.append((stat.st_mtime_ns, path))

    notes.sort(key=lambda item: item[0], reverse=True)

    for _, path in notes[args.offset: args.offset + args.limit]:
        rel = path.relative_to(vault_root)
        print(rel)


if __name__ == "__main__":
    main()
