"""Task mode classifier: 6 modes (NORMAL/READ_ONLY_WATCHER/DIAGNOSIS/CALLBACK_ONLY/CLOSEOUT_MARKER_ONLY/UNKNOWN)."""
from __future__ import annotations


class TaskMode:
    """6 task mode string constants used by QC + finish-task layers."""

    NORMAL = "NORMAL"
    READ_ONLY_WATCHER = "READ_ONLY_WATCHER"
    DIAGNOSIS = "DIAGNOSIS"
    CALLBACK_ONLY = "CALLBACK_ONLY"
    CLOSEOUT_MARKER_ONLY = "CLOSEOUT_MARKER_ONLY"
    UNKNOWN = "UNKNOWN"


_WATCHER_PATTERNS = ("read-only watcher", "watcher")
_CALLBACK_PATTERNS = ("callback only", "callback-only")
_MARKER_PATTERNS = ("marker only", "marker-only")
_DIAGNOSIS_PATTERNS = ("diagnosis only", "diagnosis-only")


def _has_pattern(haystack: str, patterns: tuple[str, ...]) -> bool:
    return any(p in haystack for p in patterns)


def classify(task_id: str, task_md_content: str) -> str:
    """Classify task mode for `task_id` by scanning task_md content with priority order."""
    if not task_id:
        return TaskMode.UNKNOWN
    if not task_md_content:
        return TaskMode.UNKNOWN
    text = task_md_content.lower()
    if _has_pattern(text, _WATCHER_PATTERNS):
        return TaskMode.READ_ONLY_WATCHER
    if _has_pattern(text, _CALLBACK_PATTERNS):
        return TaskMode.CALLBACK_ONLY
    if _has_pattern(text, _MARKER_PATTERNS):
        return TaskMode.CLOSEOUT_MARKER_ONLY
    if _has_pattern(text, _DIAGNOSIS_PATTERNS):
        return TaskMode.DIAGNOSIS
    return TaskMode.NORMAL


def requires_git_evidence(mode: str) -> bool:
    """Return True only for NORMAL mode (others are non-code-changing)."""
    return mode == TaskMode.NORMAL


def is_commit_forbidden(mode: str) -> bool:
    """Return True for non-NORMAL modes where commits violate the contract."""
    return mode in (
        TaskMode.READ_ONLY_WATCHER,
        TaskMode.CALLBACK_ONLY,
        TaskMode.CLOSEOUT_MARKER_ONLY,
        TaskMode.DIAGNOSIS,
    )
