import { NodeConnectionTypes } from 'n8n-workflow';
import type { INodeUi, IWorkflowDataCreate } from './Interface';

export const SAMPLE_SUBWORKFLOW_TRIGGER_ID = 'c055762a-8fe7-4141-a639-df2372f30060';
export const SAMPLE_SUBWORKFLOW_WORKFLOW: IWorkflowDataCreate = {
	name: 'My Sub-Workflow',
	nodes: [
		{
			id: SAMPLE_SUBWORKFLOW_TRIGGER_ID,
			typeVersion: 1.1,
			name: 'When Executed by Another Workflow',
			type: 'n8n-nodes-base.executeWorkflowTrigger',
			position: [260, 340],
			parameters: {},
		},
		{
			id: 'b5942df6-0160-4ef7-965d-57583acdc8aa',
			name: 'Replace me with your logic',
			type: 'n8n-nodes-base.noOp',
			position: [520, 340],
			parameters: {},
		},
	] as INodeUi[],
	connections: {
		'When Executed by Another Workflow': {
			main: [
				[
					{
						node: 'Replace me with your logic',
						type: NodeConnectionTypes.Main,
						index: 0,
					},
				],
			],
		},
	},
	settings: {
		executionOrder: 'v1',
	},
	pinData: {},
};

export const SAMPLE_EVALUATION_WORKFLOW: IWorkflowDataCreate = {
	name: 'My Evaluation Sub-Workflow',
	nodes: [
		{
			parameters: {
				inputSource: 'passthrough',
			},
			id: 'c20c82d6-5f71-4fb6-a398-a10a6e6944c5',
			name: 'When called by a test run',
			type: 'n8n-nodes-base.executeWorkflowTrigger',
			typeVersion: 1.1,
			position: [80, 440],
		},
		{
			parameters: {},
			id: '4e14d09a-2699-4659-9a20-e4f4965f473e',
			name: 'Replace me',
			type: 'n8n-nodes-base.noOp',
			typeVersion: 1,
			position: [340, 440],
		},
		{
			parameters: {
				metrics: {
					assignments: [
						{
							name: 'latency',
							value:
								'={{(() => {\n  const newExecutionRuns = Object.values($json.newExecution)\n    .reduce((acc, node) => {\n      acc.push(node.runs.filter(run => run.output.main !== undefined))\n      return acc\n    }, []).flat()\n\n  const latency = newExecutionRuns.reduce((acc, run) => acc + run.executionTime, 0)\n\n  return latency\n})()}}',
							type: 'number',
							id: '1ebc15e9-f079-4d1f-a08d-d4880ea0ddb5',
						},
					],
				},
			},
			type: 'n8n-nodes-base.evaluationMetrics',
			id: '33e2e94a-ec48-4e7b-b750-f56718d5105c',
			name: 'Return metric(s)',
			typeVersion: 1,
			position: [600, 440],
		},
		{
			parameters: {
				content:
					"### 1. Receive execution data\n\nThis workflow will be passed:\n- The benchmark execution (`$json.originalExecution`)\n- The evaluation execution (`$json.newExecution`) produced by re-running the workflow using trigger data from benchmark execution\n\n\nWe've pinned some example data to get you started",
				height: 458,
				width: 257,
				color: 7,
			},
			id: '55e5e311-e285-4000-bd1e-900bc3a07da3',
			name: 'Sticky Note',
			type: 'n8n-nodes-base.stickyNote',
			typeVersion: 1,
			position: [0, 140],
		},
		{
			parameters: {
				content:
					'### 2. Evaluation logic\n\nReplace with logic to perform the tests you want to perform.\n\nE.g. compare against benchmark data, use LLMs to evaluate sentiment, compare token usage, and more.',
				height: 459,
				width: 237,
				color: 7,
			},
			id: 'ea74e341-ff9c-456a-83f0-c10758f0844a',
			name: 'Sticky Note1',
			type: 'n8n-nodes-base.stickyNote',
			typeVersion: 1,
			position: [280, 140],
		},
		{
			parameters: {
				content:
					'### 3. Return metrics\n\nDefine evaluation metrics you want to show on your report.\n\n__Note:__ Metrics need to be numeric',
				height: 459,
				width: 217,
				color: 7,
			},
			id: '9b3c3408-19e1-43d5-b2bb-29d61bd129b8',
			name: 'Sticky Note2',
			type: 'n8n-nodes-base.stickyNote',
			typeVersion: 1,
			position: [540, 140],
		},
		{
			parameters: {
				content:
					'## Evaluation workflow\nThis workflow is used to define evaluation logic and calculate metrics. You can compare against benchmark executions, use LLMs to evaluate, or write any other logic you choose.',
				height: 105,
				width: 754,
			},
			id: '0fc1356e-6238-4557-a920-e50806c1ec13',
			name: 'Sticky Note3',
			type: 'n8n-nodes-base.stickyNote',
			typeVersion: 1,
			position: [0, 0],
		},
	],
	connections: {
		'When called by a test run': {
			main: [
				[
					{
						node: 'Replace me',
						type: NodeConnectionTypes.Main,
						index: 0,
					},
				],
			],
		},
		'Replace me': {
			main: [
				[
					{
						node: 'Return metric(s)',
						type: NodeConnectionTypes.Main,
						index: 0,
					},
				],
			],
		},
	},
	pinData: {
		'When called by a test run': [
			{
				json: {
					newExecution: {},
					originalExecution: {},
				},
			},
		],
	},
	settings: {
		executionOrder: 'v1',
	},
};
