import type { HarmBlockThreshold, HarmCategory } from '@google/generative-ai';
import type { INodeProperties } from 'n8n-workflow';
import { harmCategories, harmThresholds } from './safety-options';

export const additionalOptions: INodeProperties = {
	displayName: 'Options',
	name: 'options',
	placeholder: 'Add Option',
	description: 'Additional options to add',
	type: 'collection',
	default: {},
	options: [
		{
			displayName: 'Maximum Number of Tokens',
			name: 'maxOutputTokens',
			default: 2048,
			description: 'The maximum number of tokens to generate in the completion',
			type: 'number',
		},
		{
			displayName: 'Sampling Temperature',
			name: 'temperature',
			default: 0.4,
			typeOptions: { maxValue: 1, minValue: 0, numberPrecision: 1 },
			description:
				'Controls randomness: Lowering results in less random completions. As the temperature approaches zero, the model will become deterministic and repetitive.',
			type: 'number',
		},
		{
			displayName: 'Top K',
			name: 'topK',
			default: 32,
			typeOptions: { maxValue: 40, minValue: -1, numberPrecision: 1 },
			description:
				'Used to remove "long tail" low probability responses. Defaults to -1, which disables it.',
			type: 'number',
		},
		{
			displayName: 'Top P',
			name: 'topP',
			default: 1,
			typeOptions: { maxValue: 1, minValue: 0, numberPrecision: 1 },
			description:
				'Controls diversity via nucleus sampling: 0.5 means half of all likelihood-weighted options are considered. We generally recommend altering this or temperature but not both.',
			type: 'number',
		},

		// Safety Settings
		{
			displayName: 'Safety Settings',
			name: 'safetySettings',
			type: 'fixedCollection',
			typeOptions: { multipleValues: true },
			default: {
				values: {
					category: harmCategories[0].name as HarmCategory,
					threshold: harmThresholds[0].name as HarmBlockThreshold,
				},
			},
			placeholder: 'Add Option',
			options: [
				{
					name: 'values',
					displayName: 'Values',
					values: [
						{
							displayName: 'Safety Category',
							name: 'category',
							type: 'options',
							description: 'The category of harmful content to block',
							default: 'HARM_CATEGORY_UNSPECIFIED',
							options: harmCategories,
						},
						{
							displayName: 'Safety Threshold',
							name: 'threshold',
							type: 'options',
							description: 'The threshold of harmful content to block',
							default: 'HARM_BLOCK_THRESHOLD_UNSPECIFIED',
							options: harmThresholds,
						},
					],
				},
			],
		},
	],
};