import { nanoid } from 'nanoid';

import { test, expect } from '../../../fixtures/base';

const TEST_API_KEY = 'test-api-key';

test.describe(
	'Credential Sharing',
	{
		annotation: [{ type: 'owner', description: 'Identity & Access' }],
	},
	() => {
		test('should share credential with another user via UI', async ({ n8n, api }) => {
			const member = await api.publicApi.createUser({
				email: `member-${nanoid()}@test.com`,
				firstName: 'Test',
				lastName: 'Member',
			});

			await n8n.navigate.toCredentials();
			await n8n.credentials.addResource.credential();
			await n8n.credentials.selectCredentialType('Notion API');
			await n8n.credentials.credentialModal.fillField('apiKey', TEST_API_KEY);
			const credentialName = `Test Credential ${nanoid()}`;
			await n8n.credentials.credentialModal.renameCredential(credentialName);
			await n8n.credentials.credentialModal.save();

			await n8n.credentials.credentialModal.changeTab('Sharing');
			await n8n.credentials.credentialModal.addUserToSharing(member.email);
			await n8n.credentials.credentialModal.saveSharing();
			await n8n.credentials.credentialModal.close();

			const memberN8n = await n8n.start.withUser(member);
			await memberN8n.navigate.toCredentials();
			await expect(memberN8n.credentials.cards.getCredential(credentialName)).toBeVisible();
		});

		test('should share credential with another user via API', async ({ api }) => {
			await api.enableProjectFeatures();

			const member = await api.publicApi.createUser({
				email: `member-${nanoid()}@test.com`,
				firstName: 'Test',
				lastName: 'Member',
			});

			const credential = await api.credentials.createCredential({
				name: `Test Credential ${nanoid()}`,
				type: 'notionApi',
				data: { apiKey: TEST_API_KEY },
			});

			const memberApi = await api.createApiForUser(member);
			const memberProject = await memberApi.projects.getMyPersonalProject();
			await api.credentials.shareCredential(credential.id, [memberProject.id]);

			const memberCredentials = await memberApi.credentials.getCredentials();
			const sharedCredential = memberCredentials.find((c) => c.id === credential.id);
			expect(sharedCredential).toBeTruthy();
			expect(sharedCredential?.name).toBe(credential.name);
		});

		test('should show shared credential with proper permissions in node credential dropdown', async ({
			n8n,
			api,
		}) => {
			const member = await api.publicApi.createUser({
				email: `member-${nanoid()}@test.com`,
				firstName: 'Test',
				lastName: 'Member',
			});

			const credential = await api.credentials.createCredential({
				name: `Test Credential ${nanoid()}`,
				type: 'notionApi',
				data: { apiKey: TEST_API_KEY },
			});

			const memberApi = await api.createApiForUser(member);
			const memberProject = await memberApi.projects.getMyPersonalProject();
			await api.credentials.shareCredential(credential.id, [memberProject.id]);

			const memberN8n = await n8n.start.withUser(member);
			await memberN8n.navigate.toWorkflow('new');
			await memberN8n.canvas.addNode('Notion');
			await memberN8n.canvas.getFirstAction().click();

			await expect(memberN8n.ndv.getCredentialSelect()).toHaveValue(credential.name);
		});
	},
);
