"""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()