import { INodeProperties } from 'n8n-workflow';

export const alertRulesOperations: INodeProperties[] = [
	{
		displayName: 'Operation',
		name: 'operation',
		type: 'options',
		noDataExpression: true,
		displayOptions: {
			show: {
				resource: ['alertRules'],
			},
		},
		options: [
			{
				name: 'Get All',
				value: 'getAll',
				description: 'Get all alert rules',
				action: 'Get all alert rules',
				routing: {
					request: {
						method: 'GET',
						url: '/rules',
					},
					output: {
						postReceive: [
							{
								type: 'rootProperty',
								properties: {
									property: 'rules',
								},
							},
						],
					},
				},
			},
			{
				name: 'Get',
				value: 'get',
				description: 'Get an alert rule by ID',
				action: 'Get an alert rule',
				routing: {
					request: {
						method: 'GET',
						url: '=/rules/{{$parameter.ruleId}}',
					},
					output: {
						postReceive: [
							{
								type: 'rootProperty',
								properties: {
									property: 'rules',
								},
							},
						],
					},
				},
			},
			{
				name: 'Create',
				value: 'create',
				description: 'Create a new alert rule',
				action: 'Create an alert rule',
				routing: {
					request: {
						method: 'POST',
						url: '/rules',
					},
					send: {
						type: 'body',
					},
				},
			},
			{
				name: 'Update',
				value: 'update',
				description: 'Update an alert rule',
				action: 'Update an alert rule',
				routing: {
					request: {
						method: 'PUT',
						url: '/rules',
					},
					send: {
						type: 'body',
					},
				},
			},
			{
				name: 'Delete',
				value: 'delete',
				description: 'Delete an alert rule',
				action: 'Delete an alert rule',
				routing: {
					request: {
						method: 'DELETE',
						url: '=/rules/{{$parameter.ruleId}}',
					},
				},
			},
		],
		default: 'getAll',
	},
];

export const alertRulesFields: INodeProperties[] = [
	// Rule ID for specific operations
	{
		displayName: 'Rule ID',
		name: 'ruleId',
		type: 'string',
		required: true,
		displayOptions: {
			show: {
				resource: ['alertRules'],
				operation: ['get', 'delete'],
			},
		},
		default: '',
		description: 'The alert rule ID',
	},

	// Fields for creating/updating rules
	{
		displayName: 'Rule Name',
		name: 'name',
		type: 'string',
		required: true,
		displayOptions: {
			show: {
				resource: ['alertRules'],
				operation: ['create', 'update'],
			},
		},
		default: '',
		description: 'Name of the alert rule',
	},
	{
		displayName: 'Devices',
		name: 'devices',
		type: 'string',
		required: true,
		displayOptions: {
			show: {
				resource: ['alertRules'],
				operation: ['create', 'update'],
			},
		},
		default: '-1',
		placeholder: '-1 for global, or comma-separated device IDs',
		description: 'Device IDs or -1 for global rule',
	},
	{
		displayName: 'Rule Builder',
		name: 'builder',
		type: 'json',
		required: true,
		displayOptions: {
			show: {
				resource: ['alertRules'],
				operation: ['create', 'update'],
			},
		},
		default:
			'{"condition":"AND","rules":[{"id":"devices.status","field":"devices.status","type":"integer","input":"select","operator":"equal","value":"0"}],"valid":true}',
		description: 'Rule builder JSON object',
	},
	{
		displayName: 'Severity',
		name: 'severity',
		type: 'options',
		required: true,
		displayOptions: {
			show: {
				resource: ['alertRules'],
				operation: ['create', 'update'],
			},
		},
		options: [
			{ name: 'OK', value: 'ok' },
			{ name: 'Warning', value: 'warning' },
			{ name: 'Critical', value: 'critical' },
		],
		default: 'critical',
		description: 'Severity level of the alert',
	},

	// Rule ID for update operation
	{
		displayName: 'Rule ID',
		name: 'rule_id',
		type: 'string',
		required: true,
		displayOptions: {
			show: {
				resource: ['alertRules'],
				operation: ['update'],
			},
		},
		default: '',
		description: 'ID of the rule to update',
	},

	// Additional options for rules
	{
		displayName: 'Additional Options',
		name: 'additionalOptions',
		type: 'collection',
		placeholder: 'Add Option',
		default: {},
		displayOptions: {
			show: {
				resource: ['alertRules'],
				operation: ['create', 'update'],
			},
		},
		options: [
			{
				displayName: 'Disabled',
				name: 'disabled',
				type: 'boolean',
				default: false,
				description: 'Whether the rule is disabled',
			},
			{
				displayName: 'Count',
				name: 'count',
				type: 'number',
				default: 1,
				description: 'How many polling runs before alert triggers',
			},
			{
				displayName: 'Delay',
				name: 'delay',
				type: 'string',
				default: '5 m',
				placeholder: '5 m',
				description: 'Delay before alerting (e.g., 5 m, 1 h, 1 d)',
			},
			{
				displayName: 'Interval',
				name: 'interval',
				type: 'string',
				default: '5 m',
				placeholder: '5 m',
				description: 'How often to re-issue notifications',
			},
			{
				displayName: 'Mute',
				name: 'mute',
				type: 'boolean',
				default: false,
				description: 'If enabled, alert will show in UI but not send notifications',
			},
			{
				displayName: 'Invert',
				name: 'invert',
				type: 'boolean',
				default: false,
				description: 'Invert the rule check',
			},
			{
				displayName: 'Notes',
				name: 'notes',
				type: 'string',
				default: '',
				description: 'Notes for this rule',
			},
		],
	},
];
