import { CreateExpression } from './factories/expression.cjs';
import { BooleanExpression } from './expressions/boolean.cjs';
import { DateExpression } from './expressions/date.cjs';
import { EnumExpression } from './expressions/enum.cjs';
import { NumberExpression } from './expressions/number.cjs';
import { StringExpression } from './expressions/string.cjs';

type UnionBaseItemExpression = StringExpression | NumberExpression | BooleanExpression | DateExpression | EnumExpression | ObjectExpression;
type UnionItemExpression = UnionBaseItemExpression | TupleExpression<UnionBaseItemExpression> | UnionExpression<UnionBaseItemExpression | TupleExpression<UnionBaseItemExpression>>;
type UnionExpression<Item = UnionItemExpression> = readonly [CreateExpression<"union">, ...(readonly Item[])];

type RecordExpression = {
    [k: string]: StringExpression | NumberExpression | BooleanExpression | DateExpression | EnumExpression | TupleExpression | UnionExpression | ObjectExpression;
};
type ObjectExpression = RecordExpression | readonly [CreateExpression<"object">, RecordExpression];

type TupleBaseItemExpression = StringExpression | NumberExpression | BooleanExpression | DateExpression | EnumExpression | ObjectExpression;
type TupleItemExpression = TupleBaseItemExpression | UnionExpression<TupleBaseItemExpression> | TupleExpression<TupleBaseItemExpression | UnionExpression<TupleBaseItemExpression>>;
type TupleExpression<Item = TupleItemExpression> = readonly [CreateExpression<"tuple">, ...(readonly Item[])];

export type { ObjectExpression as O, TupleExpression as T, UnionExpression as U };
