import { INodeProperties } from 'n8n-workflow';

export const routingOperations: INodeProperties[] = [
	{
		displayName: 'Operation',
		name: 'operation',
		type: 'options',
		noDataExpression: true,
		displayOptions: {
			show: {
				resource: ['routing'],
			},
		},
		options: [
			{
				name: 'List BGP Sessions',
				value: 'listBgp',
				description: 'List BGP sessions',
				action: 'List BGP sessions',
				routing: {
					request: {
						method: 'GET',
						url: '/bgp',
					},
					output: {
						postReceive: [
							{
								type: 'rootProperty',
								properties: {
									property: 'bgp_sessions',
								},
							},
						],
					},
				},
			},
			{
				name: 'Get BGP Session',
				value: 'getBgp',
				description: 'Get a specific BGP session',
				action: 'Get BGP session',
				routing: {
					request: {
						method: 'GET',
						url: '=/bgp/{{$parameter.bgpId}}',
					},
					output: {
						postReceive: [
							{
								type: 'rootProperty',
								properties: {
									property: 'bgp_session',
								},
							},
						],
					},
				},
			},
			{
				name: 'Update BGP Description',
				value: 'updateBgpDescription',
				description: 'Update BGP session description',
				action: 'Update BGP description',
				routing: {
					request: {
						method: 'POST',
						url: '=/bgp/{{$parameter.bgpId}}',
					},
					send: {
						type: 'body',
					},
				},
			},
			{
				name: 'List OSPF Neighbors',
				value: 'listOspf',
				description: 'List OSPF neighbors',
				action: 'List OSPF neighbors',
				routing: {
					request: {
						method: 'GET',
						url: '/ospf',
					},
					output: {
						postReceive: [
							{
								type: 'rootProperty',
								properties: {
									property: 'ospf_neighbours',
								},
							},
						],
					},
				},
			},
			{
				name: 'List VRFs',
				value: 'listVrf',
				description: 'List VRFs',
				action: 'List VRFs',
				routing: {
					request: {
						method: 'GET',
						url: '/routing/vrf',
					},
					output: {
						postReceive: [
							{
								type: 'rootProperty',
								properties: {
									property: 'vrfs',
								},
							},
						],
					},
				},
			},
			{
				name: 'Get VRF',
				value: 'getVrf',
				description: 'Get a specific VRF',
				action: 'Get VRF',
				routing: {
					request: {
						method: 'GET',
						url: '=/routing/vrf/{{$parameter.vrfId}}',
					},
					output: {
						postReceive: [
							{
								type: 'rootProperty',
								properties: {
									property: 'vrf',
								},
							},
						],
					},
				},
			},
			{
				name: 'List IP Addresses',
				value: 'listIpAddresses',
				description: 'List IP addresses',
				action: 'List IP addresses',
				routing: {
					request: {
						method: 'GET',
						url: '=/resources/ip/addresses{{$parameter.addressFamily ? "/" + $parameter.addressFamily : ""}}',
					},
					output: {
						postReceive: [
							{
								type: 'rootProperty',
								properties: {
									property: 'ip_addresses',
								},
							},
						],
					},
				},
			},
			{
				name: 'List IP Networks',
				value: 'listIpNetworks',
				description: 'List IP networks',
				action: 'List IP networks',
				routing: {
					request: {
						method: 'GET',
						url: '=/resources/ip/networks{{$parameter.addressFamily ? "/" + $parameter.addressFamily : ""}}',
					},
					output: {
						postReceive: [
							{
								type: 'rootProperty',
								properties: {
									property: 'ip_networks',
								},
							},
						],
					},
				},
			},
		],
		default: 'listBgp',
	},
];

export const routingFields: INodeProperties[] = [
	// BGP Session ID
	{
		displayName: 'BGP Session ID',
		name: 'bgpId',
		type: 'string',
		required: true,
		displayOptions: {
			show: {
				resource: ['routing'],
				operation: ['getBgp', 'updateBgpDescription'],
			},
		},
		default: '',
		description: 'BGP session ID',
	},

	// VRF ID
	{
		displayName: 'VRF ID',
		name: 'vrfId',
		type: 'string',
		required: true,
		displayOptions: {
			show: {
				resource: ['routing'],
				operation: ['getVrf'],
			},
		},
		default: '',
		description: 'VRF ID',
	},

	// BGP Description update
	{
		displayName: 'BGP Description',
		name: 'bgp_descr',
		type: 'string',
		required: true,
		displayOptions: {
			show: {
				resource: ['routing'],
				operation: ['updateBgpDescription'],
			},
		},
		default: '',
		description: 'New BGP session description',
	},

	// Address family for IP operations
	{
		displayName: 'Address Family',
		name: 'addressFamily',
		type: 'options',
		displayOptions: {
			show: {
				resource: ['routing'],
				operation: ['listIpAddresses', 'listIpNetworks'],
			},
		},
		options: [
			{ name: 'All', value: '' },
			{ name: 'IPv4', value: 'ipv4' },
			{ name: 'IPv6', value: 'ipv6' },
		],
		default: '',
		description: 'IP address family to filter by',
	},

	// Filters for BGP
	{
		displayName: 'BGP Filters',
		name: 'bgpFilters',
		type: 'collection',
		placeholder: 'Add Filter',
		default: {},
		displayOptions: {
			show: {
				resource: ['routing'],
				operation: ['listBgp'],
			},
		},
		options: [
			{
				displayName: 'Hostname',
				name: 'hostname',
				type: 'string',
				default: '',
				description: 'Filter by device hostname or ID',
				routing: {
					send: {
						type: 'query',
						property: 'hostname',
					},
				},
			},
			{
				displayName: 'Local ASN',
				name: 'asn',
				type: 'string',
				default: '',
				description: 'Filter by local ASN',
				routing: {
					send: {
						type: 'query',
						property: 'asn',
					},
				},
			},
			{
				displayName: 'Remote ASN',
				name: 'remote_asn',
				type: 'string',
				default: '',
				description: 'Filter by remote ASN',
				routing: {
					send: {
						type: 'query',
						property: 'remote_asn',
					},
				},
			},
			{
				displayName: 'BGP State',
				name: 'bgp_state',
				type: 'options',
				options: [
					{ name: 'Established', value: 'established' },
					{ name: 'Idle', value: 'idle' },
					{ name: 'Active', value: 'active' },
					{ name: 'Connect', value: 'connect' },
				],
				default: '',
				description: 'Filter by BGP session state',
				routing: {
					send: {
						type: 'query',
						property: 'bgp_state',
					},
				},
			},
		],
	},

	// Filters for OSPF
	{
		displayName: 'OSPF Filters',
		name: 'ospfFilters',
		type: 'collection',
		placeholder: 'Add Filter',
		default: {},
		displayOptions: {
			show: {
				resource: ['routing'],
				operation: ['listOspf'],
			},
		},
		options: [
			{
				displayName: 'Hostname',
				name: 'hostname',
				type: 'string',
				default: '',
				description: 'Filter by device hostname or ID',
				routing: {
					send: {
						type: 'query',
						property: 'hostname',
					},
				},
			},
		],
	},

	// Filters for VRF
	{
		displayName: 'VRF Filters',
		name: 'vrfFilters',
		type: 'collection',
		placeholder: 'Add Filter',
		default: {},
		displayOptions: {
			show: {
				resource: ['routing'],
				operation: ['listVrf'],
			},
		},
		options: [
			{
				displayName: 'Hostname',
				name: 'hostname',
				type: 'string',
				default: '',
				description: 'Filter by device hostname or ID',
				routing: {
					send: {
						type: 'query',
						property: 'hostname',
					},
				},
			},
			{
				displayName: 'VRF Name',
				name: 'vrfname',
				type: 'string',
				default: '',
				description: 'Filter by VRF name',
				routing: {
					send: {
						type: 'query',
						property: 'vrfname',
					},
				},
			},
		],
	},
];
