import { INodeProperties } from 'n8n-workflow';

export const devicesOperations: INodeProperties[] = [
	{
		displayName: 'Operation',
		name: 'operation',
		type: 'options',
		noDataExpression: true,
		displayOptions: {
			show: {
				resource: ['devices'],
			},
		},
		options: [
			{
				name: 'Get All',
				value: 'getAll',
				description: 'Get all devices',
				action: 'Get all devices',
				routing: {
					request: {
						method: 'GET',
						url: '/devices',
					},
					output: {
						postReceive: [
							{
								type: 'rootProperty',
								properties: {
									property: 'devices',
								},
							},
						],
					},
				},
			},
			{
				name: 'Get',
				value: 'get',
				description: 'Get a device',
				action: 'Get a device',
				routing: {
					request: {
						method: 'GET',
						url: '=/devices/{{$parameter.deviceId}}',
					},
					output: {
						postReceive: [
							{
								type: 'rootProperty',
								properties: {
									property: 'devices',
								},
							},
						],
					},
				},
			},
			{
				name: 'Create',
				value: 'create',
				description: 'Add a new device',
				action: 'Create a device',
				routing: {
					request: {
						method: 'POST',
						url: '/devices',
					},
					send: {
						type: 'body',
					},
				},
			},
			{
				name: 'Update',
				value: 'update',
				description: 'Update a device field',
				action: 'Update a device',
				routing: {
					request: {
						method: 'PATCH',
						url: '=/devices/{{$parameter.deviceId}}',
					},
					send: {
						type: 'body',
					},
				},
			},
			{
				name: 'Delete',
				value: 'delete',
				description: 'Delete a device',
				action: 'Delete a device',
				routing: {
					request: {
						method: 'DELETE',
						url: '=/devices/{{$parameter.deviceId}}',
					},
				},
			},
			{
				name: 'Discover',
				value: 'discover',
				description: 'Trigger device discovery',
				action: 'Discover a device',
				routing: {
					request: {
						method: 'GET',
						url: '=/devices/{{$parameter.deviceId}}/discover',
					},
				},
			},
			{
				name: 'Get Availability',
				value: 'getAvailability',
				description: 'Get device availability statistics',
				action: 'Get device availability',
				routing: {
					request: {
						method: 'GET',
						url: '=/devices/{{$parameter.deviceId}}/availability',
					},
					output: {
						postReceive: [
							{
								type: 'rootProperty',
								properties: {
									property: 'availability',
								},
							},
						],
					},
				},
			},
			{
				name: 'Get Outages',
				value: 'getOutages',
				description: 'Get device outages',
				action: 'Get device outages',
				routing: {
					request: {
						method: 'GET',
						url: '=/devices/{{$parameter.deviceId}}/outages',
					},
					output: {
						postReceive: [
							{
								type: 'rootProperty',
								properties: {
									property: 'outages',
								},
							},
						],
					},
				},
			},
			{
				name: 'Set Maintenance',
				value: 'setMaintenance',
				description: 'Set device into maintenance mode',
				action: 'Set device maintenance',
				routing: {
					request: {
						method: 'POST',
						url: '=/devices/{{$parameter.deviceId}}/maintenance',
					},
					send: {
						type: 'body',
					},
				},
			},
			{
				name: 'Get Maintenance Status',
				value: 'getMaintenanceStatus',
				description: 'Check if device is under maintenance',
				action: 'Get device maintenance status',
				routing: {
					request: {
						method: 'GET',
						url: '=/devices/{{$parameter.deviceId}}/maintenance',
					},
				},
			},
			{
				name: 'Rename',
				value: 'rename',
				description: 'Rename a device',
				action: 'Rename a device',
				routing: {
					request: {
						method: 'PATCH',
						url: '=/devices/{{$parameter.deviceId}}/rename/{{$parameter.newHostname}}',
					},
				},
			},
			{
				name: 'Get Components',
				value: 'getComponents',
				description: 'Get device components',
				action: 'Get device components',
				routing: {
					request: {
						method: 'GET',
						url: '=/devices/{{$parameter.deviceId}}/components',
					},
					output: {
						postReceive: [
							{
								type: 'rootProperty',
								properties: {
									property: 'components',
								},
							},
						],
					},
				},
			},
			{
				name: 'Get Groups',
				value: 'getGroups',
				description: 'Get device groups',
				action: 'Get device groups',
				routing: {
					request: {
						method: 'GET',
						url: '=/devices/{{$parameter.deviceId}}/groups',
					},
					output: {
						postReceive: [
							{
								type: 'rootProperty',
								properties: {
									property: 'groups',
								},
							},
						],
					},
				},
			},
			{
				name: 'Get Ports',
				value: 'getPorts',
				description: 'Get device ports',
				action: 'Get device ports',
				routing: {
					request: {
						method: 'GET',
						url: '=/devices/{{$parameter.deviceId}}/ports',
					},
					output: {
						postReceive: [
							{
								type: 'rootProperty',
								properties: {
									property: 'ports',
								},
							},
						],
					},
				},
			},
			{
				name: 'Get IP Addresses',
				value: 'getIpAddresses',
				description: 'Get device IP addresses',
				action: 'Get device IP addresses',
				routing: {
					request: {
						method: 'GET',
						url: '=/devices/{{$parameter.deviceId}}/ip',
					},
					output: {
						postReceive: [
							{
								type: 'rootProperty',
								properties: {
									property: 'addresses',
								},
							},
						],
					},
				},
			},
		],
		default: 'getAll',
	},
];

export const devicesFields: INodeProperties[] = [
	// Device ID field for operations that need it
	{
		displayName: 'Device',
		name: 'deviceId',
		type: 'string',
		required: true,
		displayOptions: {
			show: {
				resource: ['devices'],
				operation: [
					'get',
					'update',
					'delete',
					'discover',
					'getAvailability',
					'getOutages',
					'setMaintenance',
					'getMaintenanceStatus',
					'rename',
					'getComponents',
					'getGroups',
					'getPorts',
					'getIpAddresses',
				],
			},
		},
		default: '',
		placeholder: 'hostname or device ID',
		description: 'Device hostname or ID',
	},

	// New hostname field for rename operation
	{
		displayName: 'New Hostname',
		name: 'newHostname',
		type: 'string',
		required: true,
		displayOptions: {
			show: {
				resource: ['devices'],
				operation: ['rename'],
			},
		},
		default: '',
		description: 'New hostname for the device',
	},

	// Fields for device creation
	{
		displayName: 'Hostname',
		name: 'hostname',
		type: 'string',
		required: true,
		displayOptions: {
			show: {
				resource: ['devices'],
				operation: ['create'],
			},
		},
		default: '',
		description: 'Device hostname or IP address',
	},
	{
		displayName: 'SNMP Version',
		name: 'version',
		type: 'options',
		displayOptions: {
			show: {
				resource: ['devices'],
				operation: ['create'],
			},
		},
		options: [
			{
				name: 'v1',
				value: 'v1',
			},
			{
				name: 'v2c',
				value: 'v2c',
			},
			{
				name: 'v3',
				value: 'v3',
			},
		],
		default: 'v2c',
		description: 'SNMP version to use',
	},
	{
		displayName: 'Community String',
		name: 'community',
		type: 'string',
		displayOptions: {
			show: {
				resource: ['devices'],
				operation: ['create'],
				version: ['v1', 'v2c'],
			},
		},
		default: 'public',
		description: 'SNMP community string',
	},
	{
		displayName: 'SNMP v3 Username',
		name: 'authlevel',
		type: 'string',
		displayOptions: {
			show: {
				resource: ['devices'],
				operation: ['create'],
				version: ['v3'],
			},
		},
		default: '',
		description: 'SNMPv3 username',
	},
	{
		displayName: 'Authentication Level',
		name: 'authname',
		type: 'options',
		displayOptions: {
			show: {
				resource: ['devices'],
				operation: ['create'],
				version: ['v3'],
			},
		},
		options: [
			{ name: 'No Auth, No Priv', value: 'noAuthNoPriv' },
			{ name: 'Auth, No Priv', value: 'authNoPriv' },
			{ name: 'Auth, Priv', value: 'authPriv' },
		],
		default: 'noAuthNoPriv',
		description: 'SNMPv3 authentication level',
	},
	{
		displayName: 'Authentication Protocol',
		name: 'authpass',
		type: 'options',
		displayOptions: {
			show: {
				resource: ['devices'],
				operation: ['create'],
				version: ['v3'],
				authname: ['authNoPriv', 'authPriv'],
			},
		},
		options: [
			{ name: 'MD5', value: 'MD5' },
			{ name: 'SHA', value: 'SHA' },
		],
		default: 'MD5',
		description: 'SNMPv3 authentication protocol',
	},
	{
		displayName: 'Authentication Password',
		name: 'cryptopass',
		type: 'string',
		typeOptions: { password: true },
		displayOptions: {
			show: {
				resource: ['devices'],
				operation: ['create'],
				version: ['v3'],
				authname: ['authNoPriv', 'authPriv'],
			},
		},
		default: '',
		description: 'SNMPv3 authentication password',
	},
	{
		displayName: 'Privacy Protocol',
		name: 'privproto',
		type: 'options',
		displayOptions: {
			show: {
				resource: ['devices'],
				operation: ['create'],
				version: ['v3'],
				authname: ['authPriv'],
			},
		},
		options: [
			{ name: 'DES', value: 'DES' },
			{ name: 'AES', value: 'AES' },
		],
		default: 'DES',
		description: 'SNMPv3 privacy protocol',
	},
	{
		displayName: 'Privacy Password',
		name: 'privpass',
		type: 'string',
		typeOptions: { password: true },
		displayOptions: {
			show: {
				resource: ['devices'],
				operation: ['create'],
				version: ['v3'],
				authname: ['authPriv'],
			},
		},
		default: '',
		description: 'SNMPv3 privacy password',
	},
	{
		displayName: 'Additional Fields',
		name: 'additionalFields',
		type: 'collection',
		placeholder: 'Add Field',
		default: {},
		displayOptions: {
			show: {
				resource: ['devices'],
				operation: ['create'],
			},
		},
		options: [
			{
				displayName: 'Display Name',
				name: 'display',
				type: 'string',
				default: '',
				description: 'Display name for the device',
			},
			{
				displayName: 'Port',
				name: 'port',
				type: 'number',
				default: 161,
				description: 'SNMP port',
			},
			{
				displayName: 'Transport',
				name: 'transport',
				type: 'options',
				options: [
					{ name: 'UDP', value: 'udp' },
					{ name: 'TCP', value: 'tcp' },
					{ name: 'UDP6', value: 'udp6' },
					{ name: 'TCP6', value: 'tcp6' },
				],
				default: 'udp',
				description: 'SNMP transport protocol',
			},
			{
				displayName: 'Force Add',
				name: 'force_add',
				type: 'boolean',
				default: false,
				description: 'Skip checks and add device directly',
			},
		],
	},

	// Fields for device updates
	{
		displayName: 'Field',
		name: 'field',
		type: 'string',
		required: true,
		displayOptions: {
			show: {
				resource: ['devices'],
				operation: ['update'],
			},
		},
		default: '',
		description: 'Field name to update',
	},
	{
		displayName: 'Value',
		name: 'data',
		type: 'string',
		required: true,
		displayOptions: {
			show: {
				resource: ['devices'],
				operation: ['update'],
			},
		},
		default: '',
		description: 'New value for the field',
	},

	// Fields for maintenance
	{
		displayName: 'Duration',
		name: 'duration',
		type: 'string',
		required: true,
		displayOptions: {
			show: {
				resource: ['devices'],
				operation: ['setMaintenance'],
			},
		},
		default: '2:00',
		placeholder: '2:00',
		description: 'Duration in format H:i (e.g., 2:00 for 2 hours)',
	},
	{
		displayName: 'Additional Options',
		name: 'maintenanceOptions',
		type: 'collection',
		placeholder: 'Add Option',
		default: {},
		displayOptions: {
			show: {
				resource: ['devices'],
				operation: ['setMaintenance'],
			},
		},
		options: [
			{
				displayName: 'Title',
				name: 'title',
				type: 'string',
				default: '',
				description: 'Title for the maintenance',
			},
			{
				displayName: 'Notes',
				name: 'notes',
				type: 'string',
				default: '',
				description: 'Notes for the maintenance',
			},
			{
				displayName: 'Start Time',
				name: 'start',
				type: 'string',
				default: '',
				placeholder: '2024-01-01 10:00:00',
				description: 'Start time in Y-m-d H:i:s format',
			},
		],
	},

	// Date range options for availability and outages
	{
		displayName: 'Date Range Options',
		name: 'dateRangeOptions',
		type: 'collection',
		placeholder: 'Add Date Range',
		default: {},
		displayOptions: {
			show: {
				resource: ['devices'],
				operation: ['getAvailability', 'getOutages'],
			},
		},
		options: [
			{
				displayName: 'From Date',
				name: 'from',
				type: 'string',
				default: '',
				placeholder: '2024-01-01',
				description: 'Start date (YYYY-MM-DD format)',
				routing: {
					send: {
						type: 'query',
						property: 'from',
					},
				},
			},
			{
				displayName: 'To Date',
				name: 'to',
				type: 'string',
				default: '',
				placeholder: '2024-12-31',
				description: 'End date (YYYY-MM-DD format)',
				routing: {
					send: {
						type: 'query',
						property: 'to',
					},
				},
			},
		],
	},

	// Filter options for getAll
	{
		displayName: 'Filters',
		name: 'filters',
		type: 'collection',
		placeholder: 'Add Filter',
		default: {},
		displayOptions: {
			show: {
				resource: ['devices'],
				operation: ['getAll'],
			},
		},
		options: [
			{
				displayName: 'Type',
				name: 'type',
				type: 'options',
				options: [
					{ name: 'All', value: 'all' },
					{ name: 'Active', value: 'active' },
					{ name: 'Ignored', value: 'ignored' },
					{ name: 'Up', value: 'up' },
					{ name: 'Down', value: 'down' },
					{ name: 'Disabled', value: 'disabled' },
				],
				default: 'all',
				description: 'Filter devices by status',
				routing: {
					send: {
						type: 'query',
						property: 'type',
					},
				},
			},
			{
				displayName: 'Order',
				name: 'order',
				type: 'string',
				default: '',
				placeholder: 'hostname DESC',
				description: 'Order results (e.g., hostname DESC)',
				routing: {
					send: {
						type: 'query',
						property: 'order',
					},
				},
			},
			{
				displayName: 'Query',
				name: 'query',
				type: 'string',
				default: '',
				placeholder: 'search term',
				description: 'Search devices by hostname, IP, or other fields',
				routing: {
					send: {
						type: 'query',
						property: 'query',
					},
				},
			},
			{
				displayName: 'Sort Order',
				name: 'sort',
				type: 'options',
				options: [
					{ name: 'Ascending', value: 'ASC' },
					{ name: 'Descending', value: 'DESC' },
				],
				default: 'ASC',
				description: 'Sort order for results',
				routing: {
					send: {
						type: 'query',
						property: 'sort',
					},
				},
			},
			{
				displayName: 'Limit',
				name: 'limit',
				type: 'number',
				default: 50,
				description: 'Maximum number of devices to return',
				routing: {
					send: {
						type: 'query',
						property: 'limit',
					},
				},
			},
			{
				displayName: 'Offset',
				name: 'offset',
				type: 'number',
				default: 0,
				description: 'Number of devices to skip (for pagination)',
				routing: {
					send: {
						type: 'query',
						property: 'offset',
					},
				},
			},
		],
	},
];
