import {describe, expect, test} from 'bun:test';
import type {LogLevel} from '@remotion/renderer';
import {RenderInternals} from '@remotion/renderer';
import {BrowserSafeApis} from '@remotion/renderer/client';

const {logLevelOption} = BrowserSafeApis.options;

describe('test loglevel getter and setter', () => {
	test('default log level', () => {
		expect(logLevelOption.getValue({commandLine: {}}).value).toEqual('info');
	});
	test.each<LogLevel>(['verbose', 'warn', 'error', 'info'])(
		'test for %s',
		(loglevel: LogLevel) => {
			logLevelOption.setConfig(loglevel);

			expect(logLevelOption.getValue({commandLine: {}}).value).toEqual(
				loglevel,
			);
		},
	);
});

describe('loglevel comparison', () => {
	test.each<[LogLevel, LogLevel]>([
		['verbose', 'verbose'],
		['verbose', 'info'],
		['verbose', 'warn'],
		['verbose', 'error'],
		['info', 'info'],
		['info', 'warn'],
		['info', 'error'],
		['warn', 'warn'],
		['warn', 'error'],
		['error', 'error'],
	])('%s is equal or below %s', (level1: LogLevel, level2: LogLevel) => {
		logLevelOption.setConfig(level1);
		expect(
			RenderInternals.isEqualOrBelowLogLevel(
				logLevelOption.getValue({commandLine: {}}).value,
				level2,
			),
		).toEqual(true);
	});

	test.each<[LogLevel, LogLevel]>([
		['info', 'verbose'],
		['warn', 'verbose'],
		['error', 'verbose'],
		['warn', 'info'],
		['error', 'info'],
		['error', 'warn'],
	])('%s is not equal or below %s', (level1: LogLevel, level2: LogLevel) => {
		logLevelOption.setConfig(level1);
		expect(
			RenderInternals.isEqualOrBelowLogLevel(
				logLevelOption.getValue({commandLine: {}}).value,
				level2,
			),
		).toEqual(false);
	});
});
