var el = wp.element.createElement,
	registerBlockType = wp.blocks.registerBlockType,
	ServerSideRender = wp.ServerSideRender,
	SelectControl = wp.components.SelectControl,
	CheckboxControl = wp.components.CheckboxControl,
	RangeControl = wp.components.RangeControl,
	InspectorControls = wp.blockEditor.InspectorControls,
	PanelColorSettings = wp.blockEditor.PanelColorSettings,
	PanelBody = wp.components.PanelBody,
	NumberControl = wp.components.__experimentalNumberControl,
	Button = wp.components.Button,
	TabPanel = wp.components.TabPanel;

if ( typeof ssaAppointmentTypesViewOptions === 'undefined' ) {
	ssaAppointmentTypesViewOptions = null;
}

if ( typeof ssaBookingFlowOptions === 'undefined' ) {
	ssaBookingFlowOptions = null
}


registerBlockType("ssa/booking", {
	title: "Appointment Booking Form",
	description:
		"Displays an Appointment Booking Form. You can customize the appointment type and styles.",
	icon: "calendar-alt",
	category: "widgets",
	example: {},

	edit: function (props) {

		// For exsiting/old shortcodes before introducing the checkboxes; run Conversion
		// Needed only for the selected type to be checked in UI
		if(props.attributes.type){
			let type = props.attributes.type;
			props.setAttributes({ types : [type] });
			props.setAttributes({ type : '' } );
		}

		var apptTypeOptions = 
			{
				All: 'All',
			};
		Object.keys(ssaAppointmentTypes).forEach(function (key) {
			apptTypeOptions[key] = ssaAppointmentTypes[key]
		});

		function onCheckChange(isChecked) {
			let element = this.valueOf()
			if(isChecked){
				if(!props.attributes.types.includes(element)){
					if(element==='All'){
						props.setAttributes({ types: Object.keys(apptTypeOptions) });
					} else {
						let selectedApptType = [...props.attributes.types]
						selectedApptType.push(element)
						props.setAttributes({ types: selectedApptType });
					}
				}
			} else {
				if(props.attributes.types.includes(element)){
					if(element==='All'){
						let selectedAppTypes = Object.keys(apptTypeOptions)
						index = selectedAppTypes.indexOf('All');
						selectedAppTypes.splice(index, 1);
						props.setAttributes({ types: selectedAppTypes });
					} else {
						let selectedApptType = [...props.attributes.types]
						var index = selectedApptType.indexOf(element);
						selectedApptType.splice(index, 1);
						props.setAttributes({ types: selectedApptType });
					}
				}
			}
		}

		var apptTypeCheckboxes = Object.keys(apptTypeOptions).filter((option) => {
			if(props.attributes.types.includes('All')){
				return option === 'All'
			}
			return true
		}).map(function(key) {
			// Render the checkboxes elements inside a parent container
			// Only render the uncheck all button besides the All checkbox
			return el(
							"div",
							{ className: "ssa-checkboxes-input-container" },
							el(CheckboxControl, {
								onChange: onCheckChange.bind(key),
								label: apptTypeOptions[key],
								checked: props.attributes.types.includes(key)
							}),
							(key === 'All' && !props.attributes.types.includes('All') && props.attributes.types.length ) ?
							el(Button, {
								isSecondary: true,
								className: "ssa-block-booking-uncheck-all",
								onClick: function () {
										props.setAttributes({
												types: [],
										});
								}
							}, 'Uncheck All') : 
							null,
						)
			
		})

		var LabelsOptions = [
			{
				value: "All",
				label: "All",
			},
		];
		Object.keys(ssaAppointmentTypeLabels).forEach(function (key) {
			LabelsOptions.push({
				value: key,
				label: ssaAppointmentTypeLabels[key],
			});
		});

		/* BOOKING FLOW */
		let bookingFlowTabs = [
			{
				name: 'date',
				title: 'Date View',
				className: 'tab-date-view',
			},
			{
				name: 'time',
				title: 'Time View',
				className: 'tab-time-view',
			},
		];

		const displaybookingFlowTabs = () => {
			if (props.attributes.flow === 'express') {
				return bookingFlowTabs.filter(tab => tab.name !== 'date')
			} else if (props.attributes.flow === 'first_available' && props.attributes.fallback_flow === 'express') {
				return bookingFlowTabs.filter(tab => tab.name !== 'date')
			}
			return bookingFlowTabs;
		}
		/* END BOOKING FLOW */

		return [
			el(
				"div",
				{ className: "ssa-block-container" },
				el(ServerSideRender, {
					block: "ssa/booking",
					attributes: props.attributes,
				}),
				el("div", {
					className: "ssa-block-handler",
				})
			),
			el(
				InspectorControls,
				{},
				el(
					PanelBody,
					{ title: "Select Appointment types", initialOpen: false },
					el(SelectControl, {
						label: 'Filter by',
						value: props.attributes.filter,
						options: [
							{
								value: "types",
								label: "Appointment types",
							},
							{
								value: "label",
								label: "Label",
							},
						],
						onChange: function (value) {
							props.setAttributes({ filter: value });
						},
					}),
					props.attributes.filter === 'label' ?
					el(SelectControl, {
						label: "Labels",
						value: props.attributes.label,
						options: LabelsOptions,
						onChange: function (value) {
							props.setAttributes({ label: value });
						},
					}) :
					el('div', null, apptTypeCheckboxes)
				),

				/* Appointment types view */
				ssaAppointmentTypesViewOptions && el(
					PanelBody,
					{ title: "Appointment types view", initialOpen: false },
					el(SelectControl, {
						label: "Appointment types view",
						value: props.attributes.appointment_types_view,
						options: ssaAppointmentTypesViewOptions,
						onChange: function (value) {
							props.setAttributes({ appointment_types_view: value });
						},
					}),
				),
				/* End Appointment types view */

				/* Booking flow */
				ssaBookingFlowOptions && el(
					PanelBody,
					{ title: "Booking Flow", initialOpen: false },
					el(SelectControl, {
						label: "Main Booking layout",
						value: props.attributes.flow,
						options: ssaBookingFlowOptions.main_booking_flow,
						onChange: function (value) {
							props.setAttributes({ flow: value });
						},
					}),
					props.attributes.flow === 'first_available' && 	el(
						'PanelBody',
						{ title: "first_available", initialOpen: false },
						el('div', {}, 'First available within:'),
						el(
							'div',
							{ className: "ssa_first_available_control_wrapper" },
							el(NumberControl, {
								label:"Duration",
								value: props.attributes.suggest_first_available_duration,
								min:1,
								onChange: function (value) {
									props.setAttributes({ suggest_first_available_duration: value });
								},
							}),
							el(SelectControl, {
								label: "Duration Unit",
								className: 'ssa_duration_unit',
								value: props.attributes.suggest_first_available_duration_unit,
								options: ssaBookingFlowOptions.suggest_first_available.duration_unit,
								onChange: function (value) {
									props.setAttributes({ suggest_first_available_duration_unit: value });
								},
							}),
						),
					),
					props.attributes.flow === 'first_available' && el(SelectControl, {
						label: "Fallback Flow",
						value: props.attributes.fallback_flow,
						options: ssaBookingFlowOptions.fallback_flow,
						onChange: function (value) {
							props.setAttributes({ fallback_flow: value });
						},
					}),
					props.attributes.flow !== 'appt_type_settings' && el(TabPanel, {
						className: 'ssa-bookingflow-tab-panel',
						activeClass: 'active-tab',
						tabs: displaybookingFlowTabs(),
						orientation: 'horizontal',
						// initialTabName: 'team_members', // the name of the tab that is selected by default
						children: function(tab) {
								switch (tab.name) {
										case 'date':
												return el(SelectControl, {
													label: 'Date view',
													value: props.attributes.date_view,
													options: ssaBookingFlowOptions.date_view,
													onChange: function (value) {
														props.setAttributes({ date_view: value });
													},
												});
										case 'time':
											return el(SelectControl, {
												label: 'Time view',
												value: props.attributes.time_view,
												options: ssaBookingFlowOptions.time_view,
												onChange: function (value) {
													props.setAttributes({ time_view: value });
												},
											});
								}
						},
					}),
				),
				/* End Booking flow */

				el(PanelColorSettings, {
					title: "Colors",
					colorSettings: [
						{
							value: props.attributes.accent_color,
							label: "Accent Color",
							onChange: function (value) {
								props.setAttributes({
									accent_color: value,
								});
							},
						},
						{
							value: props.attributes.background,
							label: "Background Color",
							onChange: function (value) {
								props.setAttributes({
									background: value,
								});
							},
						},
					],
				}),
				el(
					PanelBody,
					{ title: "Padding", initialOpen: true },
					el(RangeControl, {
						initialPosition: 0,
						value: props.attributes.padding,
						onChange: function (value) {
							props.setAttributes({
								padding: value,
							});
						},
						min: 0,
						max: 100,
					}),
					el(SelectControl, {
						label: "Padding Unit",
						value: props.attributes.padding_unit,
						options: [
							{
								value: "px",
								label: "px",
							},
							{
								value: "em",
								label: "em",
							},
							{
								value: "rem",
								label: "rem",
							},
							{
								value: "vw",
								label: "vw",
							},
							{
								value: "percent",
								label: "%",
							},
						],
						onChange: function (value) {
							props.setAttributes({ padding_unit: value });
						},
					})
				),
				el(
					PanelBody,
					{ title: ssaBlockBookingStrings.performance, initialOpen: false },
					el(CheckboxControl, {
						label: ssaBlockBookingStrings.defer_loading,
						help: ssaBlockBookingStrings.defer_loading_help,
						checked: !!props.attributes.defer,
						onChange: function (value) {
							props.setAttributes({ defer: !!value });
						},
					})
				)
			),
		];
	},

	save: function () {
		return null;
	},
});
