import { INodeProperties } from 'n8n-workflow';
import { nodeNameOption, returnAllOption, limitOption } from './baseProperties';

export const storageOperations: INodeProperties = {
	displayName: 'Operation',
	name: 'operation',
	type: 'options',
	noDataExpression: true,
	displayOptions: {
		show: {
			resource: ['storage'],
		},
	},
	options: [
		{
			name: 'Get All',
			value: 'getAll',
			description: 'Get all storage configurations',
			action: 'Get all storage',
		},
		{
			name: 'Get',
			value: 'get',
			description: 'Get specific storage configuration',
			action: 'Get storage',
		},
		{
			name: 'Get Content',
			value: 'getContent',
			description: 'Get storage content (images, ISOs, backups, etc.)',
			action: 'Get storage content',
		},
		{
			name: 'Get Status',
			value: 'getStatus',
			description: 'Get storage status and usage',
			action: 'Get storage status',
		},
		{
			name: 'Upload',
			value: 'upload',
			description: 'Upload file to storage',
			action: 'Upload to storage',
		},
		{
			name: 'Delete File',
			value: 'deleteFile',
			description: 'Delete file from storage',
			action: 'Delete file from storage',
		},
	],
	default: 'getAll',
};

export const storageFields: INodeProperties[] = [
	// Storage ID field for specific operations
	{
		displayName: 'Storage ID',
		name: 'storageId',
		type: 'string',
		required: true,
		default: '',
		placeholder: 'local-lvm',
		description: 'ID of the storage',
		displayOptions: {
			show: {
				resource: ['storage'],
				operation: ['get', 'getContent', 'getStatus', 'upload', 'deleteFile'],
			},
		},
	},

	// Node name for node-specific storage operations
	{
		displayName: nodeNameOption.displayName,
		name: nodeNameOption.name,
		type: nodeNameOption.type,
		required: nodeNameOption.required,
		default: nodeNameOption.default,
		placeholder: nodeNameOption.placeholder,
		description: nodeNameOption.description,
		displayOptions: {
			show: {
				resource: ['storage'],
				operation: ['getContent', 'getStatus', 'upload', 'deleteFile'],
			},
		},
	},

	// Content type filter
	{
		displayName: 'Content Type',
		name: 'contentType',
		type: 'options',
		options: [
			{ name: 'All', value: '' },
			{ name: 'Disk Images', value: 'images' },
			{ name: 'ISO Images', value: 'iso' },
			{ name: 'Container Templates', value: 'vztmpl' },
			{ name: 'Backups', value: 'backup' },
			{ name: 'Snippets', value: 'snippets' },
		],
		default: '',
		description: 'Filter content by type',
		displayOptions: {
			show: {
				resource: ['storage'],
				operation: ['getContent'],
			},
		},
	},

	// File operations
	{
		displayName: 'File Path',
		name: 'filePath',
		type: 'string',
		required: true,
		default: '',
		placeholder: 'backup/vm-100-backup.tar.gz',
		description: 'Path to the file in storage',
		displayOptions: {
			show: {
				resource: ['storage'],
				operation: ['deleteFile'],
			},
		},
	},

	// Upload specific fields
	{
		displayName: 'File Content',
		name: 'fileContent',
		type: 'string',
		required: true,
		default: '',
		description: 'Base64 encoded file content to upload',
		displayOptions: {
			show: {
				resource: ['storage'],
				operation: ['upload'],
			},
		},
	},
	{
		displayName: 'File Name',
		name: 'fileName',
		type: 'string',
		required: true,
		default: '',
		placeholder: 'upload.iso',
		description: 'Name of the file to upload',
		displayOptions: {
			show: {
				resource: ['storage'],
				operation: ['upload'],
			},
		},
	},

	// Return all and limit options
	{
		displayName: returnAllOption.displayName,
		name: returnAllOption.name,
		type: returnAllOption.type,
		default: returnAllOption.default,
		description: returnAllOption.description,
		displayOptions: {
			show: {
				resource: ['storage'],
				operation: ['getAll', 'getContent'],
			},
		},
	},
	{
		displayName: limitOption.displayName,
		name: limitOption.name,
		type: limitOption.type,
		typeOptions: limitOption.typeOptions,
		default: limitOption.default,
		description: limitOption.description,
		displayOptions: {
			show: {
				resource: ['storage'],
				operation: ['getAll', 'getContent'],
				returnAll: [false],
			},
		},
	},

	// Additional fields for various operations
	{
		displayName: 'Additional Fields',
		name: 'additionalFields',
		type: 'collection',
		placeholder: 'Add Field',
		default: {},
		displayOptions: {
			show: {
				resource: ['storage'],
				operation: ['getContent', 'getAll'],
			},
		},
		options: [
			{
				displayName: 'VM ID',
				name: 'vmid',
				type: 'number',
				default: '',
				description: 'Filter content by VM/Container ID',
			},
			{
				displayName: 'Format',
				name: 'format',
				type: 'options',
				options: [
					{ name: 'All', value: '' },
					{ name: 'Raw', value: 'raw' },
					{ name: 'QCOW2', value: 'qcow2' },
					{ name: 'VMDK', value: 'vmdk' },
				],
				default: '',
				description: 'Filter by disk format',
			},
			{
				displayName: 'Only Enabled',
				name: 'enabled',
				type: 'boolean',
				default: true,
				description: 'Show only enabled storage (for getAll operation)',
			},
		],
	},

	// Upload options
	{
		displayName: 'Upload Options',
		name: 'uploadOptions',
		type: 'collection',
		placeholder: 'Add Option',
		default: {},
		displayOptions: {
			show: {
				resource: ['storage'],
				operation: ['upload'],
			},
		},
		options: [
			{
				displayName: 'Content Type',
				name: 'content',
				type: 'options',
				options: [
					{ name: 'ISO Image', value: 'iso' },
					{ name: 'Container Template', value: 'vztmpl' },
					{ name: 'Snippet', value: 'snippets' },
				],
				default: 'iso',
				description: 'Type of content being uploaded',
			},
			{
				displayName: 'Check Hash',
				name: 'checksum',
				type: 'string',
				default: '',
				placeholder: 'sha256:abc123...',
				description: 'Expected checksum of the file (algorithm:hash)',
			},
			{
				displayName: 'Check Hash Algorithm',
				name: 'checksum_algorithm',
				type: 'options',
				options: [
					{ name: 'SHA256', value: 'sha256' },
					{ name: 'SHA1', value: 'sha1' },
					{ name: 'MD5', value: 'md5' },
				],
				default: 'sha256',
				description: 'Algorithm used for checksum verification',
				displayOptions: {
					show: {
						checksum: [{ _cnd: { ne: '' } }],
					},
				},
			},
		],
	},
];
