"""Git utilities for Gar
Git 저장소와 관련된 유틸리티 함수들 제공
"""

from __future__ import annotations

import logging
import subprocess
from pathlib import Path

logger = logging.getLogger(__name__)


def is_git_repository(path: Path | None = None) -> bool:
    """현재 디렉터리가 Git 저장소인지 확인.

    Args:
        path: 검사할 경로. None이면 현재 디렉터리.

    Returns:
        Git 저장소이면 True, 아니면 False.
    """
    if path is None:
        path = Path.cwd()
    else:
        path = Path(path).resolve()

    try:
        result = subprocess.run(
            ["git", "rev-parse", "--git-dir"],
            cwd=path,
            capture_output=True,
            text=True,
            timeout=5,
        )
        return result.returncode == 0
    except (subprocess.TimeoutExpired, FileNotFoundError, Exception) as e:
        logger.debug(f"Git 저장소 확인 실패: {e}")
        return False


def get_staged_files(
    root: Path | None = None,
    *,
    python_only: bool = True,
) -> list[Path]:
    """Git staged 파일 목록 반환

    Args:
        root: Git 저장소 루트 경로. None이면 현재 디렉터리.
        python_only: True이면 Python 파일(.py)만 반환.

    Returns:
        Staged 파일 Path 리스트. 에러 시 빈 리스트.
    """
    if root is None:
        root = Path.cwd()
    else:
        root = Path(root).resolve()

    try:
        # git diff --cached --name-only: staged 파일 목록
        result = subprocess.run(
            ["git", "diff", "--cached", "--name-only", "--diff-filter=ACMR"],
            cwd=root,
            capture_output=True,
            text=True,
            timeout=10,
        )

        if result.returncode != 0:
            logger.debug(f"git diff 실행 실패: {result.stderr}")
            return []

        # 파일 목록 파싱
        files: list[Path] = []
        for line in result.stdout.strip().split("\n"):
            if not line:
                continue

            file_path = root / line.strip()

            # Python 파일만 필터링
            if python_only and not file_path.suffix == ".py":
                continue

            # 파일이 실제로 존재하는지 확인
            if file_path.exists() and file_path.is_file():
                files.append(file_path)

        return files

    except (subprocess.TimeoutExpired, FileNotFoundError, Exception) as e:
        logger.debug(f"Staged 파일 가져오기 실패: {e}")
        return []
