"""main-vs-worktree dirty file preflight: 4-step check + 3-decision classifier (PR #153 RCA guard)."""
from __future__ import annotations

import subprocess
from typing import Dict, List


def _git_status_short(cwd: str) -> List[str]:
    """Return list of changed file paths from `git status --short` in given cwd."""
    proc = subprocess.run(
        ["git", "status", "--short"],
        cwd=cwd,
        capture_output=True,
        text=True,
        check=False,
    )
    paths: List[str] = []
    for line in proc.stdout.splitlines():
        if len(line) <= 3:
            continue
        rest = line[3:].strip()
        if " -> " in rest:
            rest = rest.split(" -> ", 1)[1]
        rest = rest.strip().strip('"')
        if rest:
            paths.append(rest)
    return paths


def run_preflight(worktree_path: str, main_workspace: str) -> dict:
    """4-step preflight: main dirty + worktree dirty + intersection + violation flag."""
    main_dirty = _git_status_short(main_workspace)
    worktree_dirty = _git_status_short(worktree_path)
    intersection = sorted(set(main_dirty) & set(worktree_dirty))
    violation = len(intersection) > 0
    result: Dict = {
        "main_dirty": main_dirty,
        "worktree_dirty": worktree_dirty,
        "intersection": intersection,
        "violation": violation,
    }
    result["decision"] = classify_decision(result)
    return result


def classify_decision(preflight_result: dict) -> str:
    """3-decision classifier: PASS / HOLD_FOR_CHAIR / BLOCK."""
    main_dirty = preflight_result.get("main_dirty") or []
    intersection = preflight_result.get("intersection") or []
    if len(intersection) >= 1:
        return "BLOCK"
    if len(main_dirty) == 0:
        return "PASS"
    return "HOLD_FOR_CHAIR"
