export interface ScaleValue {
	token: number | string
	value: number | string
	scale: string
	prefix: string
}

export interface Token<
	/** Token name. */
	NameType extends number | string = string,
	/** Token value. */
	ValueType extends number | string = string,
	/** Token scale. */
	ScaleType extends string | void = void,
	/** Token prefix. */
	PrefixType extends string | void = void,
> extends ScaleValue {
	new (name: NameType, value: ValueType, scale?: ScaleType, prefix?: PrefixType): this

	/** Name of the token. */
	token: NameType

	/** Value of the token. */
	value: ValueType

	/** Category of interface the token applies to. */
	scale: ScaleType extends string ? ScaleType : ''

	/** Prefix added before the serialized custom property. */
	prefix: PrefixType extends string ? PrefixType : ''

	/** Serialized custom property representing the token. */
	variable: `--${this['prefix'] extends '' ? '' : `${this['prefix']}-`}${this['scale'] extends '' ? '' : `${this['scale']}-`}${this['token']}`

	/** Serialized CSS var() representing the token. */
	computedValue: `var(${this['variable']})`

	/** Returns a serialized CSS var() representing the token. */
	toString(): this['computedValue']
}
