import type { FieldDefinition } from '@atlaskit/editor-common/extensions';

export const nativeFields: FieldDefinition[] = [
	{
		type: 'tab-group',
		label: 'Tab type',
		name: 'tabGroup',
		fields: [
			{
				type: 'tab',
				label: 'Tab A',
				name: 'optionA',
				fields: [
					{
						name: 'expandField',
						type: 'expand',
						label: 'awesome expand field',
						isExpanded: true,
						fields: [
							{
								name: 'textFieldOne',
								type: 'string',
								label: 'Free text',
							},
						],
					},
					{
						name: 'textFieldThree',
						type: 'string',
						label: 'Free text',
					},
				],
			},
			{
				type: 'tab',
				label: 'Tab B',
				name: 'optionB',
				fields: [
					{
						name: 'textFieldTwo',
						type: 'string',
						label: 'Free text',
					},
				],
			},
		],
	},
	{
		name: 'text-field',
		type: 'string',
		label: 'Free text',
		isRequired: true,
		description: 'Add any text',
		defaultValue: 'I am the default text',
	},
	{
		name: 'text-field-multiline',
		type: 'string',
		label: 'Free text',
		isRequired: true,
		description: 'Add any text across multiple lines',
		defaultValue: 'I am the default multiline text',
		style: 'multiline',
	},
	{
		name: 'text-field-optional',
		type: 'string',
		label: 'Text',
		isRequired: false,
		description: 'Leave it empty',
		placeholder: 'Text goes here',
	},
	{
		name: 'text-field-hidden',
		type: 'string',
		label: 'Hidden text field',
		defaultValue: 'this is a hidden value passed to the extension',
		isHidden: true,
	},
	{
		name: 'number-field',
		type: 'number',
		label: 'Number',
		isRequired: true,
		placeholder: 'Number goes here',
	},
	{
		name: 'boolean-field-required',
		type: 'boolean',
		label: 'Needs to be checked',
		description:
			'<b>A</b> <i>checkbox</i> that can be <code>true</code> or <strong>false</strong> <em>(by design)</em>',
		isRequired: true,
	},
	{
		name: 'boolean-field-optional',
		type: 'boolean',
		label: 'Do you want free shipping?',
		description: 'True or <b>FALSE</b> (should be bolded)',
	},
	{
		name: 'boolean-field-toggle',
		type: 'boolean',
		label: 'Turn on the Wi-Fi?',
		description: 'On or Off',
		style: 'toggle',
		defaultValue: true,
	},
	{
		name: 'date-start',
		type: 'date',
		label: 'Date',
		description: `Nothing of <a onclick="alert('something is wrong')">interest</a>`,
		placeholder: 'Date goes here',
	},
	{
		name: 'enum-select',
		type: 'enum',
		label: 'Select one',
		isRequired: true,
		description: 'Pick one',
		style: 'select',
		isMultiple: false,
		placeholder: 'Selected option goes here',
		items: [
			{ label: 'Option A', value: 'a' },
			{ label: 'Option B', value: 'b' },
		],
	},
	{
		name: 'enum-select-icon',
		type: 'enum',
		label: 'Select with icons',
		description: 'Pick one',
		style: 'select',
		isMultiple: false,
		items: [
			{
				label: 'Option A',
				value: 'a',
				description: 'Recommended',
				icon: 'https://i.picsum.photos/id/237/24/24.jpg',
			},
			{
				label: 'Option B with a really really really really really really long label',
				value: 'b',
				description: 'One of the best options out there',
				icon: 'https://i.picsum.photos/id/240/24/24.jpg',
			},
		],
	},
	{
		name: 'enum-select-icon-multiple',
		type: 'enum',
		label: 'Select with icons (multiple)',
		description: 'Pick many',
		defaultValue: ['a', 'b', 'long'],
		style: 'select',
		placeholder: 'Selected options go here',
		isMultiple: true,
		items: [
			{
				label: 'Option A',
				value: 'a',
				description: 'Our most popular pick',
				icon: 'https://i.picsum.photos/id/237/24/24.jpg',
			},
			{
				label: 'Option B',
				value: 'b',
				description: 'Many people like this one',
				icon: 'https://i.picsum.photos/id/240/24/24.jpg',
			},
			{
				label: 'Option Long, a really long label (longer than we expected)',
				value: 'long',
				description: 'Many people like this one',
				icon: 'https://i.picsum.photos/id/240/24/24.jpg',
			},
		],
	},
	{
		name: 'enum-select-multiple',
		type: 'enum',
		label: 'Select 1 or many',
		description: '1 required, no default',
		style: 'select',
		isRequired: true,
		isMultiple: true,
		items: [
			{ label: 'Option A', value: 'a' },
			{ label: 'Option B', value: 'b' },
			{ label: 'Option C', value: 'c' },
			{ label: 'Option D', value: 'd' },
			{ label: 'Option E', value: 'e' },
		],
	},
	{
		name: 'enum-radio-required',
		type: 'enum',
		label: 'Select one',
		description: 'One is always required',
		style: 'radio',
		isRequired: true,
		isMultiple: false,
		items: [
			{ label: 'Option A', value: 'a' },
			{ label: 'Option B', value: 'b' },
			{ label: 'Option C', value: 'c' },
			{ label: 'Option D', value: 'd' },
			{ label: 'Option E', value: 'e' },
		],
	},
	{
		name: 'enum-radio-defaulted',
		type: 'enum',
		label: 'Select one (defaulted)',
		description: 'One is always required, but we default it',
		style: 'radio',
		isRequired: false,
		defaultValue: 'a',
		items: [
			{ label: 'Option A', value: 'a' },
			{ label: 'Option B', value: 'b' },
			{ label: 'Option C', value: 'c' },
			{ label: 'Option D', value: 'd' },
			{ label: 'Option E', value: 'e' },
		],
	},
	{
		name: 'enum-checkbox-multiple',
		type: 'enum',
		label: 'Select 1 or many, or none',
		description: 'Nothing required, no default',
		style: 'checkbox',
		isRequired: false,
		isMultiple: true,
		items: [
			{
				label: 'Option A',
				value: 'a',
				description: 'tooltip description for a',
			},
			{
				label: 'Option B',
				value: 'b',
				description: 'tooltip description for b',
			},
			{
				label: 'Option C',
				value: 'c',
				description: 'tooltip description for c',
			},
			{
				label: 'Option D',
				value: 'd',
				description: 'tooltip description for d',
			},
			{
				label: 'Option E',
				value: 'e',
				description: 'tooltip description for e',
			},
		],
	},
	{
		name: 'enum-checkbox-multiple-required',
		type: 'enum',
		label: 'Select 1 or many',
		description: 'Something required',
		style: 'checkbox',
		isRequired: true,
		isMultiple: true,
		items: [
			{
				label: 'Option A',
				value: 'a',
				description: 'tooltip description for a',
			},
			{
				label: 'Option B',
				value: 'b',
				description: 'tooltip description for b',
			},
			{
				label: 'Option C',
				value: 'c',
				description: 'tooltip description for c',
			},
			{
				label: 'Option D',
				value: 'd',
				description: 'tooltip description for d',
			},
			{
				label: 'Option E',
				value: 'e',
				description: 'tooltip description for e',
			},
		],
	},
	{
		name: 'unhandled',
		// eslint-disable-next-line @typescript-eslint/no-explicit-any
		type: 'foobar' as any,
		label: 'Unknown type',
	},
	{
		name: 'fieldset-cql',
		type: 'fieldset',
		label: 'CQL',
		options: {
			isDynamic: true,
			transformer: {
				type: 'cql',
			},
		},
		fields: [
			{
				name: 'created-at',
				type: 'date-range',
				label: 'Created at',
				description: `This is how we select date range in the cql component`,
				items: [
					{ label: 'Any date', value: '' },
					{ label: 'Last 24 hours', value: 'now(-1d)' },
					{ label: 'Last week', value: 'now(-1w)' },
					{ label: 'Last month', value: 'now(-1M)' },
					{ label: 'Last year', value: 'now(-1y)' },
				],
			},
			{
				name: 'last-modified',
				type: 'date-range',
				label: 'Last modified',
				items: [
					{ label: 'Today', value: 'now(-1d)' },
					{ label: 'This week', value: 'now(-1w)' },
					{ label: 'This month', value: 'now(-1M)' },
					{ label: 'This year', value: 'now(-1y)' },
				],
			},
			{
				name: 'query',
				type: 'string',
				label: 'Search term',
			},
			{
				name: 'custom',
				type: 'custom',
				label: 'Custom: Select anything',
				isRequired: true,
				options: {
					resolver: {
						type: 'mock-resolver',
					},
				},
			},
			{
				name: 'content',
				type: 'enum',
				label: 'Content Type',
				isRequired: false,
				style: 'checkbox',
				isMultiple: true,
				items: [
					{
						label: 'Page',
						value: 'page',
					},
					{
						label: 'Blogpost',
						value: 'blogpost',
					},
					{
						label: 'Question',
						value: 'question',
					},
				],
			},
		],
	},
	{
		name: 'fieldset-without-label',
		type: 'fieldset',
		label: 'Fieldset without label',
		options: {
			isDynamic: true,
			showTitle: false,
			transformer: {
				type: 'cql',
			},
		},
		fields: [
			{
				name: 'inner-text',
				type: 'string',
				label: 'Search term',
			},
		],
	},
	{
		name: 'fieldset-jira-filter',
		type: 'fieldset',
		label: 'Issues filter',
		options: {
			isDynamic: true,
			transformer: {
				type: 'cql',
			},
		},
		fields: [
			{
				name: 'keywords',
				type: 'string',
				label: 'Keywords',
			},
			{
				name: 'project',
				type: 'enum',
				label: 'Project',
				isRequired: false,
				style: 'select',
				items: [
					{
						label: 'Editor platform',
						value: 'editor-platform',
					},
					{
						label: 'Editor experiences',
						value: 'editor-experiences',
					},
				],
			},
			{
				name: 'status',
				type: 'enum',
				label: 'Status',
				isRequired: false,
				style: 'select',
				items: [
					{
						label: 'To do',
						value: 'to-do',
					},
					{
						label: 'In Progress',
						value: 'in-progress',
					},
					{
						label: 'Done',
						value: 'Done',
					},
				],
			},
		],
	},
	{
		name: 'expand field',
		type: 'expand',
		label: 'awesome expand field',
		fields: [
			{
				name: 'enum-select-expand',
				type: 'enum',
				label: 'Select one',
				isRequired: true,
				description: 'Pick one',
				style: 'select',
				isMultiple: false,
				placeholder: 'Selected option goes here',
				items: [
					{ label: 'Option A', value: 'a' },
					{ label: 'Option B', value: 'b' },
				],
			},
			{
				name: 'enum-select-icon-expand',
				type: 'enum',
				label: 'Select with icons',
				description: 'Pick one',
				style: 'select',
				isMultiple: false,
				items: [
					{
						label: 'Option A',
						value: 'a',
						description: 'Recommended',
					},
					{
						label: 'Option B with a really really really really really really long label',
						value: 'b',
						description: 'One of the best options out there',
					},
				],
			},
		],
	},
	{
		name: 'color-picker',
		label: 'Color Picker',
		type: 'color',
		description: 'Pick your color',
		defaultValue: '#7AB2FF',
	},
	{
		name: 'color-picker-req',
		label: 'Color Picker Required',
		type: 'color',
		isRequired: true,
		description: 'Pick your color',
		defaultValue: '#7AB2FF',
	},
];

export const customFields: FieldDefinition[] = [
	{
		name: 'custom-required',
		type: 'custom',
		label: 'Custom: Required',
		description: 'Select the option',
		isRequired: true,
		options: {
			resolver: {
				type: 'mock-resolver',
			},
		},
	},
	{
		name: 'custom-optional',
		type: 'custom',
		label: 'Custom: Optional',
		description: 'Select the option, maybe',
		options: {
			resolver: {
				type: 'mock-resolver',
			},
		},
	},
	{
		name: 'custom-required-create',
		type: 'custom',
		label: 'Custom: Create an option',
		description: 'Select or create an option',
		isRequired: true,
		options: {
			isCreatable: true,
			resolver: {
				type: 'mock-resolver',
			},
		},
	},
	{
		name: 'custom-create-multiple',
		type: 'custom',
		label: 'Custom: Create option(s)',
		description: 'Select or create option(s)',
		isMultiple: true,
		options: {
			isCreatable: true,
			resolver: {
				type: 'mock-resolver',
			},
		},
	},
	{
		name: 'custom-format-create-label',
		type: 'custom',
		label: 'Custom: Customized create label',
		description: 'Select or create an option with a custom label',
		options: {
			isCreatable: true,
			formatCreateLabel: (value: string) => {
				return `Add "${value}" to the list`;
			},
			resolver: {
				type: 'mock-resolver',
			},
		},
	},
	{
		name: 'unsupported',
		type: 'custom',
		label: 'Custom: Missing provider',
		options: {
			resolver: {
				type: 'missing-type',
			},
		},
	},
	{
		name: 'user-jdog',
		type: 'user',
		label: 'JDog User',
		options: {
			provider: {
				type: 'user-jdog-provider',
			},
		},
	},
	{
		name: 'user-jdog-required',
		type: 'user',
		label: 'JDog User (Required)',
		isRequired: true,
		options: {
			provider: {
				type: 'user-jdog-provider',
			},
		},
	},
	{
		name: 'user-jdog-multiple',
		type: 'user',
		label: 'JDog User (Multiple, Required)',
		isRequired: true,
		isMultiple: true,
		options: {
			provider: {
				type: 'user-jdog-provider',
			},
		},
	},
];
