"""No-repository fallback page."""

from __future__ import annotations

from pathlib import Path

from pyratatui import Frame, Paragraph, Rect, Style, Text

from pygittools.tui.keys import KeyLike, is_quit, is_slash
from pygittools.tui.pages.help import help_page
from pygittools.tui.types import PageAction, PageContext, PageResult


class NoRepoPage:
	title = "pgt"

	def __init__(self, start: Path) -> None:
		self._start = start
		self._command: str | None = None
		self._command_error: str | None = None

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

	def status_text(self) -> str:
		if self._command_error is not None:
			return self._command_error
		if self._command is not None:
			if not self._command:
				return "/ — help quit — Esc cancel"
			return f"/{self._command}"
		return "no repository — / command — q quit"

	def draw(self, frame: Frame, area: Rect) -> None:
		lines = "\n".join([
			"pgt",
			"",
			f"No git repository found under {self._start}",
			"",
			"Run pgt from inside a repository, or pass --repo PATH.",
		])
		frame.render_widget(
			Paragraph(Text.from_string(lines)).style(Style().bold()),
			area,
		)

	def handle_key(self, key: KeyLike) -> PageResult:
		if self._command is not None:
			return self._handle_command_key(key)
		if is_quit(key):
			return PageResult(action=PageAction.QUIT)
		if is_slash(key):
			self._command = ""
			self._command_error = None
			return PageResult()
		return PageResult()

	def _handle_command_key(self, key: KeyLike) -> PageResult:
		assert self._command is not None
		if key.code == "Esc":
			self._command = None
			self._command_error = None
			return PageResult()
		if key.code == "Backspace":
			self._command_error = None
			self._command = self._command[:-1]
			return PageResult()
		if key.code == "Enter":
			name = self._command.strip().casefold().lstrip("/")
			self._command = None
			if name in {"help", "?"}:
				return PageResult(action=PageAction.PUSH, next_page=help_page())
			if name in {"quit", "q"}:
				return PageResult(action=PageAction.QUIT)
			if name:
				self._command = ""
				self._command_error = f"Unknown command: /{name} — help quit"
			return PageResult()
		if not key.ctrl and not key.alt and len(key.code) == 1 and key.code.isprintable() and not key.code.isspace():
			self._command_error = None
			self._command += key.code
		return PageResult()