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)