import { BaseSchema, Model, SchemaOptions } from "papr";
import { Db, IndexDescription } from "mongodb";

//#region src/types.d.ts
type PaprSchemaTuple = readonly [BaseSchema, unknown];
type PaprDocument<TSchema extends PaprSchemaTuple> = TSchema[0];
type PaprSchemaDefinition<TSchema extends PaprSchemaTuple> = Extract<TSchema[1], SchemaOptions<PaprDocument<TSchema>>>;
type PaprModel<TSchema extends PaprSchemaTuple> = Model<PaprDocument<TSchema>, PaprSchemaDefinition<TSchema>>;
/**
 * Main interface for the fastify-papr plugin
 * Contains all registered models and their connections
 */
type FastifyPaprModel = Model<any, any>;
type FastifyPaprConnection = Record<string, FastifyPaprModel>;
interface FastifyPapr {
  [key: string]: FastifyPaprModel | FastifyPaprConnection | undefined;
}
/**
 * Represents a model registration with its schema and optional indexes
 */
type ModelRegistration = {
  /** Collection name in MongoDB */name: string; /** Schema definition pair (schema and options) */
  schema: [BaseSchema, SchemaOptions<Partial<BaseSchema>>]; /** Optional MongoDB indexes to create */
  indexes?: IndexDescription[];
};
/**
 * Maps model registrations to FastifyPapr property names
 */
type ModelRegistrationPair<TKey extends string = string> = Record<TKey, ModelRegistration>;
/**
 * Configuration options for the fastify-papr plugin
 */
type FastifyPaprOptions = {
  /** Optional name for multiple database support */name?: string; /** MongoDB database instance */
  db: Db; /** Models to register */
  models: ModelRegistrationPair; /** Whether to skip schema validation reconciliation */
  disableSchemaReconciliation?: boolean;
};
//#endregion
export { FastifyPapr, FastifyPaprConnection, FastifyPaprModel, FastifyPaprOptions, ModelRegistration, ModelRegistrationPair, PaprDocument, PaprModel, PaprSchemaDefinition, PaprSchemaTuple };
//# sourceMappingURL=types.d.ts.map