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

import * as agent from './actions/agent/Agent.resource';
import * as extraction from './actions/extraction/Extraction.resource';
import * as file from './actions/file/File.resource';
import * as interaction from './actions/interaction/Interaction.resource';
import { router } from './actions/router';
import * as session from './actions/session/Session.resource';
import * as window from './actions/window/Window.resource';
import { agentsResourceMapping, listSearchAgents } from './methods';

export class Airtop implements INodeType {
	description: INodeTypeDescription = {
		displayName: 'Airtop',
		name: 'airtop',
		icon: 'file:airtop.svg',
		group: ['transform'],
		defaultVersion: 1,
		version: [1, 1.1],
		subtitle: '={{ $parameter["operation"] + ": " + $parameter["resource"] }}',
		description: 'Scrape and control any site with Airtop',
		usableAsTool: true,
		defaults: {
			name: 'Airtop',
		},
		inputs: [NodeConnectionTypes.Main],
		outputs: [NodeConnectionTypes.Main],
		credentials: [
			{
				name: 'airtopApi',
				required: true,
			},
		],
		properties: [
			{
				displayName: 'Resource',
				name: 'resource',
				type: 'options',
				noDataExpression: true,
				options: [
					{
						name: 'Agent',
						value: 'agent',
					},
					{
						name: 'Extraction',
						value: 'extraction',
					},
					{
						name: 'File',
						value: 'file',
					},
					{
						name: 'Interaction',
						value: 'interaction',
					},
					{
						name: 'Session',
						value: 'session',
					},
					{
						name: 'Window',
						value: 'window',
					},
				],
				default: 'session',
			},
			...agent.description,
			...session.description,
			...window.description,
			...file.description,
			...extraction.description,
			...interaction.description,
		],
	};

	methods = {
		listSearch: {
			listSearchAgents,
		},
		resourceMapping: {
			agentsResourceMapping,
		},
	};

	async execute(this: IExecuteFunctions) {
		return await router.call(this);
	}
}
