"""regression: task-2575 — _resolve_diff_base() fallback 동작 검증.

_resolve_diff_base(task_id, workspace) 함수가 다양한 조건에서
올바른 diff base를 반환하는지 검증:

1. lock 파일 없음 + worktree 컨텍스트 → "origin/main"
2. lock 파일 있음, lock_sha 없음 + worktree 컨텍스트 → "origin/main"
3. lock 파일 있음, lock_sha 있음 + worktree 컨텍스트 → lock_sha 값
4. lock_sha 있음 + non-worktree 컨텍스트 → "origin/main"
5. lock 파일 손상 (invalid JSON) + worktree → "origin/main"

import:
    from pre_push_guard import _resolve_diff_base
"""
import json
import sys
from pathlib import Path

SCRIPTS = Path(__file__).resolve().parents[2] / "scripts"
sys.path.insert(0, str(SCRIPTS))

# pre_push_guard는 import 시 qc_report_guard / task_scope 를 함께 import하므로
# SCRIPTS가 sys.path에 있어야 한다.
from pre_push_guard import _resolve_diff_base  # type: ignore[import-not-found]  # noqa: E402

VALID_SHA = "b" * 40
WORKTREE_CWD = "/home/jay/workspace/.worktrees/foo"
NORMAL_CWD = "/home/jay/workspace"

TASK_ID = "task-9100"


def _make_lock_file(workspace: Path, data: dict | None) -> None:
    """workspace 아래 .tasks/locks/TASK_ID.lock 파일 생성."""
    locks_dir = workspace / ".tasks" / "locks"
    locks_dir.mkdir(parents=True, exist_ok=True)
    lock_file = locks_dir / f"{TASK_ID}.lock"
    if data is None:
        return  # 파일 미생성
    lock_file.write_text(json.dumps(data), encoding="utf-8")


# ---------------------------------------------------------------------------
# 테스트 1: lock 파일 없음 + worktree 컨텍스트 → "origin/main"
# ---------------------------------------------------------------------------

def test_no_lock_file_worktree_returns_origin_main(tmp_path, monkeypatch):
    monkeypatch.setenv("GIT_DIR", "")
    monkeypatch.setattr("os.getcwd", lambda: WORKTREE_CWD)

    result = _resolve_diff_base(TASK_ID, tmp_path)
    assert result == "origin/main"


# ---------------------------------------------------------------------------
# 테스트 2: lock 파일 있음 lock_sha 없음 + worktree → "origin/main"
# ---------------------------------------------------------------------------

def test_lock_file_no_lock_sha_worktree_returns_origin_main(tmp_path, monkeypatch):
    monkeypatch.setenv("GIT_DIR", "")
    monkeypatch.setattr("os.getcwd", lambda: WORKTREE_CWD)

    _make_lock_file(tmp_path, {
        "task_id": TASK_ID,
        "bot": "enki",
        "branch": f"task/{TASK_ID}-dev5",
        "worktree": WORKTREE_CWD,
        "pid": 42,
    })

    result = _resolve_diff_base(TASK_ID, tmp_path)
    assert result == "origin/main"


# ---------------------------------------------------------------------------
# 테스트 3: lock 파일 있음, lock_sha 있음 + worktree → lock_sha 반환
# ---------------------------------------------------------------------------

def test_lock_sha_present_worktree_returns_sha(tmp_path, monkeypatch):
    monkeypatch.setenv("GIT_DIR", "")
    monkeypatch.setattr("os.getcwd", lambda: WORKTREE_CWD)

    _make_lock_file(tmp_path, {
        "task_id": TASK_ID,
        "lock_sha": VALID_SHA,
    })

    result = _resolve_diff_base(TASK_ID, tmp_path)
    assert result == VALID_SHA


# ---------------------------------------------------------------------------
# 테스트 4: lock_sha 있음 + non-worktree 컨텍스트 → "origin/main"
# ---------------------------------------------------------------------------

def test_lock_sha_present_non_worktree_returns_origin_main(tmp_path, monkeypatch):
    monkeypatch.setenv("GIT_DIR", "")
    monkeypatch.setattr("os.getcwd", lambda: NORMAL_CWD)

    _make_lock_file(tmp_path, {
        "task_id": TASK_ID,
        "lock_sha": VALID_SHA,
    })

    result = _resolve_diff_base(TASK_ID, tmp_path)
    assert result == "origin/main"


# ---------------------------------------------------------------------------
# 테스트 5: lock 파일 손상 (invalid JSON) + worktree → "origin/main"
# ---------------------------------------------------------------------------

def test_corrupted_lock_file_worktree_returns_origin_main(tmp_path, monkeypatch):
    monkeypatch.setenv("GIT_DIR", "")
    monkeypatch.setattr("os.getcwd", lambda: WORKTREE_CWD)

    locks_dir = tmp_path / ".tasks" / "locks"
    locks_dir.mkdir(parents=True, exist_ok=True)
    (locks_dir / f"{TASK_ID}.lock").write_text("{{ broken json %%", encoding="utf-8")

    result = _resolve_diff_base(TASK_ID, tmp_path)
    assert result == "origin/main"
