"""Scrollable help page backed by a bundled markdown file."""

from __future__ import annotations

from importlib.resources import files

from pyratatui import Frame, List, ListItem, ListState, Rect

from pygittools.tui.keys import KeyLike, is_down, is_esc, is_quit, is_up
from pygittools.tui.types import PageAction, PageContext, PageResult


def _load_help_lines() -> list[str]:
	text = files("pygittools").joinpath("help.md").read_text(encoding="utf-8")
	return text.splitlines()


class HelpPage:
	title = "help"

	def __init__(self) -> None:
		self._lines = _load_help_lines()
		self._state = ListState()
		if self._lines:
			self._state.select(0)

	def on_enter(self, ctx: PageContext) -> None:
		del ctx

	def status_text(self) -> str:
		total = len(self._lines)
		if total == 0:
			return "Help"
		selected = self._state.selected
		visible = (selected + 1) if selected is not None else 1
		return f"Help {visible}/{total} — arrows to scroll, Q or Esc to go back"

	def draw(self, frame: Frame, area: Rect) -> None:
		if area.height <= 0 or area.width <= 0:
			return
		items = [ListItem(line if line else " ") for line in self._lines]
		frame.render_stateful_list(List(items), area, self._state)

	def handle_key(self, key: KeyLike) -> PageResult:
		if is_quit(key) or is_esc(key):
			return PageResult(action=PageAction.POP)
		if is_up(key):
			selected = self._state.selected or 0
			self._state.select(max(0, selected - 1))
			return PageResult()
		if is_down(key):
			selected = self._state.selected or 0
			self._state.select(min(max(0, len(self._lines) - 1), selected + 1))
			return PageResult()
		return PageResult()


def help_page() -> HelpPage:
	return HelpPage()