/**
 * Extract Test Workflows from the test-fixtures zip.
 *
 * test-fixtures/real-workflows/public_published_templates.zip → test-fixtures/real-workflows/
 *
 * Runs automatically via Jest's globalSetup (see scripts/jest-global-setup.ts).
 *
 * Usage:
 *   npx tsx scripts/extract-workflows.ts
 */

import * as fs from 'fs';
import * as path from 'path';
import AdmZip from 'adm-zip';

const FIXTURES_DIR = path.resolve(__dirname, '../test-fixtures/real-workflows');
const FIXTURES_ZIP = path.join(FIXTURES_DIR, 'public_published_templates.zip');

function extractZip(zipPath: string, outputDir: string, label: string) {
	if (!fs.existsSync(zipPath)) {
		console.log(`No ${label} zip found at ${zipPath}, skipping extraction`);
		return;
	}

	fs.mkdirSync(outputDir, { recursive: true });

	const existingFiles = fs.readdirSync(outputDir).filter((f) => f.endsWith('.json'));
	if (existingFiles.length > 0) {
		console.log(`Found ${existingFiles.length} ${label} files, skipping extraction`);
		return;
	}

	console.log(`Extracting ${label} from zip...`);
	const zip = new AdmZip(zipPath);
	const entries = zip.getEntries();
	const resolvedOutputDir = path.resolve(outputDir);

	let count = 0;
	for (const entry of entries) {
		if (!entry.entryName.endsWith('.json')) continue;
		const outputPath = path.resolve(outputDir, entry.entryName);
		if (outputPath !== resolvedOutputDir && !outputPath.startsWith(resolvedOutputDir + path.sep)) {
			console.warn(`Skipping out-of-bounds entry: ${entry.entryName}`);
			continue;
		}
		fs.writeFileSync(outputPath, entry.getData());
		count++;
	}

	console.log(`Extracted ${count} ${label} files`);
}

export function extractAllWorkflows() {
	extractZip(FIXTURES_ZIP, FIXTURES_DIR, 'test-fixtures workflows');
}

if (require.main === module) {
	extractAllWorkflows();
}
