import type { CustomTypeModelField } from "./types"

/**
 * A Prismic custom type model.
 *
 * @typeParam ID - API ID of the custom type.
 * @typeParam Definition - The custom type's tabs and their fields.
 */
export interface CustomTypeModel<
	ID extends string = string,
	Definition extends CustomTypeModelDefinition = CustomTypeModelDefinition,
> {
	/** The ID of the custom type model. */
	id: ID

	/** The human readable name of the custom type model. */
	// TODO: Revert to `label?: string | null` if `label` can be partial in: https://github.com/prismicio/prismic-types-internal/blob/HEAD/src/customtypes/CustomType.ts#L39
	label: string | null | undefined

	/**
	 * The format of the custom type model.
	 *
	 * Fallback to "custom" if undefined.
	 */
	format?: "page" | "custom"

	/** Determines if more than one document for the custom type can be created. */
	repeatable: boolean

	/** The custom type model definition. */
	json: Definition

	/** Determines if new documents for the custom type can be created. */
	status: boolean
}

/**
 * A Prismic custom type's tabs and their fields.
 *
 * @typeParam TabName - Names of custom type tabs.
 */
export type CustomTypeModelDefinition<TabName extends string = string> = Record<
	TabName,
	CustomTypeModelTab
>

/**
 * A custom type's tab. Each tab can contain any number of fields but is limited to one Slice Zone.
 *
 * @typeParam FieldName - API IDs of the fields.
 */
export type CustomTypeModelTab<
	Fields extends Record<string, CustomTypeModelField> = Record<string, CustomTypeModelField>,
> = Fields
