from __future__ import annotations

from unittest.mock import MagicMock

import pytest

from pygittools.tui import draw


@pytest.fixture
def draw_mocks(monkeypatch: pytest.MonkeyPatch) -> dict[str, MagicMock]:
	mocks = {
		"move": MagicMock(),
		"clrtoeol": MagicMock(),
		"mvaddstr": MagicMock(),
	}
	for name, mock in mocks.items():
		monkeypatch.setattr(draw, name, mock)
	return mocks


def test_clear_row_moves_and_clears(draw_mocks: dict[str, MagicMock]) -> None:
	draw.clear_row(3)
	draw_mocks["move"].assert_called_once_with(3, 0)
	draw_mocks["clrtoeol"].assert_called_once()


def test_draw_text_empty_returns_col(draw_mocks: dict[str, MagicMock]) -> None:
	assert draw.draw_text(0, 5, "", 20) == 5
	draw_mocks["mvaddstr"].assert_not_called()


def test_draw_text_past_width_returns_col(draw_mocks: dict[str, MagicMock]) -> None:
	assert draw.draw_text(0, 20, "hello", 20) == 20


def test_draw_text_without_attr(draw_mocks: dict[str, MagicMock]) -> None:
	end = draw.draw_text(0, 0, "hi", 10)
	assert end == 2
	draw_mocks["mvaddstr"].assert_called_once_with(0, 0, "hi")


def test_draw_text_with_attr(draw_mocks: dict[str, MagicMock]) -> None:
	draw.draw_text(0, 0, "hi", 10, attr=1)
	draw_mocks["mvaddstr"].assert_called_once_with(0, 0, "hi", 1)


def test_draw_text_clips_to_width(draw_mocks: dict[str, MagicMock]) -> None:
	draw.draw_text(0, 0, "hello world", 6)
	draw_mocks["mvaddstr"].assert_called_once_with(0, 0, "hello")


def test_draw_line_clears_when_col_zero(draw_mocks: dict[str, MagicMock]) -> None:
	draw.draw_line(2, 0, "line", 20, attr=0)
	draw_mocks["move"].assert_called()
	draw_mocks["mvaddstr"].assert_called_once()