import React from "react";
import { Box, Button, Flex, Select } from "@chakra-ui/react";

function PaginationToolbar({
	isLoading,
	numTotalPages,
	currentPageNumber,
	goToPageNumber,
	buildPageUrl,
	size = "md",
	...props
}) {
	const pagesAreLoaded = currentPageNumber != null && numTotalPages != null;
	const hasPrevPage = pagesAreLoaded && currentPageNumber > 1;
	const hasNextPage = pagesAreLoaded && currentPageNumber < numTotalPages;

	const prevPageUrl = hasPrevPage ? buildPageUrl(currentPageNumber - 1) : null;
	const nextPageUrl = hasNextPage ? buildPageUrl(currentPageNumber + 1) : null;

	return (
		<Flex align="center" justify="space-between" {...props}>
			<LinkOrButton
				href={prevPageUrl}
				onClick={
					prevPageUrl == null
						? () => goToPageNumber(currentPageNumber - 1)
						: undefined
				}
				_disabled={{
					cursor: isLoading ? "wait" : "not-allowed",
					opacity: 0.4,
				}}
				isDisabled={!hasPrevPage}
				size={size}
			>
				← Prev
			</LinkOrButton>
			{numTotalPages > 0 && (
				<Flex align="center" paddingX="4" fontSize={size}>
					<Box flex="0 0 auto">Page</Box>
					<Box width="1" />
					<PageNumberSelect
						currentPageNumber={currentPageNumber}
						numTotalPages={numTotalPages}
						onChange={goToPageNumber}
						marginBottom="-2px"
						size={size}
					/>
					<Box width="1" />
					<Box flex="0 0 auto">of {numTotalPages}</Box>
				</Flex>
			)}
			<LinkOrButton
				href={nextPageUrl}
				onClick={
					nextPageUrl == null
						? () => goToPageNumber(currentPageNumber + 1)
						: undefined
				}
				_disabled={{
					cursor: isLoading ? "wait" : "not-allowed",
					opacity: 0.4,
				}}
				isDisabled={!hasNextPage}
				size={size}
			>
				Next →
			</LinkOrButton>
		</Flex>
	);
}

function LinkOrButton({ href, ...props }) {
	if (href != null) {
		return <Button as="a" href={href} {...props} />;
	} else {
		return <Button {...props} />;
	}
}

function PageNumberSelect({
	currentPageNumber,
	numTotalPages,
	onChange,
	...props
}) {
	const allPageNumbers = Array.from({ length: numTotalPages }, (_, i) => i + 1);

	const handleChange = React.useCallback(
		(e) => onChange(Number(e.target.value)),
		[onChange],
	);

	return (
		<Select
			value={currentPageNumber}
			onChange={handleChange}
			width="7ch"
			variant="flushed"
			textAlign="center"
			{...props}
		>
			{allPageNumbers.map((pageNumber) => (
				<option key={pageNumber} value={pageNumber}>
					{pageNumber}
				</option>
			))}
		</Select>
	);
}

export default PaginationToolbar;