import { INodeProperties } from 'n8n-workflow';

export const servicesOperations: INodeProperties[] = [
	{
		displayName: 'Operation',
		name: 'operation',
		type: 'options',
		noDataExpression: true,
		displayOptions: {
			show: {
				resource: ['services'],
			},
		},
		options: [
			{
				name: 'Get All',
				value: 'getAll',
				description: 'Get all services',
				action: 'Get all services',
				routing: {
					request: {
						method: 'GET',
						url: '/services',
					},
					output: {
						postReceive: [
							{
								type: 'rootProperty',
								properties: {
									property: 'services',
								},
							},
						],
					},
				},
			},
			{
				name: 'Get for Device',
				value: 'getForDevice',
				description: 'Get services for a specific device',
				action: 'Get services for device',
				routing: {
					request: {
						method: 'GET',
						url: '=/services/{{$parameter.deviceId}}',
					},
					output: {
						postReceive: [
							{
								type: 'rootProperty',
								properties: {
									property: 'services',
								},
							},
						],
					},
				},
			},
			{
				name: 'Create',
				value: 'create',
				description: 'Add a service for a device',
				action: 'Create a service',
				routing: {
					request: {
						method: 'POST',
						url: '=/services/{{$parameter.deviceId}}',
					},
					send: {
						type: 'body',
					},
				},
			},
			{
				name: 'Update',
				value: 'update',
				description: 'Update a service',
				action: 'Update a service',
				routing: {
					request: {
						method: 'PATCH',
						url: '=/services/{{$parameter.serviceId}}',
					},
					send: {
						type: 'body',
					},
				},
			},
			{
				name: 'Delete',
				value: 'delete',
				description: 'Delete a service',
				action: 'Delete a service',
				routing: {
					request: {
						method: 'DELETE',
						url: '=/services/{{$parameter.serviceId}}',
					},
				},
			},
		],
		default: 'getAll',
	},
];

export const servicesFields: INodeProperties[] = [
	// Device ID for device-specific operations
	{
		displayName: 'Device',
		name: 'deviceId',
		type: 'string',
		required: true,
		displayOptions: {
			show: {
				resource: ['services'],
				operation: ['getForDevice', 'create'],
			},
		},
		default: '',
		placeholder: 'hostname or device ID',
		description: 'Device hostname or ID',
	},

	// Service ID for specific operations
	{
		displayName: 'Service ID',
		name: 'serviceId',
		type: 'string',
		required: true,
		displayOptions: {
			show: {
				resource: ['services'],
				operation: ['update', 'delete'],
			},
		},
		default: '',
		description: 'The service ID',
	},

	// Fields for creating services
	{
		displayName: 'Service Type',
		name: 'type',
		type: 'string',
		required: true,
		displayOptions: {
			show: {
				resource: ['services'],
				operation: ['create'],
			},
		},
		default: '',
		placeholder: 'ping, http, tcp, etc.',
		description: 'Type of service to monitor',
	},
	{
		displayName: 'IP Address',
		name: 'ip',
		type: 'string',
		required: true,
		displayOptions: {
			show: {
				resource: ['services'],
				operation: ['create'],
			},
		},
		default: '',
		description: 'IP address of the service',
	},
	{
		displayName: 'Description',
		name: 'desc',
		type: 'string',
		required: true,
		displayOptions: {
			show: {
				resource: ['services'],
				operation: ['create'],
			},
		},
		default: '',
		description: 'Description for the service',
	},

	// Additional options for creating services
	{
		displayName: 'Additional Options',
		name: 'additionalOptions',
		type: 'collection',
		placeholder: 'Add Option',
		default: {},
		displayOptions: {
			show: {
				resource: ['services'],
				operation: ['create'],
			},
		},
		options: [
			{
				displayName: 'Parameters',
				name: 'param',
				type: 'string',
				default: '',
				description: 'Parameters for the service check',
			},
			{
				displayName: 'Ignore',
				name: 'ignore',
				type: 'boolean',
				default: false,
				description: 'Ignore the service for checks',
			},
		],
	},

	// Update options
	{
		displayName: 'Update Fields',
		name: 'updateFields',
		type: 'collection',
		placeholder: 'Add Field',
		default: {},
		displayOptions: {
			show: {
				resource: ['services'],
				operation: ['update'],
			},
		},
		options: [
			{
				displayName: 'Service Disabled',
				name: 'service_disabled',
				type: 'boolean',
				default: false,
				description: 'Whether the service is disabled',
			},
			{
				displayName: 'Service Ignore',
				name: 'service_ignore',
				type: 'boolean',
				default: false,
				description: 'Whether to ignore the service',
			},
		],
	},

	// Filters for getAll and getForDevice
	{
		displayName: 'Filters',
		name: 'filters',
		type: 'collection',
		placeholder: 'Add Filter',
		default: {},
		displayOptions: {
			show: {
				resource: ['services'],
				operation: ['getAll', 'getForDevice'],
			},
		},
		options: [
			{
				displayName: 'State',
				name: 'state',
				type: 'options',
				options: [
					{ name: 'OK', value: '0' },
					{ name: 'Warning', value: '1' },
					{ name: 'Critical', value: '2' },
				],
				default: '',
				description: 'Filter by service state',
				routing: {
					send: {
						type: 'query',
						property: 'state',
					},
				},
			},
			{
				displayName: 'Type',
				name: 'type',
				type: 'string',
				default: '',
				description: 'Filter by service type (uses SQL LIKE)',
				routing: {
					send: {
						type: 'query',
						property: 'type',
					},
				},
			},
		],
	},
];
