from __future__ import annotations

from pathlib import Path
from unittest.mock import MagicMock

import pytest
from pygit2 import init_repository
from pyratatui import Rect

from pygittools.tui.git_worktrees import WorktreeInfo
from pygittools.tui.keys import key
from pygittools.tui.pages.worktree_add import WorktreeAddPage
from pygittools.tui.types import PageAction, PageContext
from pygittools.tui.worktrees_list import WorktreesList, _Row, _row_label


def test_row_label_marks_current() -> None:
    info = WorktreeInfo(
        path=Path("/proj/main"),
        head="abc",
        branch="main",
        bare=False,
        detached=False,
        locked=None,
        prunable=None,
    )
    label = _row_label(_Row(kind="worktree", info=info), current=Path("/proj/main"), width=80)
    assert label.startswith("*")


def test_worktrees_list_open_add(page_ctx: PageContext) -> None:
    wt = WorktreesList()
    wt.refresh(page_ctx.repo)
    result = wt.handle_nav_key(key("Enter"), page_ctx.repo)
    assert result is not None
    assert result.action == PageAction.PUSH
    assert isinstance(result.next_page, WorktreeAddPage)


def test_worktrees_list_switch_repo(
    monkeypatch: pytest.MonkeyPatch,
    tmp_path: Path,
) -> None:
    repo_path = tmp_path / "main"
    repo_path.mkdir()
    repo = init_repository(str(repo_path), bare=False)
    other = tmp_path / "other"
    entries = [
        WorktreeInfo(
            path=repo_path.resolve(),
            head=None,
            branch="main",
            bare=False,
            detached=False,
            locked=None,
            prunable=None,
        ),
        WorktreeInfo(
            path=other.resolve(),
            head=None,
            branch="feature",
            bare=False,
            detached=False,
            locked=None,
            prunable=None,
        ),
    ]
    monkeypatch.setattr(
        "pygittools.tui.worktrees_list.list_worktrees",
        lambda _repo: (entries, None),
    )
    wt = WorktreesList()
    wt.refresh(repo)
    wt.handle_nav_key(key("Down"), repo)
    wt.handle_nav_key(key("Down"), repo)
    result = wt.handle_nav_key(key("Enter"), repo)
    assert result is not None
    assert result.switch_repo == other.resolve()


def test_worktrees_list_draw(frame: MagicMock) -> None:
    wt = WorktreesList()
    wt.draw(frame, Rect(0, 0, 80, 10), highlight=True)