"""task-2377: worktree_manager._copy_env_files() 단위 테스트."""

from __future__ import annotations

import importlib.util
import os
import sys
from pathlib import Path

import pytest


# scripts/worktree_manager.py 동적 로드 (scripts는 패키지가 아닐 가능성 높음)
SCRIPT_PATH = Path("/home/jay/workspace/scripts/worktree_manager.py")
_spec = importlib.util.spec_from_file_location("worktree_manager", SCRIPT_PATH)
assert _spec and _spec.loader
worktree_manager = importlib.util.module_from_spec(_spec)
sys.modules["worktree_manager"] = worktree_manager
_spec.loader.exec_module(worktree_manager)

_copy_env_files = worktree_manager._copy_env_files


def test_copy_env_single(tmp_path: Path) -> None:
    """시나리오 1: .env 단일 존재 → 복사 1건."""
    src = tmp_path / "src"
    dst = tmp_path / "dst"
    src.mkdir()
    dst.mkdir()
    (src / ".env").write_text("KEY=value\n")

    copied = _copy_env_files(str(src), str(dst))

    assert copied == [".env"]
    assert (dst / ".env").read_text() == "KEY=value\n"


def test_copy_env_multiple(tmp_path: Path) -> None:
    """시나리오 2: .env + .env.local 동시 존재 → 복사 2건 (순서 무관)."""
    src = tmp_path / "src"
    dst = tmp_path / "dst"
    src.mkdir()
    dst.mkdir()
    (src / ".env").write_text("A=1\n")
    (src / ".env.local").write_text("B=2\n")

    copied = _copy_env_files(str(src), str(dst))

    assert set(copied) == {".env", ".env.local"}
    assert (dst / ".env").read_text() == "A=1\n"
    assert (dst / ".env.local").read_text() == "B=2\n"


def test_copy_env_ignores_example(tmp_path: Path) -> None:
    """시나리오 3: .env.example만 존재 → 0건 (템플릿 무시)."""
    src = tmp_path / "src"
    dst = tmp_path / "dst"
    src.mkdir()
    dst.mkdir()
    (src / ".env.example").write_text("KEY=example\n")
    (src / ".env.sample").write_text("KEY=sample\n")

    copied = _copy_env_files(str(src), str(dst))

    assert copied == []
    assert not (dst / ".env.example").exists()
    assert not (dst / ".env.sample").exists()


def test_copy_env_silent_when_absent(tmp_path: Path) -> None:
    """시나리오 4: 어느 것도 없음 → 0건 (silent skip, 에러 X)."""
    src = tmp_path / "src"
    dst = tmp_path / "dst"
    src.mkdir()
    dst.mkdir()

    copied = _copy_env_files(str(src), str(dst))

    assert copied == []


def test_copy_env_preserves_permissions(tmp_path: Path) -> None:
    """시나리오 6: 권한 보존 — .env chmod 0o600 → 복사 후 동일 mode 확인."""
    src = tmp_path / "src"
    dst = tmp_path / "dst"
    src.mkdir()
    dst.mkdir()
    env_file = src / ".env"
    env_file.write_text("SECRET=xxx\n")
    os.chmod(env_file, 0o600)

    copied = _copy_env_files(str(src), str(dst))

    assert copied == [".env"]
    mode = (dst / ".env").stat().st_mode & 0o777
    assert mode == 0o600


def test_no_copy_env_flag_skips(monkeypatch: pytest.MonkeyPatch, tmp_path: Path) -> None:
    """시나리오 5: copy_env=False 시 _copy_env_files 미호출 확인.

    cmd_create는 git 의존성이 있어 직접 호출이 불가능하므로,
    monkeypatch로 _copy_env_files를 spy로 교체한 뒤,
    copy_env=False 분기(cmd_create 내부 로직: `if copy_env:` 를 직접 재현)로
    헬퍼가 호출되지 않음을 검증한다.
    """
    calls: list[tuple[str, str]] = []

    def spy_copy(project_path: str, dest_path: str) -> list[str]:
        calls.append((project_path, dest_path))
        return []

    monkeypatch.setattr(worktree_manager, "_copy_env_files", spy_copy)

    src = tmp_path / "src"
    dst = tmp_path / "dst"
    src.mkdir()
    dst.mkdir()
    (src / ".env").write_text("X=1\n")

    # copy_env=False 분기 재현: cmd_create의 핵심 분기 로직만 추출
    copy_env = False
    copied_env: list[str] = []
    if copy_env:
        copied_env = worktree_manager._copy_env_files(str(src), str(dst))

    # copy_env=False이므로 spy가 호출되지 않아야 함
    assert len(calls) == 0
    assert copied_env == []

    # 추가 검증: copy_env=True 경로에서는 spy가 호출됨
    copy_env = True
    copied_env_true: list[str] = []
    if copy_env:
        copied_env_true = worktree_manager._copy_env_files(str(src), str(dst))

    assert len(calls) == 1
    assert calls[0] == (str(src), str(dst))
    assert copied_env_true == []  # spy는 빈 리스트 반환
