// methods/configuration/devices/group.methods.ts
import { IExecuteFunctions, INodeExecutionData } from 'n8n-workflow';
import { apiRequest } from '../../../helpers/apiRequest';
import { formatResponse } from '../../../helpers/responseFormatter';
import {
	DeviceGroupInfo,
	MoveDeviceToGroupRequest,
} from './devices.types';

/**
 * Get the group associated with a specific device
 */
export async function getDeviceGroup(this: IExecuteFunctions): Promise<INodeExecutionData[]> {
	try {
		const deviceSerial = this.getNodeParameter('deviceSerial', 0) as string;

		if (!deviceSerial) {
			throw new Error('Device serial is required');
		}

		console.log(`Getting group for device with serial: ${deviceSerial}`);
		const endpoint = `/configuration/v1/devices/${deviceSerial}/group`;

		const response = await apiRequest.call(this, 'GET', endpoint);
		console.log('API Response for getDeviceGroup:', response);

		return formatResponse(response);
	} catch (error) {
		console.log('ERROR in getDeviceGroup:', error);
		throw error;
	}
}

/**
 * Move devices to a specific group
 */
export async function moveDevicesToGroup(this: IExecuteFunctions): Promise<INodeExecutionData[]> {
	try {
		const group = this.getNodeParameter('group', 0) as string;
		const serials = this.getNodeParameter('serials', 0) as string[];
		const preserveConfigOverrides = this.getNodeParameter(
			'preserve_config_overrides',
			0,
			[],
		) as string[];

		if (!group || !serials || serials.length === 0) {
			throw new Error('Group name and at least one device serial are required');
		}

		console.log(`Moving ${serials.length} devices to group: ${group}`);
		console.log(`Device serials: ${serials.join(', ')}`);

		const body: MoveDeviceToGroupRequest = {
			group,
			serials,
		};

		if (preserveConfigOverrides.length > 0) {
			body.preserve_config_overrides = preserveConfigOverrides;
			console.log(`Preserving config overrides for: ${preserveConfigOverrides.join(', ')}`);
		}

		const endpoint = '/configuration/v1/devices/move';

		const response = await apiRequest.call(this, 'POST', endpoint, body);
		console.log('API Response for moveDevicesToGroup:', response);

		// Handle string response
		if (typeof response === 'string') {
			console.log('Received string response, converting to object');
			const formattedResponse = {
				success: response.toLowerCase().includes('success'),
				message: response,
				serials: serials,
			};

			return formatResponse(formattedResponse);
		}

		return formatResponse(response);
	} catch (error) {
		console.log('ERROR in moveDevicesToGroup:', error);
		throw error;
	}
}
