import { INodeType, INodeTypeDescription } from 'n8n-workflow';

// Import resource modules
import { systemOperations, systemFields } from './resources/system';
import { devicesOperations, devicesFields } from './resources/devices';
import { alertsOperations, alertsFields } from './resources/alerts';
import { alertRulesOperations, alertRulesFields } from './resources/alertRules';
import { portsOperations, portsFields } from './resources/ports';
import { servicesOperations, servicesFields } from './resources/services';
import { routingOperations, routingFields } from './resources/routing';
import { billsOperations, billsFields } from './resources/bills';
import { switchingOperations, switchingFields } from './resources/switching';
import { logsOperations, logsFields } from './resources/logs';
import { arpOperations, arpFields } from './resources/arp';
import { deviceGroupsOperations, deviceGroupsFields } from './resources/deviceGroups';
import { inventoryOperations, inventoryFields } from './resources/inventory';
import { locationsOperations, locationsFields } from './resources/locations';
import { pollerGroupsOperations, pollerGroupsFields } from './resources/pollerGroups';
import { portGroupsOperations, portGroupsFields } from './resources/portGroups';

export class LibreNms implements INodeType {
	description: INodeTypeDescription = {
		displayName: 'LibreNMS',
		name: 'libreNms',
		icon: 'file:librenms.svg',
		group: ['transform'],
		version: 1,
		subtitle: '={{$parameter["operation"] + ": " + $parameter["resource"]}}',
		description: 'Interact with LibreNMS network monitoring system',
		defaults: {
			name: 'LibreNMS',
			color: '#33aa55',
		},
		inputs: ['main'],
		outputs: ['main'],
		usableAsTool: true,
		credentials: [
			{
				name: 'libreNmsApi',
				required: true,
			},
		],
		requestDefaults: {
			baseURL: '={{$credentials.url.replace(/\\/$/, "")}}/api/v0',
			headers: {
				Accept: 'application/json',
				'Content-Type': 'application/json',
			},
			skipSslCertificateValidation: '={{$credentials.allowUnauthorizedCerts}}',
		},
		properties: [
			{
				displayName: 'Resource',
				name: 'resource',
				type: 'options',
				noDataExpression: true,
				options: [
					{
						name: 'Alerts',
						value: 'alerts',
						description: 'Manage alerts',
					},
					{
						name: 'Alert Rules',
						value: 'alertRules',
						description: 'Manage alert rules',
					},
					{
						name: 'ARP',
						value: 'arp',
						description: 'ARP table entries',
					},
					{
						name: 'Bills',
						value: 'bills',
						description: 'Billing information',
					},
					{
						name: 'Devices',
						value: 'devices',
						description: 'Manage network devices',
					},
					{
						name: 'Device Groups',
						value: 'deviceGroups',
						description: 'Device group management',
					},
					{
						name: 'Inventory',
						value: 'inventory',
						description: 'Device inventory information',
					},
					{
						name: 'Locations',
						value: 'locations',
						description: 'Location management',
					},
					{
						name: 'Logs',
						value: 'logs',
						description: 'System logs',
					},
					{
						name: 'Poller Groups',
						value: 'pollerGroups',
						description: 'Poller group information',
					},
					{
						name: 'Ports',
						value: 'ports',
						description: 'Manage device ports',
					},
					{
						name: 'Port Groups',
						value: 'portGroups',
						description: 'Port group management',
					},
					{
						name: 'Routing',
						value: 'routing',
						description: 'BGP, OSPF, and routing information',
					},
					{
						name: 'Services',
						value: 'services',
						description: 'Monitor services',
					},
					{
						name: 'Switching',
						value: 'switching',
						description: 'VLANs, links, and switching data',
					},
					{
						name: 'System',
						value: 'system',
						description: 'LibreNMS system information',
					},
				],
				default: 'system',
			},

			// System operations
			...systemOperations,
			...systemFields,

			// Devices operations
			...devicesOperations,
			...devicesFields,

			// Alerts operations
			...alertsOperations,
			...alertsFields,

			// Alert Rules operations
			...alertRulesOperations,
			...alertRulesFields,

			// Ports operations
			...portsOperations,
			...portsFields,

			// Services operations
			...servicesOperations,
			...servicesFields,

			// Routing operations
			...routingOperations,
			...routingFields,

			// Bills operations
			...billsOperations,
			...billsFields,

			// Switching operations
			...switchingOperations,
			...switchingFields,

			// Logs operations
			...logsOperations,
			...logsFields,

			// ARP operations
			...arpOperations,
			...arpFields,

			// Device Groups operations
			...deviceGroupsOperations,
			...deviceGroupsFields,

			// Inventory operations
			...inventoryOperations,
			...inventoryFields,

			// Locations operations
			...locationsOperations,
			...locationsFields,

			// Poller Groups operations
			...pollerGroupsOperations,
			...pollerGroupsFields,

			// Port Groups operations
			...portGroupsOperations,
			...portGroupsFields,
		],
	};
}
