// #region GitE2E [C:3] [TYPE Test] [SEMANTICS e2e, git, integration, config]
// @BRIEF E2E tests for Git integration — config CRUD, connection test.
// @RELATION BINDS_TO -> [GitSettingsPage]
// @UX_STATE ConfigCreated -> Git server appears in configured list.
// @UX_STATE ConnectionTested -> Success/failure toast feedback.

import { test, expect } from '../fixtures/auth.fixture.js';
import { apiGet, apiPost, apiDelete } from '../helpers/api.helper.js';

const FRONTEND_URL = process.env.FRONTEND_URL || 'http://127.0.0.1:8102';
const GITEA_URL = process.env.GITEA_URL || 'https://git.bebesh.ru';
const GITEA_TOKEN = process.env.GITEA_TOKEN || 'd5e3a0bea62121dcafbf33070e85d65e8a383c20';

test.describe('Git Integration', () => {
	test('should have git config visible in settings UI', async ({ authPage }) => {
		await authPage.goto(`${FRONTEND_URL}/settings#/settings/git`);
		await authPage.waitForSelector('text=Интеграция Git', { timeout: 10_000 });

		// Configured servers section visible
		await expect(authPage.getByText(/Настроенные серверы/)).toBeVisible();
		// Add git server form visible
		await expect(authPage.getByText(/Добавить Git-сервер|Add Git server/)).toBeVisible();
	});

	test('should create git config via API and verify in UI', async ({ authPage }) => {
		const configName = `E2E-Gitea-${Date.now()}`;

		// Create via API
		const config = await apiPost('/api/git/config', {
			name: configName,
			provider: 'GITEA',
			url: GITEA_URL,
			pat: GITEA_TOKEN,
			default_repository: 'busya/ss-tools',
			default_branch: 'main',
		});
		expect(config).toBeDefined();
		expect(config.id).toBeTruthy();
		expect(config.provider).toBe('GITEA');

		// Verify in UI
		await authPage.goto(`${FRONTEND_URL}/settings#/settings/git`);
		await authPage.waitForSelector('text=Интеграция Git', { timeout: 10_000 });
		await expect(authPage.getByText(configName).first()).toBeVisible({ timeout: 10_000 });

		// Cleanup
		await apiDelete(`/api/git/config/${config.id}`);
	});

	test('should test git connection successfully', async ({ authPage }) => {
		// Get existing configs
		const configs = await apiGet('/api/git/config');
		if (configs.length === 0) {
			console.log('[E2E] No git configs to test, skipping');
			return;
		}

		const config = configs[0];
		const result = await apiPost('/api/git/config/test', {
			name: config.name,
			provider: config.provider,
			url: config.url,
			pat: GITEA_TOKEN,
			config_id: config.id,
		});
		expect(result.status).toBe('success');
	});

	test('should list Gitea repositories', async ({ authPage }) => {
		const configs = await apiGet('/api/git/config');
		if (configs.length === 0) {
			console.log('[E2E] No git configs to list repos, skipping');
			return;
		}

		const config = configs[0];
		if (config.provider !== 'GITEA') {
			console.log('[E2E] Provider is not GITEA, skipping');
			return;
		}

		const repos = await apiGet(`/api/git/config/${config.id}/gitea/repos`);
		expect(Array.isArray(repos)).toBeTruthy();
		expect(repos.length).toBeGreaterThan(0);
		// Should include the ss-tools repo
		const hasSsTools = repos.some(r => r.full_name?.includes('ss-tools'));
		expect(hasSsTools).toBeTruthy();
	});
});
// #endregion GitE2E
