import { INodeProperties } from 'n8n-workflow';

export const viewOperations = [
	{
		displayName: 'Operation',
		name: 'operation',
		type: 'options',
		displayOptions: {
			show: {
				resource: [
					'view',
				],
			},
		},
		options: [
			{
				name: 'Delete Row',
				value: 'deleteViewRow',
				description: 'Delete view row',
			},
			{
				name: 'Get',
				value: 'get',
				description: 'Get a view',
			},
			{
				name: 'Get All',
				value: 'getAll',
				description: 'Get all views',
			},
			{
				name: 'Get Columns',
				value: 'getAllViewColumns',
				description: 'Get all views columns',
			},
			{
				name: 'Get Rows',
				value: 'getAllViewRows',
				description: 'Get all views rows',
			},
			{
				name: 'Update Row',
				value: 'updateViewRow',
				description: 'Update row',
			},
			{
				name: 'Push Button',
				value: 'pushViewButton',
				description: 'Push view button',
			},
		],
		default: 'get',
		description: 'The operation to perform.',
	},
] as INodeProperties[];

export const viewFields = [

/* -------------------------------------------------------------------------- */
/*                                   view:get                                 */
/* -------------------------------------------------------------------------- */
	{
		displayName: 'Doc',
		name: 'docId',
		type: 'options',
		required: true,
		typeOptions: {
			loadOptionsMethod: 'getDocs',
		},
		default: '',
		displayOptions: {
			show: {
				resource: [
					'view',
				],
				operation: [
					'get',
				],
			},
		},
		description: 'ID of the doc.',
	},
	{
		displayName: 'View ID',
		name: 'viewId',
		type: 'string',
		required: true,
		default: '',
		displayOptions: {
			show: {
				resource: [
					'view',
				],
				operation: [
					'get',
				],
			},
		},
		description: 'The view to get the row from.',
	},
/* -------------------------------------------------------------------------- */
/*                                   view:getAll                              */
/* -------------------------------------------------------------------------- */
	{
		displayName: 'Doc',
		name: 'docId',
		type: 'options',
		required: true,
		typeOptions: {
			loadOptionsMethod: 'getDocs',
		},
		default: '',
		displayOptions: {
			show: {
				resource: [
					'view',
				],
				operation: [
					'getAll',
				],
			},
		},
		description: 'ID of the doc.',
	},
	{
		displayName: 'Return All',
		name: 'returnAll',
		type: 'boolean',
		displayOptions: {
			show: {
				resource: [
					'view',
				],
				operation: [
					'getAll',
				],
			},
		},
		default: false,
		description: 'If all results should be returned or only up to a given limit.',
	},
	{
		displayName: 'Limit',
		name: 'limit',
		type: 'number',
		displayOptions: {
			show: {
				resource: [
					'view',
				],
				operation: [
					'getAll',
				],
				returnAll: [
					false,
				],
			},
		},
		typeOptions: {
			minValue: 1,
			maxValue: 100,
		},
		default: 50,
		description: 'How many results to return.',
	},
/* -------------------------------------------------------------------------- */
/*                                   view:getAllViewRows                      */
/* -------------------------------------------------------------------------- */
	{
		displayName: 'Doc',
		name: 'docId',
		type: 'options',
		required: true,
		typeOptions: {
			loadOptionsMethod: 'getDocs',
		},
		default: '',
		displayOptions: {
			show: {
				resource: [
					'view',
				],
				operation: [
					'getAllViewRows',
				],
			},
		},
		description: 'ID of the doc.',
	},
	{
		displayName: 'View',
		name: 'viewId',
		type: 'options',
		typeOptions: {
			loadOptionsDependsOn: [
				'docId',
			],
			loadOptionsMethod: 'getViews',
		},
		required: true,
		default: '',
		displayOptions: {
			show: {
				resource: [
					'view',
				],
				operation: [
					'getAllViewRows',
				],
			},
		},
		description: 'The table to get the rows from.',
	},
	{
		displayName: 'Return All',
		name: 'returnAll',
		type: 'boolean',
		displayOptions: {
			show: {
				resource: [
					'view',
				],
				operation: [
					'getAllViewRows',
				],
			},
		},
		default: false,
		description: 'If all results should be returned or only up to a given limit.',
	},
	{
		displayName: 'Limit',
		name: 'limit',
		type: 'number',
		displayOptions: {
			show: {
				resource: [
					'view',
				],
				operation: [
					'getAllViewRows',
				],
				returnAll: [
					false,
				],
			},
		},
		typeOptions: {
			minValue: 1,
			maxValue: 100,
		},
		default: 50,
		description: 'How many results to return.',
	},
	{
		displayName: 'Options',
		name: 'options',
		type: 'collection',
		placeholder: 'Add Option',
		default: {},
		displayOptions: {
			show: {
				resource: [
					'view',
				],
				operation: [
					'getAllViewRows',
				],
			},
		},
		options: [
			{
				displayName: 'Query',
				name: 'query',
				type: 'string',
				typeOptions: {
					alwaysOpenEditWindow: true,
				},
				default: '',
				description: `Query used to filter returned rows, specified as <column_id_or_name>:<value>. <br/>
				If you'd like to use a column name instead of an ID, you must quote it (e.g., "My Column":123).<br/>
				Also note that value is a JSON value; if you'd like to use a string, you must surround it in quotes (e.g., "groceries").`,
			},
			{
				displayName: 'Use Column Names',
				name: 'useColumnNames',
				type: 'boolean',
				default: false,
				description: `Use column names instead of column IDs in the returned output.</br>
				This is generally discouraged as it is fragile. If columns are renamed,</br>
				code using original names may throw errors.`,
			},
			{
				displayName: 'ValueFormat',
				name: 'valueFormat',
				type: 'options',
				default: '',
				options: [
					{
						name: 'Simple',
						value: 'simple',
					},
					{
						name: 'Simple With Arrays',
						value: 'simpleWithArrays',
					},
					{
						name: 'Rich',
						value: 'rich',
					},
				],
				description: `The format that cell values are returned as.`,
			},
			{
				displayName: 'RAW Data',
				name: 'rawData',
				type: 'boolean',
				default: false,
				description: `Returns the data exactly in the way it got received from the API.`,
			},
			{
				displayName: 'Sort By',
				name: 'sortBy',
				type: 'options',
				default: '',
				options: [
					{
						name: 'Created At',
						value: 'createdAt',
					},
					{
						name: 'Natural',
						value: 'natural',
					},
				],
				description: `Specifies the sort order of the rows returned.<br />
				If left unspecified, rows are returned by creation time ascending.`,
			},
		],
	},
/* -------------------------------------------------------------------------- */
/*                                   view:getAllViewColumns                   */
/* -------------------------------------------------------------------------- */
	{
		displayName: 'Doc',
		name: 'docId',
		type: 'options',
		required: true,
		typeOptions: {
			loadOptionsMethod: 'getDocs',
		},
		default: '',
		displayOptions: {
			show: {
				resource: [
					'view',
				],
				operation: [
					'getAllViewColumns',
				],
			},
		},
		description: 'ID of the doc.',
	},
	{
		displayName: 'View',
		name: 'viewId',
		type: 'options',
		typeOptions: {
			loadOptionsDependsOn: [
				'docId',
			],
			loadOptionsMethod: 'getViews',
		},
		required: true,
		default: '',
		displayOptions: {
			show: {
				resource: [
					'view',
				],
				operation: [
					'getAllViewColumns',
				],
			},
		},
		description: 'The table to get the rows from.',
	},
	{
		displayName: 'Return All',
		name: 'returnAll',
		type: 'boolean',
		displayOptions: {
			show: {
				resource: [
					'view',
				],
				operation: [
					'getAllViewColumns',
				],
			},
		},
		default: false,
		description: 'If all results should be returned or only up to a given limit.',
	},
	{
		displayName: 'Limit',
		name: 'limit',
		type: 'number',
		displayOptions: {
			show: {
				resource: [
					'view',
				],
				operation: [
					'getAllViewColumns',
				],
				returnAll: [
					false,
				],
			},
		},
		typeOptions: {
			minValue: 1,
			maxValue: 100,
		},
		default: 50,
		description: 'How many results to return.',
	},
/* -------------------------------------------------------------------------- */
/*                                   view:deleteViewRow                       */
/* -------------------------------------------------------------------------- */
	{
		displayName: 'Doc',
		name: 'docId',
		type: 'options',
		required: true,
		typeOptions: {
			loadOptionsMethod: 'getDocs',
		},
		default: '',
		displayOptions: {
			show: {
				resource: [
					'view',
				],
				operation: [
					'deleteViewRow',
				],
			},
		},
		description: 'ID of the doc.',
	},
	{
		displayName: 'View',
		name: 'viewId',
		type: 'options',
		required: true,
		default: '',
		typeOptions: {
			loadOptionsMethod: 'getViews',
			loadOptionsDependsOn: [
				'docId',
			],
		},
		displayOptions: {
			show: {
				resource: [
					'view',
				],
				operation: [
					'deleteViewRow',
				],
			},
		},
		description: 'The view to get the row from.',
	},
	{
		displayName: 'Row',
		name: 'rowId',
		type: 'options',
		required: true,
		default: '',
		typeOptions: {
			loadOptionsMethod: 'getViewRows',
			loadOptionsDependsOn: [
				'viewId',
			],
		},
		displayOptions: {
			show: {
				resource: [
					'view',
				],
				operation: [
					'deleteViewRow',
				],
			},
		},
		description: 'The view to get the row from.',
	},
/* -------------------------------------------------------------------------- */
/*                                   view:pushViewButton                      */
/* -------------------------------------------------------------------------- */
	{
		displayName: 'Doc',
		name: 'docId',
		type: 'options',
		required: true,
		typeOptions: {
			loadOptionsMethod: 'getDocs',
		},
		default: '',
		displayOptions: {
			show: {
				resource: [
					'view',
				],
				operation: [
					'pushViewButton',
				],
			},
		},
		description: 'ID of the doc.',
	},
	{
		displayName: 'View',
		name: 'viewId',
		type: 'options',
		required: true,
		default: '',
		typeOptions: {
			loadOptionsMethod: 'getViews',
			loadOptionsDependsOn: [
				'docId',
			],
		},
		displayOptions: {
			show: {
				resource: [
					'view',
				],
				operation: [
					'pushViewButton',
				],
			},
		},
		description: 'The view to get the row from.',
	},
	{
		displayName: 'Row',
		name: 'rowId',
		type: 'options',
		required: true,
		default: '',
		typeOptions: {
			loadOptionsMethod: 'getViewRows',
			loadOptionsDependsOn: [
				'viewId',
			],
		},
		displayOptions: {
			show: {
				resource: [
					'view',
				],
				operation: [
					'pushViewButton',
				],
			},
		},
		description: 'The view to get the row from.',
	},
	{
		displayName: 'Column',
		name: 'columnId',
		type: 'options',
		required: true,
		typeOptions: {
			loadOptionsMethod: 'getViewColumns',
			loadOptionsDependsOn: [
				'docId',
				'viewId',
			],
		},
		default: '',
		displayOptions: {
			show: {
				resource: [
					'view',
				],
				operation: [
					'pushViewButton',
				],
			},
		},
	},
/* -------------------------------------------------------------------------- */
/*                                   view:updateViewRow                       */
/* -------------------------------------------------------------------------- */
	{
		displayName: 'Doc',
		name: 'docId',
		type: 'options',
		required: true,
		typeOptions: {
			loadOptionsMethod: 'getDocs',
		},
		default: '',
		displayOptions: {
			show: {
				resource: [
					'view',
				],
				operation: [
					'updateViewRow',
				],
			},
		},
		description: 'ID of the doc.',
	},
	{
		displayName: 'View',
		name: 'viewId',
		type: 'options',
		required: true,
		default: '',
		typeOptions: {
			loadOptionsMethod: 'getViews',
			loadOptionsDependsOn: [
				'docId',
			],
		},
		displayOptions: {
			show: {
				resource: [
					'view',
				],
				operation: [
					'updateViewRow',
				],
			},
		},
		description: 'The view to get the row from.',
	},
	{
		displayName: 'Row',
		name: 'rowId',
		type: 'options',
		required: true,
		default: '',
		typeOptions: {
			loadOptionsMethod: 'getViewRows',
			loadOptionsDependsOn: [
				'viewId',
			],
		},
		displayOptions: {
			show: {
				resource: [
					'view',
				],
				operation: [
					'updateViewRow',
				],
			},
		},
		description: 'The view to get the row from.',
	},
	{
		displayName: 'Key Name',
		name: 'keyName',
		type: 'string',
		required: true,
		default: 'columns',
		displayOptions: {
			show: {
				resource: [
					'view',
				],
				operation: [
					'updateViewRow',
				],
			},
		},
		description: 'The view to get the row from.',
	},
	{
		displayName: 'Options',
		name: 'options',
		type: 'collection',
		placeholder: 'Add Option',
		default: {},
		displayOptions: {
			show: {
				resource: [
					'view',
				],
				operation: [
					'updateViewRow',
				],
			},
		},
		options: [
			{
				displayName: 'Disable Parsing',
				name: 'disableParsing',
				type: 'boolean',
				default: false,
				description: `If true, the API will not attempt to parse the data in any way.`,
			},
		],
	},
] as INodeProperties[];