import {
	INodeProperties,
} from 'n8n-workflow';

export const couponOperations = [
	{
		displayName: 'Operation',
		name: 'operation',
		type: 'options',
		displayOptions: {
			show: {
				resource: [
					'coupon',
				],
			},
		},
		options: [
			{
				name: 'Create',
				value: 'create',
				description: 'Create a coupon.',
			},
			{
				name: 'Get All',
				value: 'getAll',
				description: 'Get all coupons.',
			},
			{
				name: 'Update',
				value: 'update',
				description: 'Update a coupon.',
			},
		],
		default: 'create',
		description: 'The operation to perform.',
	},
] as INodeProperties[];

export const couponFields = [
	/* -------------------------------------------------------------------------- */
	/*                                 coupon:create	                          */
	/* -------------------------------------------------------------------------- */
	{
		displayName: 'Coupon Type',
		name: 'couponType',
		type: 'options',
		displayOptions: {
			show: {
				resource: [
					'coupon',
				],
				operation: [
					`create`,
				],
				jsonParameters: [
					false,
				],
			},
		},
		default: 'checkout',
		description: 'Either product (valid for specified products or subscription plans) or checkout (valid for any checkout).',
		options: [
			{
				name: 'Checkout',
				value: 'checkout',
			},
			{
				name: 'Product',
				value: 'product',
			},
		],
	},
	{
		displayName: 'Product IDs',
		name: 'productIds',
		type: 'multiOptions',
		typeOptions: {
			loadOptionsMethod: 'getProducts',
		},
		displayOptions: {
			show: {
				resource: [
					'coupon',
				],
				operation: [
					`create`,
				],
				couponType: [
					'product',
				],
				jsonParameters: [
					false,
				],
			},
		},
		default: '',
		description: 'Comma-separated list of product IDs. Required if coupon_type is product.',
		required: true,
	},
	{
		displayName: 'Discount Type',
		name: 'discountType',
		type: 'options',
		displayOptions: {
			show: {
				resource: [
					'coupon',
				],
				operation: [
					`create`,
				],
				jsonParameters: [
					false,
				],
			},
		},
		default: 'flat',
		description: 'Either flat or percentage.',
		options: [
			{
				name: 'Flat',
				value: 'flat',
			},
			{
				name: 'Percentage',
				value: 'percentage',
			},
		],
	},
	{
		displayName: 'Discount Amount Currency',
		name: 'discountAmount',
		type: 'number',
		default: 1,
		description: 'Discount amount in currency.',
		typeOptions: {
			minValue: 1,
		},
		displayOptions: {
			show: {
				resource: [
					'coupon',
				],
				operation: [
					`create`,
				],
				discountType: [
					'flat',
				],
				jsonParameters: [
					false,
				],
			},
		},
	},
	{
		displayName: 'Discount Amount %',
		name: 'discountAmount',
		type: 'number',
		default: 1,
		description: 'Discount amount in percentage.',
		typeOptions: {
			minValue: 1,
			maxValue: 100,
		},
		displayOptions: {
			show: {
				resource: [
					'coupon',
				],
				operation: [
					`create`,
				],
				discountType: [
					'percentage',
				],
				jsonParameters: [
					false,
				],
			},
		},
	},
	{
		displayName: 'Currency',
		name: 'currency',
		type: 'options',
		default: 'EUR',
		description: 'The currency must match the balance currency specified in your account.',
		options: [
			{
				name: 'ARS',
				value: 'ARS',
			},
			{
				name: 'AUD',
				value: 'AUD',
			},
			{
				name: 'BRL',
				value: 'BRL',
			},
			{
				name: 'CAD',
				value: 'CAD',
			},
			{
				name: 'CHF',
				value: 'CHF',
			},
			{
				name: 'CNY',
				value: 'CNY',
			},
			{
				name: 'CZK',
				value: 'CZK',
			},
			{
				name: 'DKK',
				value: 'DKK',
			},
			{
				name: 'EUR',
				value: 'EUR',
			},
			{
				name: 'GBP',
				value: 'GBP',
			},
			{
				name: 'HKD',
				value: 'HKD',
			},
			{
				name: 'HUF',
				value: 'HUF',
			},
			{
				name: 'INR',
				value: 'INR',
			},
			{
				name: 'JPY',
				value: 'JPY',
			},
			{
				name: 'KRW',
				value: 'KRW',
			},
			{
				name: 'MXN',
				value: 'MXN',
			},
			{
				name: 'NOK',
				value: 'NOK',
			},
			{
				name: 'NZD',
				value: 'NZD',
			},
			{
				name: 'PLN',
				value: 'PLN',
			},
			{
				name: 'RUB',
				value: 'RUB',
			},
			{
				name: 'SEK',
				value: 'SEK',
			},
			{
				name: 'SGD',
				value: 'SGD',
			},
			{
				name: 'THB',
				value: 'THB',
			},
			{
				name: 'TWD',
				value: 'TWD',
			},
			{
				name: 'USD',
				value: 'USD',
			},
			{
				name: 'ZAR',
				value: 'ZAR',
			},
		],
		displayOptions: {
			show: {
				resource: [
					'coupon',
				],
				operation: [
					`create`,
				],
				discountType: [
					'flat',
				],
				jsonParameters: [
					false,
				],
			},
		},
	},
	{
		displayName: 'JSON Parameters',
		name: 'jsonParameters',
		type: 'boolean',
		default: false,
		description: '',
		displayOptions: {
			show: {
				resource: [
					'coupon',
				],
				operation: [
					'create',
				],
			},
		},
	},
	{
		displayName: ' Additional Fields',
		name: 'additionalFieldsJson',
		type: 'json',
		typeOptions: {
			alwaysOpenEditWindow: true,
		},
		default: '',
		displayOptions: {
			show: {
				resource: [
					'coupon',
				],
				operation: [
					'create',
				],
				jsonParameters: [
					true,
				],
			},
		},
		description: `Attributes in JSON form.`,
	},
	{
		displayName: 'Additional Fields',
		name: 'additionalFields',
		type: 'collection',
		placeholder: 'Add Field',
		displayOptions: {
			show: {
				resource: [
					'coupon',
				],
				operation: [
					'create',
				],
				jsonParameters: [
					false,
				],
			},
		},
		default: {},
		options: [
			{
				displayName: 'Allowed Uses',
				name: 'allowedUses',
				type: 'number',
				default: 1,
				description: 'Number of times a coupon can be used in a checkout. This will be set to 999,999 by default, if not specified.',
			},
			{
				displayName: 'Coupon Code',
				name: 'couponCode',
				type: 'string',
				default: '',
				description: 'Will be randomly generated if not specified.',
			},
			{
				displayName: 'Coupon Prefix',
				name: 'couponPrefix',
				type: 'string',
				default: '',
				description: 'Prefix for generated codes. Not valid if coupon_code is specified.',
			},
			{
				displayName: 'Description',
				name: 'description',
				type: 'string',
				default: '',
				description: 'Description of the coupon. This will be displayed in the Seller Dashboard.',
			},
			{
				displayName: 'Expires',
				name: 'expires',
				type: 'dateTime',
				default: '',
				description: 'The coupon will expire on the date at 00:00:00 UTC.',
			},
			{
				displayName: 'Group',
				name: 'group',
				type: 'string',
				typeOptions: {
					minValue: 1,
					maxValue: 50,
				},
				default: '',
				description: 'The name of the coupon group this coupon should be assigned to.',
			},
			{
				displayName: 'Number of Coupons',
				name: 'numberOfCoupons',
				type: 'number',
				default: 1,
				description: 'Number of coupons to generate. Not valid if coupon_code is specified.',
			},
			{
				displayName: 'Recurring',
				name: 'recurring',
				type: 'boolean',
				default: false,
				description: 'If the coupon is used on subscription products, this indicates whether the discount should apply to recurring payments after the initial purchase.',
			},
		],
	},
	/* -------------------------------------------------------------------------- */
	/*                                 coupon:getAll	                          */
	/* -------------------------------------------------------------------------- */
	{
		displayName: 'Product ID',
		name: 'productId',
		type: 'string',
		displayOptions: {
			show: {
				resource: [
					'coupon',
				],
				operation: [
					`getAll`,
				],
			},
		},
		default: '',
		required: true,
		description: 'The specific product/subscription ID.',
	},
	{
		displayName: 'Return All',
		name: 'returnAll',
		type: 'boolean',
		displayOptions: {
			show: {
				operation: [
					'getAll',
				],
				resource: [
					'coupon',
				],
			},
		},
		default: false,
		description: 'If all results should be returned or only up to a given limit.',
	},
	{
		displayName: 'Limit',
		name: 'limit',
		type: 'number',
		displayOptions: {
			show: {
				operation: [
					'getAll',
				],
				resource: [
					'coupon',
				],
				returnAll: [
					false,
				],
			},
		},
		typeOptions: {
			minValue: 1,
			maxValue: 500,
		},
		default: 100,
		description: 'How many results to return.',
	},
	/* -------------------------------------------------------------------------- */
	/*                                 coupon:update	                          */
	/* -------------------------------------------------------------------------- */
	{
		displayName: 'Update by',
		name: 'updateBy',
		type: 'options',
		displayOptions: {
			show: {
				resource: [
					'coupon',
				],
				operation: [
					`update`,
				],
				jsonParameters: [
					false,
				],
			},
		},
		default: 'couponCode',
		description: 'Either flat or percentage.',
		options: [
			{
				name: 'Coupon Code',
				value: 'couponCode',
			},
			{
				name: 'Group',
				value: 'group',
			},
		],
	},
	{
		displayName: 'Coupon Code',
		name: 'couponCode',
		type: 'string',
		displayOptions: {
			show: {
				resource: [
					'coupon',
				],
				operation: [
					'update',
				],
				updateBy: [
					'couponCode',
				],
				jsonParameters: [
					false,
				],
			},
		},
		default: '',
		description: 'Identify the coupon to update',
	},
	{
		displayName: 'Group',
		name: 'group',
		type: 'string',
		displayOptions: {
			show: {
				resource: [
					'coupon',
				],
				operation: [
					'update',
				],
				updateBy: [
					'group',
				],
				jsonParameters: [
					false,
				],
			},
		},
		default: '',
		description: 'The name of the group of coupons you want to update.',
	},
	{
		displayName: 'JSON Parameters',
		name: 'jsonParameters',
		type: 'boolean',
		default: false,
		description: '',
		displayOptions: {
			show: {
				resource: [
					'coupon',
				],
				operation: [
					'update',
				],
			},
		},
	},
	{
		displayName: 'Additional Fields',
		name: 'additionalFieldsJson',
		type: 'json',
		typeOptions: {
			alwaysOpenEditWindow: true,
		},
		default: '',
		displayOptions: {
			show: {
				resource: [
					'coupon',
				],
				operation: [
					'update',
				],
				jsonParameters: [
					true,
				],
			},
		},
		description: `Attributes in JSON form.`,
	},
	{
		displayName: 'Additional Fields',
		name: 'additionalFields',
		type: 'collection',
		placeholder: 'Add Field',
		displayOptions: {
			show: {
				resource: [
					'coupon',
				],
				operation: [
					'update',
				],
				jsonParameters: [
					false,
				],
			},
		},
		default: {},
		options: [
			{
				displayName: 'Allowed Uses',
				name: 'allowedUses',
				type: 'number',
				default: 1,
				description: 'Number of times a coupon can be used in a checkout. This will be set to 999,999 by default, if not specified.',
			},
			{
				displayName: 'Discount',
				name: 'discount',
				type: 'fixedCollection',
				default: 'discountProperties',
				options: [
					{
						displayName: 'Discount Properties',
						name: 'discountProperties',
						values: [
							{
								displayName: 'Currency',
								name: 'currency',
								type: 'options',
								default: 'EUR',
								description: 'The currency must match the balance currency specified in your account.',
								displayOptions: {
									show: {
										discountType: [
											'flat',
										],
									},
								},
								options: [
									{
										name: 'ARS',
										value: 'ARS',
									},
									{
										name: 'AUD',
										value: 'AUD',
									},
									{
										name: 'BRL',
										value: 'BRL',
									},
									{
										name: 'CAD',
										value: 'CAD',
									},
									{
										name: 'CHF',
										value: 'CHF',
									},
									{
										name: 'CNY',
										value: 'CNY',
									},
									{
										name: 'CZK',
										value: 'CZK',
									},
									{
										name: 'DKK',
										value: 'DKK',
									},
									{
										name: 'EUR',
										value: 'EUR',
									},
									{
										name: 'GBP',
										value: 'GBP',
									},
									{
										name: 'HKD',
										value: 'HKD',
									},
									{
										name: 'HUF',
										value: 'HUF',
									},
									{
										name: 'INR',
										value: 'INR',
									},
									{
										name: 'JPY',
										value: 'JPY',
									},
									{
										name: 'KRW',
										value: 'KRW',
									},
									{
										name: 'MXN',
										value: 'MXN',
									},
									{
										name: 'NOK',
										value: 'NOK',
									},
									{
										name: 'NZD',
										value: 'NZD',
									},
									{
										name: 'PLN',
										value: 'PLN',
									},
									{
										name: 'RUB',
										value: 'RUB',
									},
									{
										name: 'SEK',
										value: 'SEK',
									},
									{
										name: 'SGD',
										value: 'SGD',
									},
									{
										name: 'THB',
										value: 'THB',
									},
									{
										name: 'TWD',
										value: 'TWD',
									},
									{
										name: 'USD',
										value: 'USD',
									},
									{
										name: 'ZAR',
										value: 'ZAR',
									},
								],
							},
							{
								displayName: 'Discount Amount Currency',
								name: 'discountAmount',
								type: 'number',
								default: '',
								description: 'Discount amount.',
								displayOptions: {
									show: {
										discountType: [
											'flat',
										],
									},
								},
								typeOptions: {
									minValue: 0,
								},
							},
							{
								displayName: 'Discount Amount Percentage',
								name: 'discountAmount',
								type: 'number',
								default: '',
								description: 'Discount amount.',
								displayOptions: {
									show: {
										discountType: [
											'percentage',
										],
									},
								},
								typeOptions: {
									minValue: 0,
									maxValue: 100,
								},
							},
							{
								displayName: 'Discount Type',
								name: 'discountType',
								type: 'options',
								default: 'flat',
								description: 'Either flat or percentage.',
								options: [
									{
										name: 'Flat',
										value: 'flat',
									},
									{
										name: 'Percentage',
										value: 'percentage',
									},
								],
							},
						],
					},
				],
			},
			{
				displayName: 'Expires',
				name: 'expires',
				type: 'dateTime',
				default: '',
				description: 'The coupon will expire on the date at 00:00:00 UTC.',
			},
			{
				displayName: 'New Coupon Code',
				name: 'newCouponCode',
				type: 'string',
				default: '',
				description: 'New code to rename the coupon to.',
			},
			{
				displayName: 'New Group Name',
				name: 'newGroup',
				type: 'string',
				typeOptions: {
					minValue: 1,
					maxValue: 50,
				},
				default: '',
				description: 'New group name to move coupon to.',
			},
			{
				displayName: 'Product IDs',
				name: 'productIds',
				type: 'string',
				default: '',
				description: 'Comma-separated list of products e.g. 499531,1234,123546. If blank then remove associated products.',
			},
			{
				displayName: 'Recurring',
				name: 'recurring',
				type: 'boolean',
				default: false,
				description: 'If the coupon is used on subscription products, this indicates whether the discount should apply to recurring payments after the initial purchase.',
			},
		],
	},

] as INodeProperties[];
