import { BaseClient } from "./base.client.js";
import type { DocumentNode } from "graphql";
import type { ClientConfig, FindManyArgs, FindUniqueArgs, Operation, CreateArgs, UpdateArgs, DeleteArgs, FieldSelection, QueryOptions } from "./types.js";
export type SelectableField = {
    [key: string]: boolean | SelectableField;
};
export type EntityConfig = {
    fields: readonly string[];
    relations: {
        [key: string]: {
            fields?: readonly string[];
            defaultInclude?: boolean;
        };
    };
};
/**
 * Base class for entity-specific clients with CRUD operations
 * @template TEntity - The entity type (e.g., User, Post)
 * @template TInsertInput - The input type for create operations
 * @template TSetInput - The input type for update operations
 * @template TWhereInput - The variables type for operations
 */
export declare abstract class EntityClient<TEntity, TInsertInput, TSetInput, // Input type for update operations (e.g., UserUpdateInput)
TWhereInput> extends BaseClient {
    protected entityName: string;
    protected config: EntityConfig;
    constructor(config: ClientConfig, entityName: string, entityConfig: EntityConfig);
    protected buildFieldSelection(selection?: FieldSelection<TEntity>): string;
    /**
     * Find multiple entities matching the given criteria
     */
    findMany(args?: FindManyArgs<TEntity>): Promise<TEntity[]>;
    findUnique(args: FindUniqueArgs<TEntity>): Promise<TEntity | null>;
    /**
     * Find a unique entity by its identifier
     */
    /**
     * Create a new entity
     */
    create(args: CreateArgs<TInsertInput, TEntity>): Promise<TEntity>;
    /**
     * Update an existing entity
     */
    update(args: UpdateArgs<TSetInput, TWhereInput>): Promise<TEntity>;
    /**
     * Delete an entity
     */
    delete(args: DeleteArgs<TEntity, TWhereInput>): Promise<TEntity>;
    protected executeOperation<T>(operation: Operation, args: TWhereInput & QueryOptions): Promise<T>;
    protected getOperationDocument(operationKey: string, selection: string): DocumentNode;
    protected abstract getFindManyDocument(selection: string): DocumentNode;
    protected abstract getFindUniqueDocument(selection: string): DocumentNode;
    protected abstract getCreateDocument(selection: string): DocumentNode;
    protected abstract getUpdateDocument(selection: string): DocumentNode;
    protected abstract getDeleteDocument(selection: string): DocumentNode;
    /**
     * Get the response key for a given operation
     */
    protected getResponseKey(operation: string): string;
}
