import {IRawGrammar} from 'vscode-textmate';
import {type Overwrite} from './util.mts';

// vscode-textmate doesn't expose anything else so fine we'll do it ourselves

type AllOptionalWritable<T> = { -readonly [K in keyof T]?: T[K] };
type RemoveLocation<T> = Omit<T, '$vscodeTextmateLocation'>;

type Cleanup<T, Overrides = unknown> = AllOptionalWritable<
	RemoveLocation<Overwrite<T, Overrides>>
>;

type IRawRepository = IRawGrammar['repository'];
type IRawRule = IRawRepository[string];
type IRawCaptures = NonNullable<IRawRule['captures']>;

export type Captures = Cleanup<IRawCaptures>;
export type Rule = Cleanup<IRawRule, {
	captures: Captures;
	beginCaptures: Captures;
	endCaptures: Captures;
	whileCaptures: Captures;
	repository: Repository;
}>;
export type Repository = Cleanup<IRawRepository, {
	[name: string]: Rule;
	$self: Rule;
	$base: Rule;
}>;
export type Grammar = Cleanup<IRawGrammar, {
	repository: Repository;
	patterns: Rule[];
	injections: {
		[expression: string]: Rule;
	};
}>;