import uniteSets from '../utils/uniteSets.mjs';

/** @type {ReadonlySet<string>} */
export const lengthUnits = new Set([
	// Font-relative length units
	'cap',
	'ch',
	'em',
	'ex',
	'ic',
	'lh',
	'rcap',
	'rch',
	'rem',
	'rex',
	'ric',
	'rlh',
	// Viewport-percentage lengths
	'dvb',
	'dvh',
	'dvi',
	'dvmax',
	'dvmin',
	'dvw',
	'lvb',
	'lvh',
	'lvi',
	'lvmax',
	'lvmin',
	'lvw',
	'svb',
	'svh',
	'svi',
	'svmax',
	'svmin',
	'svw',
	'vb',
	'vh',
	'vi',
	'vw',
	'vmin',
	'vmax',
	'vm',
	// Absolute length units
	'px',
	'mm',
	'cm',
	'in',
	'pt',
	'pc',
	'q',
	'mozmm',
	// Flexible length units
	'fr',
	// Container query units
	'cqw',
	'cqh',
	'cqi',
	'cqb',
	'cqmin',
	'cqmax',
]);

/** @type {ReadonlySet<string>} */
export const resolutionUnits = new Set(['dpi', 'dpcm', 'dppx', 'x']);

/** @type {ReadonlyMap<string, { horizontalInline: string, verticalInline: string }>} */
export const physicalToFlowRelativeUnits = new Map([
	// Viewport units (default)
	['vw', { horizontalInline: 'vi', verticalInline: 'vb' }],
	['vh', { horizontalInline: 'vb', verticalInline: 'vi' }],

	// Viewport units (small)
	['svw', { horizontalInline: 'svi', verticalInline: 'svb' }],
	['svh', { horizontalInline: 'svb', verticalInline: 'svi' }],

	// Viewport units (large)
	['lvw', { horizontalInline: 'lvi', verticalInline: 'lvb' }],
	['lvh', { horizontalInline: 'lvb', verticalInline: 'lvi' }],

	// Viewport units (dynamic)
	['dvw', { horizontalInline: 'dvi', verticalInline: 'dvb' }],
	['dvh', { horizontalInline: 'dvb', verticalInline: 'dvi' }],

	// Container query units
	['cqw', { horizontalInline: 'cqi', verticalInline: 'cqb' }],
	['cqh', { horizontalInline: 'cqb', verticalInline: 'cqi' }],
]);

/** @type {ReadonlySet<string>} */
export const flowRelativeUnits = new Set(
	[...physicalToFlowRelativeUnits.values()].flatMap(Object.values),
);

/** @type {ReadonlySet<string>} */
export const units = uniteSets(lengthUnits, resolutionUnits, [
	// Relative length units
	'%',
	// Time length units
	's',
	'ms',
	// Angle
	'deg',
	'grad',
	'turn',
	'rad',
	// Frequency
	'Hz',
	'kHz',
]);
