from pathlib import Path
from typing import TYPE_CHECKING

from archinstall.tui.curses_menu import EditMenu
from archinstall.tui.types import Alignment

from ..general import secret
from ..output import FormattedOutput

if TYPE_CHECKING:
	from collections.abc import Callable

	from archinstall.lib.translationhandler import DeferredTranslation

	_: Callable[[str], DeferredTranslation]


def get_password(
	text: str,
	header: str | None = None,
	allow_skip: bool = False,
	preset: str | None = None
) -> str | None:
	failure: str | None = None

	while True:
		user_hdr = None
		if failure is not None:
			user_hdr = f'{header}\n{failure}\n'
		elif header is not None:
			user_hdr = header

		result = EditMenu(
			text,
			header=user_hdr,
			alignment=Alignment.CENTER,
			allow_skip=allow_skip,
			default_text=preset,
			hide_input=True
		).input()

		if allow_skip and not result.has_item():
			return None

		password = result.text()
		hidden = secret(password)

		if header is not None:
			confirmation_header = f'{header}{_("Password")}: {hidden}\n'
		else:
			confirmation_header = f'{_("Password")}: {hidden}\n'

		result = EditMenu(
			str(_('Confirm password')),
			header=confirmation_header,
			alignment=Alignment.CENTER,
			allow_skip=False,
			hide_input=True
		).input()

		if password == result.text():
			return password

		failure = str(_('The confirmation password did not match, please try again'))


def prompt_dir(
	text: str,
	header: str | None = None,
	validate: bool = True,
	allow_skip: bool = False,
	preset: str | None = None
) -> Path | None:
	def validate_path(path: str) -> str | None:
		dest_path = Path(path)

		if dest_path.exists() and dest_path.is_dir():
			return None

		return str(_('Not a valid directory'))

	if validate:
		validate_func = validate_path
	else:
		validate_func = None

	result = EditMenu(
		text,
		header=header,
		alignment=Alignment.CENTER,
		allow_skip=allow_skip,
		validator=validate_func,
		default_text=preset
	).input()

	if allow_skip and not result.has_item():
		return None

	return Path(result.text())


def is_subpath(first: Path, second: Path) -> bool:
	"""
	Check if _first_ a subpath of _second_
	"""
	try:
		first.relative_to(second)
		return True
	except ValueError:
		return False


def format_cols(items: list[str], header: str | None = None) -> str:
	if header:
		text = f'{header}:\n'
	else:
		text = ''

	nr_items = len(items)
	if nr_items <= 4:
		col = 1
	elif nr_items <= 8:
		col = 2
	elif nr_items <= 12:
		col = 3
	else:
		col = 4

	text += FormattedOutput.as_columns(items, col)
	# remove whitespaces on each row
	text = '\n'.join([t.strip() for t in text.split('\n')])
	return text
