import React from "react";
import { Tooltip, useColorModeValue, Flex, Icon } from "@chakra-ui/react";
import { CheckCircleIcon, WarningTwoIcon } from "@chakra-ui/icons";

function HTML5Badge({ usesHTML5, isLoading, tooltipLabel }) {
	// `delayedUsesHTML5` stores the last known value of `usesHTML5`, when
	// `isLoading` was `false`. This enables us to keep showing the badge, even
	// when loading a new appearance - because it's unlikely the badge will
	// change between different appearances for the same item, and the flicker is
	// annoying!
	const [delayedUsesHTML5, setDelayedUsesHTML5] = React.useState(null);
	React.useEffect(() => {
		if (!isLoading) {
			setDelayedUsesHTML5(usesHTML5);
		}
	}, [usesHTML5, isLoading]);

	if (delayedUsesHTML5 === true) {
		return (
			<GlitchBadgeLayout
				hasGlitches={false}
				aria-label="HTML5 supported!"
				tooltipLabel={
					tooltipLabel ||
					"This item is converted to HTML5, and ready to use on Neopets.com!"
				}
			>
				<CheckCircleIcon fontSize="xs" />
				<Icon
					viewBox="0 0 36 36"
					fontSize="xl"
					// Visual re-balancing, there's too much visual right-padding here!
					marginRight="-1"
				>
					{/* From Twemoji Keycap 5 */}
					<path
						fill="currentColor"
						d="M16.389 14.489c.744-.155 1.551-.31 2.326-.31 3.752 0 6.418 2.977 6.418 6.604 0 5.178-2.851 8.589-8.216 8.589-2.201 0-6.821-1.427-6.821-4.155 0-1.147.961-2.107 2.108-2.107 1.24 0 2.729 1.984 4.806 1.984 2.17 0 3.288-2.109 3.288-4.062 0-1.86-1.055-3.131-2.977-3.131-1.799 0-2.078 1.023-3.659 1.023-1.209 0-1.829-.93-1.829-1.457 0-.403.062-.713.093-1.054l.774-6.544c.341-2.418.93-2.945 2.418-2.945h7.472c1.428 0 2.264.837 2.264 1.953 0 2.14-1.611 2.326-2.17 2.326h-5.829l-.466 3.286z"
					/>
				</Icon>
			</GlitchBadgeLayout>
		);
	} else if (delayedUsesHTML5 === false) {
		return (
			<GlitchBadgeLayout
				hasGlitches={true}
				aria-label="HTML5 not supported"
				tooltipLabel={
					tooltipLabel || (
						<>
							This item isn't converted to HTML5 yet, so it might not appear in
							Neopets.com customization yet. Once it's ready, it could look a
							bit different than our temporary preview here. It might even be
							animated!
						</>
					)
				}
			>
				<WarningTwoIcon fontSize="xs" marginRight="1" />
				<Icon viewBox="0 0 36 36" fontSize="xl">
					{/* From Twemoji Keycap 5 */}
					<path
						fill="currentColor"
						d="M16.389 14.489c.744-.155 1.551-.31 2.326-.31 3.752 0 6.418 2.977 6.418 6.604 0 5.178-2.851 8.589-8.216 8.589-2.201 0-6.821-1.427-6.821-4.155 0-1.147.961-2.107 2.108-2.107 1.24 0 2.729 1.984 4.806 1.984 2.17 0 3.288-2.109 3.288-4.062 0-1.86-1.055-3.131-2.977-3.131-1.799 0-2.078 1.023-3.659 1.023-1.209 0-1.829-.93-1.829-1.457 0-.403.062-.713.093-1.054l.774-6.544c.341-2.418.93-2.945 2.418-2.945h7.472c1.428 0 2.264.837 2.264 1.953 0 2.14-1.611 2.326-2.17 2.326h-5.829l-.466 3.286z"
					/>

					{/* From Twemoji Not Allowed */}
					<path
						fill="#DD2E44"
						opacity="0.75"
						d="M18 0C8.059 0 0 8.059 0 18s8.059 18 18 18 18-8.059 18-18S27.941 0 18 0zm13 18c0 2.565-.753 4.95-2.035 6.965L11.036 7.036C13.05 5.753 15.435 5 18 5c7.18 0 13 5.821 13 13zM5 18c0-2.565.753-4.95 2.036-6.964l17.929 17.929C22.95 30.247 20.565 31 18 31c-7.179 0-13-5.82-13-13z"
					/>
				</Icon>
			</GlitchBadgeLayout>
		);
	} else {
		// If no `usesHTML5` value has been provided yet, we're empty for now!
		return null;
	}
}

export function GlitchBadgeLayout({
	hasGlitches = true,
	children,
	tooltipLabel,
	...props
}) {
	const [isHovered, setIsHovered] = React.useState(false);
	const [isFocused, setIsFocused] = React.useState(false);

	const greenBackground = useColorModeValue("green.100", "green.900");
	const greenBorderColor = useColorModeValue("green.600", "green.500");
	const greenTextColor = useColorModeValue("green.700", "white");

	const yellowBackground = useColorModeValue("yellow.100", "yellow.900");
	const yellowBorderColor = useColorModeValue("yellow.600", "yellow.500");
	const yellowTextColor = useColorModeValue("yellow.700", "white");

	return (
		<Tooltip
			textAlign="center"
			fontSize="xs"
			placement="bottom"
			label={tooltipLabel}
			// HACK: Chakra tooltips seem inconsistent about staying open when focus
			//       comes from touch events. But I really want this one to work on
			//       mobile!
			isOpen={isHovered || isFocused}
		>
			<Flex
				align="center"
				backgroundColor={hasGlitches ? yellowBackground : greenBackground}
				borderColor={hasGlitches ? yellowBorderColor : greenBorderColor}
				color={hasGlitches ? yellowTextColor : greenTextColor}
				border="1px solid"
				borderRadius="md"
				boxShadow="md"
				paddingX="2"
				paddingY="1"
				transition="all 0.2s"
				tabIndex="0"
				_focus={{ outline: "none", boxShadow: "outline" }}
				// For consistency between the HTML5Badge & OutfitKnownGlitchesBadge
				minHeight="30px"
				onMouseEnter={() => setIsHovered(true)}
				onMouseLeave={() => setIsHovered(false)}
				onFocus={() => setIsFocused(true)}
				onBlur={() => setIsFocused(false)}
				{...props}
			>
				{children}
			</Flex>
		</Tooltip>
	);
}

export function layerUsesHTML5(layer) {
	return Boolean(
		layer.svgUrl ||
			layer.canvasMovieLibraryUrl ||
			// If this glitch is applied, then `svgUrl` will be null, but there's still
			// an HTML5 manifest that the official player can render.
			(layer.knownGlitches || []).includes("OFFICIAL_SVG_IS_INCORRECT"),
	);
}

export default HTML5Badge;