#!/usr/bin/env python3
"""Filter large transcripts for relevant keywords with surrounding context."""

from __future__ import annotations

import argparse
import re
import sys
from pathlib import Path


def parse_args() -> argparse.Namespace:
    parser = argparse.ArgumentParser(
        description="Filter transcript lines by keywords and print matches with surrounding context.",
    )
    parser.add_argument("source", help="Path to transcript file, or '-' to read from stdin.")
    parser.add_argument("keywords", nargs="+", help="Keywords to match (case-insensitive).")
    parser.add_argument("--context", type=int, default=2, help="Context lines before/after each hit.")
    return parser.parse_args()


def load_text(source: str) -> str:
    if source == "-":
        return sys.stdin.read()
    return Path(source).read_text(encoding="utf-8")


def main() -> int:
    args = parse_args()
    text = load_text(args.source)
    lines = text.splitlines()
    pattern = re.compile("|".join(re.escape(k) for k in args.keywords), re.IGNORECASE)

    match_indexes = [i for i, line in enumerate(lines) if pattern.search(line)]
    if not match_indexes:
        print("No matches found.")
        return 0

    windows: list[tuple[int, int, set[int]]] = []
    for index in match_indexes:
        start = max(0, index - args.context)
        end = min(len(lines), index + args.context + 1)
        if windows and start <= windows[-1][1]:
            previous_start, previous_end, hits = windows[-1]
            windows[-1] = (previous_start, max(previous_end, end), hits | {index})
        else:
            windows.append((start, end, {index}))

    for start, end, hits in windows:
        hit_lines = ", ".join(str(index + 1) for index in sorted(hits))
        print(f"\n--- matches at lines {hit_lines} ---")
        for line_no in range(start, end):
            prefix = ">" if line_no in hits else " "
            print(f"{prefix} {line_no + 1:05d}: {lines[line_no]}")

    return 0


if __name__ == "__main__":
    raise SystemExit(main())
