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

export const backupOperations: INodeProperties = {
	displayName: 'Operation',
	name: 'operation',
	type: 'options',
	noDataExpression: true,
	displayOptions: {
		show: {
			resource: ['backup'],
		},
	},
	options: [
		{
			name: 'Create',
			value: 'create',
			description: 'Create a backup of VM/Container',
			action: 'Create backup',
		},
		{
			name: 'Restore',
			value: 'restore',
			description: 'Restore VM/Container from backup',
			action: 'Restore from backup',
		},
		{
			name: 'Get All',
			value: 'getAll',
			description: 'Get all backups',
			action: 'Get all backups',
		},
		{
			name: 'Delete',
			value: 'delete',
			description: 'Delete a backup file',
			action: 'Delete backup',
		},
		{
			name: 'Get Jobs',
			value: 'getJobs',
			description: 'Get backup jobs configuration',
			action: 'Get backup jobs',
		},
	],
	default: 'getAll',
};

export const backupFields: INodeProperties[] = [
	// Common fields
	{
		displayName: nodeNameOption.displayName,
		name: nodeNameOption.name,
		type: nodeNameOption.type,
		required: nodeNameOption.required,
		default: nodeNameOption.default,
		placeholder: nodeNameOption.placeholder,
		description: nodeNameOption.description,
		displayOptions: {
			show: {
				resource: ['backup'],
				operation: ['create', 'restore', 'getAll', 'delete'],
			},
		},
	},

	// Create backup fields
	{
		displayName: vmIdOption.displayName,
		name: vmIdOption.name,
		type: vmIdOption.type,
		required: vmIdOption.required,
		default: vmIdOption.default,
		typeOptions: vmIdOption.typeOptions,
		description: vmIdOption.description,
		displayOptions: {
			show: {
				resource: ['backup'],
				operation: ['create'],
			},
		},
	},
	{
		displayName: 'Storage',
		name: 'storage',
		type: 'string',
		required: true,
		default: 'local',
		placeholder: 'local',
		description: 'Storage location for the backup',
		displayOptions: {
			show: {
				resource: ['backup'],
				operation: ['create'],
			},
		},
	},

	// Restore fields
	{
		displayName: 'Backup File',
		name: 'archive',
		type: 'string',
		required: true,
		default: '',
		placeholder: 'local:backup/vzdump-qemu-100-2023_01_01-12_00_00.tar.gz',
		description: 'Full path to the backup file including storage prefix',
		displayOptions: {
			show: {
				resource: ['backup'],
				operation: ['restore'],
			},
		},
	},
	{
		displayName: 'New VM/Container ID',
		name: 'newVmId',
		type: 'number',
		required: true,
		default: 100,
		typeOptions: {
			minValue: 100,
			maxValue: 999999999,
		},
		description: 'ID for the restored VM/Container',
		displayOptions: {
			show: {
				resource: ['backup'],
				operation: ['restore'],
			},
		},
	},

	// Delete backup fields
	{
		displayName: 'Backup File',
		name: 'backupFile',
		type: 'string',
		required: true,
		default: '',
		placeholder: 'backup/vzdump-qemu-100-2023_01_01-12_00_00.tar.gz',
		description: 'Path to the backup file to delete',
		displayOptions: {
			show: {
				resource: ['backup'],
				operation: ['delete'],
			},
		},
	},
	{
		displayName: 'Storage',
		name: 'storage',
		type: 'string',
		required: true,
		default: 'local',
		placeholder: 'local',
		description: 'Storage location of the backup file',
		displayOptions: {
			show: {
				resource: ['backup'],
				operation: ['delete'],
			},
		},
	},

	// Wait for task options
	{
		displayName: waitForTaskOption.displayName,
		name: waitForTaskOption.name,
		type: waitForTaskOption.type,
		default: waitForTaskOption.default,
		description: waitForTaskOption.description,
		displayOptions: {
			show: {
				resource: ['backup'],
				operation: ['create', 'restore'],
			},
		},
	},
	{
		displayName: taskTimeoutOption.displayName,
		name: taskTimeoutOption.name,
		type: taskTimeoutOption.type,
		default: taskTimeoutOption.default,
		typeOptions: taskTimeoutOption.typeOptions,
		description: taskTimeoutOption.description,
		displayOptions: {
			show: {
				resource: ['backup'],
				operation: ['create', 'restore'],
				waitForTask: [true],
			},
		},
	},

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

	// Create backup options
	{
		displayName: 'Backup Options',
		name: 'backupOptions',
		type: 'collection',
		placeholder: 'Add Option',
		default: {},
		displayOptions: {
			show: {
				resource: ['backup'],
				operation: ['create'],
			},
		},
		options: [
			{
				displayName: 'Compression',
				name: 'compress',
				type: 'options',
				options: [
					{ name: 'None', value: '0' },
					{ name: 'LZO', value: 'lzo' },
					{ name: 'GZIP', value: 'gzip' },
					{ name: 'ZSTD', value: 'zstd' },
				],
				default: 'zstd',
				description: 'Compression algorithm for the backup',
			},
			{
				displayName: 'Mode',
				name: 'mode',
				type: 'options',
				options: [
					{ name: 'Snapshot', value: 'snapshot' },
					{ name: 'Suspend', value: 'suspend' },
					{ name: 'Stop', value: 'stop' },
				],
				default: 'snapshot',
				description: 'Backup mode',
			},
			{
				displayName: 'Include RAM',
				name: 'includeRam',
				type: 'boolean',
				default: false,
				description: 'Include RAM in backup',
			},
			{
				displayName: 'Mail Notification',
				name: 'mailto',
				type: 'string',
				default: '',
				placeholder: 'admin@example.com',
				description: 'Email address for backup notifications',
			},
			{
				displayName: 'Notes',
				name: 'notes',
				type: 'string',
				default: '',
				description: 'Notes for the backup',
			},
			{
				displayName: 'Remove',
				name: 'remove',
				type: 'boolean',
				default: true,
				description: 'Remove the original backup file after successful restore',
			},
		],
	},

	// Restore options
	{
		displayName: 'Restore Options',
		name: 'restoreOptions',
		type: 'collection',
		placeholder: 'Add Option',
		default: {},
		displayOptions: {
			show: {
				resource: ['backup'],
				operation: ['restore'],
			},
		},
		options: [
			{
				displayName: 'Storage',
				name: 'storage',
				type: 'string',
				default: 'local-lvm',
				description: 'Storage location for restored VM/Container',
			},
			{
				displayName: 'Force',
				name: 'force',
				type: 'boolean',
				default: false,
				description: 'Force restore even if VM/Container already exists',
			},
			{
				displayName: 'Start After Restore',
				name: 'start',
				type: 'boolean',
				default: false,
				description: 'Start VM/Container after restore',
			},
			{
				displayName: 'Unique',
				name: 'unique',
				type: 'boolean',
				default: false,
				description: 'Generate unique properties (MAC addresses, UUIDs)',
			},
			{
				displayName: 'Bandwidth Limit (MB/s)',
				name: 'bwlimit',
				type: 'number',
				default: 0,
				typeOptions: {
					minValue: 0,
				},
				description: 'Bandwidth limit for restore operation (0 = unlimited)',
			},
		],
	},

	// Get backups filter options
	{
		displayName: 'Filter Options',
		name: 'filterOptions',
		type: 'collection',
		placeholder: 'Add Filter',
		default: {},
		displayOptions: {
			show: {
				resource: ['backup'],
				operation: ['getAll'],
			},
		},
		options: [
			{
				displayName: 'VM/Container ID',
				name: 'vmid',
				type: 'number',
				default: '',
				description: 'Filter backups by VM/Container ID',
			},
			{
				displayName: 'Content Type',
				name: 'content',
				type: 'options',
				options: [
					{ name: 'All', value: '' },
					{ name: 'Backups Only', value: 'backup' },
				],
				default: 'backup',
				description: 'Filter by content type',
			},
		],
	},
];
