import type { Accountability, SchemaOverview, Query } from "@directus/shared/types";
import type { Knex } from "knex";
import type { UnionToIntersection } from "../../utils/types.js";
import type SystemModels from "../../models/SystemModels.js";
import Models from "../../models/index.js";
/**
 * Action Hook callback context
 */
export interface ActionHookContext {
    /** Current database transaction */
    database: Knex;
    /** The current API schema in use */
    schema: SchemaOverview;
    /** Information about the current user */
    accountability: Accountability;
}
export type ActionHookHandlerBase<TName extends string = string, TMeta = unknown> = (name: TName, callback: (meta: TMeta, ctx: ActionHookContext) => Promise<void>) => void;
export type ServerStartActionHookHandler = ActionHookHandlerBase<"server.start", {
    server: unknown;
}>;
export type ServerStopActionHookHandler = ActionHookHandlerBase<"server.stop", {
    server: unknown;
}>;
export type ResponseActionHookHandler = ActionHookHandlerBase<"response", {
    request: unknown;
    response: unknown;
    ip: unknown;
    duration: unknown;
    finished: unknown;
}>;
export type AuthLoginActionHookHandler = ActionHookHandlerBase<"auth.login", {
    payload: unknown;
    status: unknown;
    user: unknown;
    provider: unknown;
}>;
export type FilesUploadActionHookHandler = ActionHookHandlerBase<"files.upload", {
    payload: unknown;
    key: unknown;
    collection: string;
}>;
export type AllItemCollectionCrudActionHookHandlers = ActionHookHandlerBase<`items.read`, {
    payload: unknown[];
    query: Query;
    collection: string;
}> & ActionHookHandlerBase<`items.create`, {
    payload: unknown;
    key: string | number;
    collection: string;
}> & ActionHookHandlerBase<`items.update`, {
    payload: unknown;
    keys: (string | number)[];
    collection: string;
}> & ActionHookHandlerBase<`items.delete`, {
    keys: (string | number)[];
    collection: string;
}> & ActionHookHandlerBase<`items.sort`, {
    collection: string;
    item: unknown;
    to: unknown;
}>;
export type ItemCollectionCrudActionHookHandler<TName extends string, TPayload> = ActionHookHandlerBase<`${TName}.items.read`, {
    payload: TPayload[];
    query: Query;
    collection: string;
}> & ActionHookHandlerBase<`${TName}.items.create`, {
    payload: TPayload;
    key: string | number;
    collection: string;
}> & ActionHookHandlerBase<`${TName}.items.update`, {
    payload: TPayload;
    keys: (string | number)[];
    collection: string;
}> & ActionHookHandlerBase<`${TName}.items.delete`, {
    keys: (string | number)[];
    collection: string;
}> & ActionHookHandlerBase<`${TName}.items.sort`, {
    collection: string;
    item: unknown;
    to: unknown;
}>;
export type SystemCollectionCrudActionHookHandler<TName extends string, TPayload> = ActionHookHandlerBase<`${TName}.create`, {
    payload: TPayload;
    key: string | number;
    collection: string;
}> & ActionHookHandlerBase<`${TName}.update`, {
    payload: TPayload;
    keys: (string | number)[];
    collection: string;
}> & ActionHookHandlerBase<`${TName}.delete`, {
    keys: (string | number)[];
    collection: string;
}>;
type ItemCollectionActionHookHandlerModels<TModels> = {
    [key in Extract<keyof TModels, string>]: ItemCollectionCrudActionHookHandler<key, TModels[key]>;
};
type AllItemCollectionActionHookHandlerModels<TModels> = ItemCollectionActionHookHandlerModels<TModels>[keyof ItemCollectionActionHookHandlerModels<TModels>];
export type ItemCollectionCrudActionHookHandlers<TModels> = UnionToIntersection<AllItemCollectionActionHookHandlerModels<TModels>>;
export type ItemCollectionActionHookHandlers<TModels> = AllItemCollectionCrudActionHookHandlers & ItemCollectionCrudActionHookHandlers<TModels>;
type SystemCollectionActionHookHandlerModels<TModels> = {
    [key in Extract<keyof TModels, string>]: SystemCollectionCrudActionHookHandler<key, TModels[key]>;
};
type AllSystemCollectionActionHookHandlerModels<TModels> = SystemCollectionActionHookHandlerModels<TModels>[keyof SystemCollectionActionHookHandlerModels<TModels>];
export type SystemCollectionActionHookHandlers<TModels> = UnionToIntersection<AllSystemCollectionActionHookHandlerModels<TModels>>;
type ActionHookHandler<TModels extends Models = Models> = ServerStartActionHookHandler & ServerStopActionHookHandler & ResponseActionHookHandler & AuthLoginActionHookHandler & FilesUploadActionHookHandler & ItemCollectionActionHookHandlers<TModels> & SystemCollectionActionHookHandlers<SystemModels> & ActionHookHandlerBase;
export default ActionHookHandler;
