import { UpdateProjectPoolSettingsDto } from '@n8n/api-types';
import type { Request, Response } from 'express';
import { mock } from 'vitest-mock-extended';

import { ProjectPoolSettingsController } from '@/controllers/project-pool-settings.controller.ee';
import type { PoolConfigService } from '@/scaling/pool-config.service.ee';

describe('ProjectPoolSettingsController', () => {
	const poolConfigService = mock<PoolConfigService>();
	const controller = new ProjectPoolSettingsController(poolConfigService);

	const req = mock<Request>();
	const res = mock<Response>();
	const projectId = 'project-1';

	beforeEach(() => {
		vi.clearAllMocks();
	});

	describe('getPoolSettings', () => {
		it('delegates to PoolConfigService.getProjectPoolSettings', async () => {
			poolConfigService.getProjectPoolSettings.mockResolvedValue({
				defaultPool: 'gpu',
				availablePools: ['gpu', 'cpu'],
			});

			const result = await controller.getPoolSettings(req, res, projectId);

			expect(poolConfigService.getProjectPoolSettings).toHaveBeenCalledWith(projectId);
			expect(result).toEqual({ defaultPool: 'gpu', availablePools: ['gpu', 'cpu'] });
		});
	});

	describe('updatePoolSettings', () => {
		it('delegates to PoolConfigService.setProjectPoolSettings with the DTO', async () => {
			const dto = new UpdateProjectPoolSettingsDto({ defaultPool: 'gpu' });
			poolConfigService.setProjectPoolSettings.mockResolvedValue({
				defaultPool: 'gpu',
				availablePools: ['gpu'],
			});

			const result = await controller.updatePoolSettings(req, res, dto, projectId);

			expect(poolConfigService.setProjectPoolSettings).toHaveBeenCalledWith(projectId, dto);
			expect(result).toEqual({ defaultPool: 'gpu', availablePools: ['gpu'] });
		});
	});
});
