import { InspectorControls } from '@wordpress/block-editor';
import { __ } from '@wordpress/i18n';
import PanelArea from '../../../components/panel-area';
import { useEffect, useMemo, useState } from '@wordpress/element';
import SelectQueryParameter from './inspector-controls/SelectQueryParameter';
import AddQueryParameterButton from './inspector-controls/AddQueryParameterButton';
import ParameterList from './inspector-controls/parameter-list';
import useQueryReducer from '../hooks/useQueryReducer';
import isEmpty from '../../../utils/object-is-empty';
import queryParameterOptions from '../query-parameters';
import getIcon from '../../../utils/get-icon';
import { ToggleControl } from '@wordpress/components';
import { isEqual } from 'lodash';

export default ( { attributes, setAttributes } ) => {
	const { queryState, insertParameters, setParameter, removeParameter } = useQueryReducer( attributes.query );
	const [ displayParameterSelect, setDisplayParameterSelect ] = useState( false );

	useEffect( () => {
		if ( isEmpty( attributes.query ) ) {
			insertParameters( {
				post_type: 'post',
				per_page: 10,
			} );
		}
	}, [] );

	useEffect( () => {
		setAttributes( { query: queryState } );
	}, [ JSON.stringify( queryState ), ! isEqual( attributes.query, queryState ) ] );

	const parameterOptions = useMemo( () => (
		queryParameterOptions.map( ( parameter ) => {
			parameter.isDisabled = ! parameter.isRepeatable && Object.keys( queryState ).includes( parameter.id );

			return parameter;
		} )
	), [ queryState ] );

	return (
		<InspectorControls>
			<PanelArea
				id={ 'queryLoopControls' }
				title={ __( 'Query Parameters', 'generateblocks' ) }
				initialOpen={ true }
				icon={ getIcon( 'query-params' ) }
				className="gblocks-panel-label"
			>
				<ToggleControl
					label={ __( 'Inherit query from template', 'generateblocks' ) }
					help={ __( 'Toggle to use the global query context that is set with the current template, such as an archive or search.', 'generateblocks' ) }
					checked={ !! attributes.inheritQuery }
					onChange={ ( value ) => setAttributes( { inheritQuery: value } ) }
				/>

				{ ! attributes.inheritQuery &&
					<>
						<ParameterList
							query={ queryState }
							setParameter={ setParameter }
							removeParameter={ removeParameter }
						/>

						{ ! displayParameterSelect &&
							<AddQueryParameterButton onClick={ () => {
								setDisplayParameterSelect( true );
							} } />
						}

						{ displayParameterSelect &&
							<SelectQueryParameter
								options={ parameterOptions }
								onChange={ ( option ) => {
									if (
										!! option.isRepeatable &&
										Array.isArray( option.default ) &&
										!! option.repeatableDefaultValue
									) {
										const parameterValue = !! queryState[ option.id ]
											? queryState[ option.id ]
											: option.default;

										setParameter( option.id, [ ...parameterValue, option.repeatableDefaultValue ] );
									} else {
										setParameter( option.id, option.default );
									}

									setDisplayParameterSelect( false );
								} }
							/>
						}
					</>
				}
			</PanelArea>
		</InspectorControls>
	);
};