import type { Ref } from "./ref"

/**
 * Repository metadata returned from the Prismic REST API V2. This data can be fetched by sending a
 * `GET` a request to a repository's `/api/v2` endpoint.
 *
 * @see More details on the `/api/v2` endpoint: {@link https://prismic.io/docs/api#refs-and-the-entry-api}
 */
export interface Repository {
	/**
	 * A list of refs for the repository.
	 *
	 * @see {@link Ref}
	 */
	refs: Ref[]

	/** An identifier used to query content with the latest integration fields data. */
	integrationFieldsRef: string | null

	/**
	 * A list of languages for the repository.
	 *
	 * @see {@link Language}
	 */
	languages: Language[]

	/** A list of the repository's custom type API IDs mapped to their human-readable name. */
	types: Record<string, string>

	/**
	 * @deprecated Tags are only available in the forms object.
	 * @see More details in the blog post "A change to how the Prismic API handles tags": {@link https://prismic.io/blog/a-change-to-how-the-prismic-api-handles-tags}
	 */
	tags: string[]

	/**
	 * An internally-used list of REST API features for the repository.
	 *
	 * @internal
	 */
	forms: Record<string, Form>

	/** The URL used to begin the OAuth process for the repository. */
	oauth_initiate: string

	/** The token used for the OAuth process for the repository. */
	oauth_token: string

	/** The version of the API. */
	version: string

	/** Licensing information for the repository content. */
	license: string

	/** @deprecated Experiments are no longer part of Prismic. */
	experiments: unknown

	/** @deprecated Bookmarks are not longer part of Prismic. */
	bookmarks: Record<string, string>
}

/** Metadata for a language that has been configured for a repository. */
export interface Language {
	/** A unique identifier for the language. */
	id: string

	/** The name of the language. */
	name: string

	/** Whether or not the language is the default language of the repository. */
	is_master: boolean
}

/**
 * A Prismic REST API V2 feature supported by the repository. It contains metadata about the feature
 * and how to interact with it via the API.
 *
 * @internal
 */
export interface Form {
	method: "GET"
	enctype: string
	action: string
	name?: string
	rel?: string
	fields: Record<string, FormField>
}

/**
 * A field for a feature of the Prismic REST API V2. It contains metadata about the feature's field
 * and how to interact with it via the API.
 *
 * @internal
 */
export interface FormField {
	type: "String" | "Integer"
	multiple: boolean
	default?: string
}
