import { __ } from '@wordpress/i18n';
import { ToolbarButton, Dropdown, MenuGroup, MenuItem } from '@wordpress/components';
import { BlockControls } from '@wordpress/block-editor';
import { alignLeft, alignCenter, alignRight, alignJustify } from '@wordpress/icons';
import { useBlockStyles } from '@hooks/useBlockStyles';
import { BlockWidth } from './BlockWidth';

const POPOVER_PROPS = {
	position: 'bottom right',
};

export function AlignmentToolbar( {
	getStyleValue,
	onStyleChange,
	align,
	setAttributes,
	clientId,
	withTextAlign = false,
	withBlockWidth = false,
} ) {
	const {
		atRule,
	} = useBlockStyles();

	function getAlignmentIcon() {
		if ( withTextAlign ) {
			const alignment = getStyleValue( 'textAlign', atRule );

			switch ( alignment ) {
				case 'center':
					return alignCenter;
				case 'right':
					return alignRight;
				case 'justify':
					return alignJustify;
				case 'left':
				default:
					return alignLeft;
			}
		}
	}

	const textAlignments = [
		{
			icon: alignLeft,
			value: 'left',
			label: __( 'Left', 'generateblocks' ),
		},
		{
			icon: alignCenter,
			value: 'center',
			label: __( 'Center', 'generateblocks' ),
		},
		{
			icon: alignRight,
			value: 'right',
			label: __( 'Right', 'generateblocks' ),
		},
		{
			icon: alignJustify,
			value: 'justify',
			label: __( 'Justify', 'generateblocks' ),
		},
	];

	if ( ! withTextAlign && ! withBlockWidth ) {
		return null;
	}

	return (
		<BlockControls group="inline">
			<Dropdown
				popoverProps={ POPOVER_PROPS }
				renderToggle={ ( { isOpen, onToggle } ) => (
					<ToolbarButton
						icon={ getAlignmentIcon() }
						label={ __( 'Alignment', 'generateblocks' ) }
						onClick={ onToggle }
						aria-expanded={ isOpen }
						isPressed={ !! isOpen }
					/>
				) }
				renderContent={ () => (
					<>
						{ !! withTextAlign && (
							<MenuGroup label={ __( 'Text Alignment', 'generateblocks' ) }>
								{ textAlignments.map( ( { icon, value, label } ) => (
									<MenuItem
										key={ value }
										icon={ icon }
										isPressed={ value === getStyleValue( 'textAlign', atRule ) }
										onClick={ () => {
											if ( value === getStyleValue( 'textAlign', atRule ) ) {
												onStyleChange( 'textAlign', '', atRule );
												return;
											}

											onStyleChange( 'textAlign', value, atRule );
										} }
									>
										{ label }
									</MenuItem>
								) ) }
							</MenuGroup>
						) }

						{ !! withBlockWidth && '' === atRule && undefined !== align && (
							<BlockWidth
								align={ align }
								onChange={ ( value ) => setAttributes( { align: value } ) }
								clientId={ clientId }
							/>
						) }
					</>
				) }
			/>
		</BlockControls>
	);
}