import * as type_fest_source_is_literal from 'type-fest/source/is-literal';
import { Faker } from '@faker-js/faker';
import { InferSchemaValues } from '@sanity-typed/types';
import { DefinitionBase, ArrayMemberDefinition, FieldDefinition, TypeDefinition, ConfigBase } from '@sanity-typed/types/src/internal';

type Negate<T> = T extends true ? false : true;
type IsPlainObject<T> = T extends any[] ? false : T extends object ? true : false;
type MaybeArray<T> = T | T[];

type SchemaTypeDefinition<TType extends string, TNumberValue extends number, TStringValue extends string, TReferenced extends string, TReferenceWeak extends boolean, TBlockStyle extends string, TBlockListItem extends string, TBlockMarkDecorator extends string, TBlockMarkAnnotation extends DefinitionBase<any, any, any> & {
    name?: string;
}, THotspot extends boolean> = ArrayMemberDefinition<TType, any, any, any, TNumberValue, TStringValue, TReferenced, TReferenceWeak, TBlockStyle, TBlockListItem, TBlockMarkDecorator, TBlockMarkAnnotation, THotspot, any, any, any> | FieldDefinition<TType, any, any, any, TNumberValue, TStringValue, TReferenced, TReferenceWeak, TBlockStyle, TBlockListItem, TBlockMarkDecorator, TBlockMarkAnnotation, THotspot, any, any, any> | TypeDefinition<TType, any, any, any, TNumberValue, TStringValue, TReferenced, TReferenceWeak, TBlockStyle, TBlockListItem, TBlockMarkDecorator, TBlockMarkAnnotation, THotspot, any, any>;
type FakerOptions = ConstructorParameters<typeof Faker>[0];
declare const instantiateFaker: (options: FakerOptions, seed: number) => (path: string) => <Fn extends (faker: Faker, index: number) => any>(fn: Fn) => (index: number) => ReturnType<Fn>;
declare const instantiateFakerT: <Fn extends (faker: Faker, index: number) => any>(options: FakerOptions, seed: number, path: string, fn: Fn) => (index: number) => ReturnType<Fn>;
declare const addTypeT: <const Type extends string | undefined, Fn extends (...args: any[]) => any>(type: Type, fn: Fn) => (...args: Parameters<Fn>) => Negate<type_fest_source_is_literal.LiteralCheck<Type, string>> extends infer T ? T extends Negate<type_fest_source_is_literal.LiteralCheck<Type, string>> ? T extends true ? ReturnType<Fn> : IsPlainObject<ReturnType<Fn>> extends infer T_1 ? T_1 extends IsPlainObject<ReturnType<Fn>> ? T_1 extends true ? Omit<ReturnType<Fn>, "_type"> & {
    _type: Type;
} : ReturnType<Fn> : never : never : never : never;
type SchemaTypeToFaker<TSchemaType extends SchemaTypeDefinition<any, any, any, any, any, any, any, any, any, any>, TAliasedFakers extends {
    [name: string]: (index: number) => any;
}> = ReturnType<typeof instantiateFakerT<TSchemaType["type"] extends keyof typeof constantFakers ? (typeof constantFakers)[TSchemaType["type"]] : TSchemaType["type"] extends "date" ? ReturnType<typeof dateFaker<Extract<TSchemaType, SchemaTypeDefinition<"date", any, any, any, any, any, any, any, any, any>>>> : TSchemaType["type"] extends "datetime" ? ReturnType<typeof datetimeFaker<Extract<TSchemaType, SchemaTypeDefinition<"datetime", any, any, any, any, any, any, any, any, any>>>> : TSchemaType["type"] extends "number" ? ReturnType<typeof numberFaker<Extract<TSchemaType, SchemaTypeDefinition<"number", any, any, any, any, any, any, any, any, any>>>> : TSchemaType["type"] extends "reference" ? ReturnType<typeof referenceFaker<Extract<TSchemaType, SchemaTypeDefinition<"reference", any, any, any, any, any, any, any, any, any>>>> : TSchemaType["type"] extends "string" ? ReturnType<typeof stringFaker<Extract<TSchemaType, SchemaTypeDefinition<"string", any, any, any, any, any, any, any, any, any>>>> : TSchemaType["type"] extends "text" ? ReturnType<typeof textFaker<Extract<TSchemaType, SchemaTypeDefinition<"text", any, any, any, any, any, any, any, any, any>>>> : TSchemaType["type"] extends "url" ? ReturnType<typeof urlFaker<Extract<TSchemaType, SchemaTypeDefinition<"url", any, any, any, any, any, any, any, any, any>>>> : TSchemaType["type"] extends "array" ? ReturnType<typeof arrayFaker<Extract<TSchemaType, SchemaTypeDefinition<"array", any, any, any, any, any, any, any, any, any>>, TAliasedFakers>> : TSchemaType["type"] extends "block" ? ReturnType<typeof blockFaker<Extract<TSchemaType, SchemaTypeDefinition<"block", any, any, any, any, any, any, any, any, any>>, TAliasedFakers>> : TSchemaType["type"] extends "object" ? ReturnType<typeof objectFaker<Extract<TSchemaType, SchemaTypeDefinition<"object", any, any, any, any, any, any, any, any, any>>, TAliasedFakers>> : TSchemaType["type"] extends "document" ? ReturnType<typeof documentFaker<Extract<TSchemaType, SchemaTypeDefinition<"document", any, any, any, any, any, any, any, any, any>>, TAliasedFakers>> : TSchemaType["type"] extends "file" ? ReturnType<typeof fileFaker<Extract<TSchemaType, SchemaTypeDefinition<"file", any, any, any, any, any, any, any, any, any>>, TAliasedFakers>> : TSchemaType["type"] extends "image" ? ReturnType<typeof imageFaker<Extract<TSchemaType, SchemaTypeDefinition<"image", any, any, any, any, any, any, any, any, any>>, TAliasedFakers>> : ReturnType<typeof aliasFaker<TSchemaType, TAliasedFakers>>>>;
declare const customFaker: <TSchemaType extends SchemaTypeDefinition<any, any, any, any, any, any, any, any, any, any>>(schemaType: TSchemaType, fakerFn: (faker: Faker, previous: ReturnType<SchemaTypeToFaker<TSchemaType, {
    [name: string]: (index: number) => any;
}>>, index: number) => ReturnType<SchemaTypeToFaker<TSchemaType, {
    [name: string]: (index: number) => any;
}>>) => TSchemaType;
declare const implicitDocumentFakers: (instantiateFakerByPath: ReturnType<typeof instantiateFaker>, documentIdFaker: (type: string | undefined) => (index: number) => string) => {
    "sanity.fileAsset": (index: number) => {
        _type: "sanity.fileAsset";
        metadata: {
            [key: string]: unknown;
        };
        _createdAt: string;
        _id: string;
        _rev: string;
        _updatedAt: string;
        source?: {
            url?: string | undefined;
            id: string;
            name: string;
        } | undefined;
        title?: string | undefined;
        originalFilename?: string | undefined;
        label?: string | undefined;
        description?: string | undefined;
        creditLine?: string | undefined;
        extension: string;
        mimeType: string;
        path: string;
        assetId: string;
        sha1hash: string;
        size: number;
        url: string;
    };
    "sanity.imageAsset": (index: number) => {
        _type: "sanity.imageAsset";
        url: string;
        metadata: {
            palette?: {
                vibrant?: {
                    title?: string | undefined;
                    _type: "sanity.imagePaletteSwatch";
                    background: string;
                    foreground: string;
                    population: number;
                } | undefined;
                muted?: {
                    title?: string | undefined;
                    _type: "sanity.imagePaletteSwatch";
                    background: string;
                    foreground: string;
                    population: number;
                } | undefined;
                lightVibrant?: {
                    title?: string | undefined;
                    _type: "sanity.imagePaletteSwatch";
                    background: string;
                    foreground: string;
                    population: number;
                } | undefined;
                lightMuted?: {
                    title?: string | undefined;
                    _type: "sanity.imagePaletteSwatch";
                    background: string;
                    foreground: string;
                    population: number;
                } | undefined;
                dominant?: {
                    title?: string | undefined;
                    _type: "sanity.imagePaletteSwatch";
                    background: string;
                    foreground: string;
                    population: number;
                } | undefined;
                darkVibrant?: {
                    title?: string | undefined;
                    _type: "sanity.imagePaletteSwatch";
                    background: string;
                    foreground: string;
                    population: number;
                } | undefined;
                darkMuted?: {
                    title?: string | undefined;
                    _type: "sanity.imagePaletteSwatch";
                    background: string;
                    foreground: string;
                    population: number;
                } | undefined;
                _type: "sanity.imagePalette";
            } | undefined;
            lqip?: string | undefined;
            location?: {
                alt?: number | undefined;
                _type: "geopoint";
                lat: number;
                lng: number;
            } | undefined;
            exif?: ({
                _type: "sanity.imageExifMetadata";
            } & {
                [key: string]: unknown;
            }) | undefined;
            blurHash?: string | undefined;
            _type: "sanity.imageMetadata";
            hasAlpha: boolean;
            isOpaque: boolean;
            dimensions: {
                height: number;
                width: number;
                _type: "sanity.imageDimensions";
                aspectRatio: number;
            };
        } & {
            [key: string]: unknown;
        };
        _createdAt: string;
        _id: string;
        _rev: string;
        _updatedAt: string;
        source?: {
            url?: string | undefined;
            id: string;
            name: string;
        } | undefined;
        title?: string | undefined;
        originalFilename?: string | undefined;
        label?: string | undefined;
        description?: string | undefined;
        creditLine?: string | undefined;
        extension: string;
        mimeType: string;
        path: string;
        assetId: string;
        sha1hash: string;
        size: number;
    };
};
type SanityConfigFakers<TConfig extends MaybeArray<ConfigBase<any, any>>> = TConfig extends MaybeArray<ConfigBase<infer TTypeDefinition, infer TPluginOptions>> ? ReturnType<typeof implicitDocumentFakers> & {
    [TType in TTypeDefinition as TType["name"]]: ReturnType<typeof addTypeT<TType["name"], SchemaTypeToFaker<TType, SanityConfigFakers<TConfig> & SanityConfigFakers<TPluginOptions>>>>;
} : never;
declare const counter: <Fn extends (index: number) => any>(fn: Fn) => () => ReturnType<Fn>;
declare const sanityConfigToFakerTyped: <const TConfig extends ConfigBase<any, any>>(config: TConfig, { faker, referencedChunkSize, seed, }: {
    faker: FakerOptions;
    referencedChunkSize?: number;
    seed?: number;
}) => { [type in keyof SanityConfigFakers<TConfig>]: ReturnType<typeof counter<SanityConfigFakers<TConfig>[type]>>; };
declare const sanityConfigToFaker: <const TConfig extends ConfigBase<any, any>>(config: TConfig, args_1: {
    faker: FakerOptions;
    referencedChunkSize?: number;
    seed?: number;
}) => { [TType in keyof InferSchemaValues<TConfig>]: () => InferSchemaValues<TConfig>[TType]; };
declare const sanityDocumentsFaker: <const TConfig extends ConfigBase<any, any>, Fakers extends {
    [type: string]: () => any;
}>(config: TConfig, fakers: Fakers, { referencedChunkSize }?: {
    referencedChunkSize?: number;
}) => () => ReturnType<Pick<Fakers, Extract<InferSchemaValues<TConfig>[keyof InferSchemaValues<TConfig>], {
    _createdAt: string;
    _id: string;
    _rev: string;
    _updatedAt: string;
    _type: string;
}>["_type"] & keyof Fakers>[Extract<InferSchemaValues<TConfig>[keyof InferSchemaValues<TConfig>], {
    _createdAt: string;
    _id: string;
    _rev: string;
    _updatedAt: string;
    _type: string;
}>["_type"] & keyof Fakers]>[];

export { customFaker, sanityConfigToFaker, sanityConfigToFakerTyped, sanityDocumentsFaker };
