"""
style_check.py - 코드 스타일 포매팅 verifier
Python 파일에 대해 black과 isort를 실행하여 포매팅 위반을 검출
"""

import json
import shutil
import subprocess


def verify(file_paths: list, timeout: int = 60) -> dict:
    """
    지정된 Python 파일들에 대해 black과 isort 스타일 체크를 실행합니다.

    Args:
        file_paths: 검사할 파일 경로 목록
        timeout: 최대 실행 시간 (초), 초과 시 SKIP

    Returns:
        {"status": "PASS"|"WARN"|"SKIP", "details": [...]}
    """
    if not file_paths:
        return {"status": "SKIP", "details": ["No files specified for style check"]}

    black_bin = shutil.which("black")
    isort_bin = shutil.which("isort")

    if black_bin is None and isort_bin is None:
        return {"status": "SKIP", "details": ["black and isort are not installed"]}
    if black_bin is None:
        return {"status": "SKIP", "details": ["black is not installed"]}
    if isort_bin is None:
        return {"status": "SKIP", "details": ["isort is not installed"]}

    py_files = [f for f in file_paths if f.endswith(".py")]
    if not py_files:
        return {"status": "SKIP", "details": ["No Python files found in file_paths"]}

    details = []
    needs_reformat = []

    # --- black 체크 ---
    try:
        black_result = subprocess.run(
            [black_bin, "--check", "--quiet"] + py_files,
            capture_output=True,
            text=True,
            timeout=timeout,
        )
        if black_result.returncode == 0:
            details.append("black: OK")
        else:
            # black --check exits 1 when reformatting is needed
            # stderr contains "would reformat <file>" lines
            reformat_lines = [line for line in black_result.stderr.splitlines() if line.strip()]
            count = len([l for l in reformat_lines if "would reformat" in l])
            if count > 0:
                details.append(f"black: {count} file(s) need reformatting")
            else:
                details.append("black: files need reformatting")
            needs_reformat.extend(py_files)

    except subprocess.TimeoutExpired:
        return {
            "status": "SKIP",
            "details": [f"Timeout after {timeout}s — skipping style check (black)"],
        }
    except Exception as e:
        return {
            "status": "SKIP",
            "details": [f"Unexpected error running black: {type(e).__name__}: {e}"],
        }

    # --- isort 체크 ---
    try:
        isort_result = subprocess.run(
            [isort_bin, "--check", "--quiet"] + py_files,
            capture_output=True,
            text=True,
            timeout=timeout,
        )
        if isort_result.returncode == 0:
            details.append("isort: OK")
        else:
            # isort --check --quiet exits non-zero when files need sorting
            # stdout contains file paths that would be changed
            changed_files = [line.strip() for line in isort_result.stdout.splitlines() if line.strip()]
            count = len(changed_files) if changed_files else len(py_files)
            details.append(f"isort: {count} file(s) need reformatting")
            for f in py_files:
                if f not in needs_reformat:
                    needs_reformat.append(f)

    except subprocess.TimeoutExpired:
        return {
            "status": "SKIP",
            "details": [f"Timeout after {timeout}s — skipping style check (isort)"],
        }
    except Exception as e:
        return {
            "status": "SKIP",
            "details": [f"Unexpected error running isort: {type(e).__name__}: {e}"],
        }

    # --- 결과 판정 ---
    if not needs_reformat:
        return {"status": "PASS", "details": details}

    # 자동 수정 안내 메시지 추가
    details.append("To fix formatting, run:")
    for f in needs_reformat:
        details.append(f"  black {f} && isort {f}")

    # 위반 5개 이상 → FAIL 승격 (task-1994)
    if len(needs_reformat) >= 5:
        details.append(f"FAIL: {len(needs_reformat)} files need reformatting (threshold: 5)")
        return {"status": "FAIL", "details": details}

    return {"status": "WARN", "details": details}


if __name__ == "__main__":
    import sys

    files = sys.argv[1:] if len(sys.argv) > 1 else []
    result = verify(files)
    print(json.dumps(result, ensure_ascii=False, indent=2))
